Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86, vdso: Clean up 32-bit vs 64-bit vdso params

Rather than using 'vdso_enabled' and an awful #define, just call the
parameters vdso32_enabled and vdso64_enabled.

Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Link: http://lkml.kernel.org/r/87913de56bdcbae3d93917938302fc369b05caee.1399317206.git.luto@amacapital.net
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>

authored by

Andy Lutomirski and committed by
H. Peter Anvin
3d7ee969 73159fdc

+30 -22
+13 -7
arch/x86/include/asm/elf.h
··· 75 75 76 76 #include <asm/vdso.h> 77 77 78 - extern unsigned int vdso_enabled; 78 + #ifdef CONFIG_X86_64 79 + extern unsigned int vdso64_enabled; 80 + #endif 81 + #if defined(CONFIG_X86_32) || defined(CONFIG_COMPAT) 82 + extern unsigned int vdso32_enabled; 83 + #endif 79 84 80 85 /* 81 86 * This is used to ensure we don't load something for the wrong architecture. ··· 274 269 275 270 struct task_struct; 276 271 277 - #define ARCH_DLINFO_IA32(vdso_enabled) \ 272 + #define ARCH_DLINFO_IA32 \ 278 273 do { \ 279 - if (vdso_enabled) { \ 274 + if (vdso32_enabled) { \ 280 275 NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \ 281 276 NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \ 282 277 } \ ··· 286 281 287 282 #define STACK_RND_MASK (0x7ff) 288 283 289 - #define ARCH_DLINFO ARCH_DLINFO_IA32(vdso_enabled) 284 + #define ARCH_DLINFO ARCH_DLINFO_IA32 290 285 291 286 /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */ 292 287 ··· 297 292 298 293 #define ARCH_DLINFO \ 299 294 do { \ 300 - if (vdso_enabled) \ 295 + if (vdso64_enabled) \ 301 296 NEW_AUX_ENT(AT_SYSINFO_EHDR, \ 302 297 (unsigned long)current->mm->context.vdso); \ 303 298 } while (0) 304 299 300 + /* As a historical oddity, the x32 and x86_64 vDSOs are controlled together. */ 305 301 #define ARCH_DLINFO_X32 \ 306 302 do { \ 307 - if (vdso_enabled) \ 303 + if (vdso64_enabled) \ 308 304 NEW_AUX_ENT(AT_SYSINFO_EHDR, \ 309 305 (unsigned long)current->mm->context.vdso); \ 310 306 } while (0) ··· 316 310 if (test_thread_flag(TIF_X32)) \ 317 311 ARCH_DLINFO_X32; \ 318 312 else \ 319 - ARCH_DLINFO_IA32(sysctl_vsyscall32) 313 + ARCH_DLINFO_IA32 320 314 321 315 #define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) 322 316
+1 -1
arch/x86/um/vdso/vma.c
··· 12 12 #include <asm/page.h> 13 13 #include <linux/init.h> 14 14 15 - unsigned int __read_mostly vdso_enabled = 1; 15 + static unsigned int __read_mostly vdso_enabled = 1; 16 16 unsigned long um_vdso_addr; 17 17 18 18 extern unsigned long task_size;
+8 -11
arch/x86/vdso/vdso32-setup.c
··· 37 37 #endif 38 38 39 39 #ifdef CONFIG_X86_64 40 - #define vdso_enabled sysctl_vsyscall32 41 40 #define arch_setup_additional_pages syscall32_setup_pages 42 41 #endif 43 42 ··· 44 45 * Should the kernel map a VDSO page into processes and pass its 45 46 * address down to glibc upon exec()? 46 47 */ 47 - unsigned int __read_mostly vdso_enabled = VDSO_DEFAULT; 48 + unsigned int __read_mostly vdso32_enabled = VDSO_DEFAULT; 48 49 49 - static int __init vdso_setup(char *s) 50 + static int __init vdso32_setup(char *s) 50 51 { 51 - vdso_enabled = simple_strtoul(s, NULL, 0); 52 + vdso32_enabled = simple_strtoul(s, NULL, 0); 52 53 53 - if (vdso_enabled > 1) 54 + if (vdso32_enabled > 1) 54 55 pr_warn("vdso32 values other than 0 and 1 are no longer allowed; vdso disabled\n"); 55 56 56 57 return 1; ··· 61 62 * behavior on both 64-bit and 32-bit kernels. 62 63 * On 32-bit kernels, vdso=[012] means the same thing. 63 64 */ 64 - __setup("vdso32=", vdso_setup); 65 + __setup("vdso32=", vdso32_setup); 65 66 66 67 #ifdef CONFIG_X86_32 67 - __setup_param("vdso=", vdso32_setup, vdso_setup, 0); 68 - 69 - EXPORT_SYMBOL_GPL(vdso_enabled); 68 + __setup_param("vdso=", vdso_setup, vdso32_setup, 0); 70 69 #endif 71 70 72 71 static struct page **vdso32_pages; ··· 157 160 return x32_setup_additional_pages(bprm, uses_interp); 158 161 #endif 159 162 160 - if (vdso_enabled != 1) /* Other values all mean "disabled" */ 163 + if (vdso32_enabled != 1) /* Other values all mean "disabled" */ 161 164 return 0; 162 165 163 166 down_write(&mm->mmap_sem); ··· 241 244 static struct ctl_table abi_table2[] = { 242 245 { 243 246 .procname = "vsyscall32", 244 - .data = &sysctl_vsyscall32, 247 + .data = &vdso32_enabled, 245 248 .maxlen = sizeof(int), 246 249 .mode = 0644, 247 250 .proc_handler = proc_dointvec
+3 -3
arch/x86/vdso/vma.c
··· 17 17 #include <asm/page.h> 18 18 19 19 #if defined(CONFIG_X86_64) 20 - unsigned int __read_mostly vdso_enabled = 1; 20 + unsigned int __read_mostly vdso64_enabled = 1; 21 21 22 22 DECLARE_VDSO_IMAGE(vdso); 23 23 extern unsigned short vdso_sync_cpuid; ··· 160 160 unsigned long addr; 161 161 int ret; 162 162 163 - if (!vdso_enabled) 163 + if (!vdso64_enabled) 164 164 return 0; 165 165 166 166 down_write(&mm->mmap_sem); ··· 203 203 204 204 static __init int vdso_setup(char *s) 205 205 { 206 - vdso_enabled = simple_strtoul(s, NULL, 0); 206 + vdso64_enabled = simple_strtoul(s, NULL, 0); 207 207 return 0; 208 208 } 209 209 __setup("vdso=", vdso_setup);
+5
kernel/sysctl.c
··· 1418 1418 (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL)) 1419 1419 { 1420 1420 .procname = "vdso_enabled", 1421 + #ifdef CONFIG_X86_32 1422 + .data = &vdso32_enabled, 1423 + .maxlen = sizeof(vdso32_enabled), 1424 + #else 1421 1425 .data = &vdso_enabled, 1422 1426 .maxlen = sizeof(vdso_enabled), 1427 + #endif 1423 1428 .mode = 0644, 1424 1429 .proc_handler = proc_dointvec, 1425 1430 .extra1 = &zero,