diff options
-rw-r--r-- | arch/x86/kernel/vsyscall_64.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index 419e83b58436..2d912629c96e 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
@@ -307,6 +307,8 @@ struct vm_area_struct *get_gate_vma(struct mm_struct *mm) | |||
307 | if (!mm || mm->context.ia32_compat) | 307 | if (!mm || mm->context.ia32_compat) |
308 | return NULL; | 308 | return NULL; |
309 | #endif | 309 | #endif |
310 | if (vsyscall_mode == NONE) | ||
311 | return NULL; | ||
310 | return &gate_vma; | 312 | return &gate_vma; |
311 | } | 313 | } |
312 | 314 | ||
@@ -327,7 +329,7 @@ int in_gate_area(struct mm_struct *mm, unsigned long addr) | |||
327 | */ | 329 | */ |
328 | int in_gate_area_no_mm(unsigned long addr) | 330 | int in_gate_area_no_mm(unsigned long addr) |
329 | { | 331 | { |
330 | return (addr & PAGE_MASK) == VSYSCALL_ADDR; | 332 | return vsyscall_mode != NONE && (addr & PAGE_MASK) == VSYSCALL_ADDR; |
331 | } | 333 | } |
332 | 334 | ||
333 | void __init map_vsyscall(void) | 335 | void __init map_vsyscall(void) |
@@ -335,10 +337,12 @@ void __init map_vsyscall(void) | |||
335 | extern char __vsyscall_page; | 337 | extern char __vsyscall_page; |
336 | unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page); | 338 | unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page); |
337 | 339 | ||
338 | __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall, | 340 | if (vsyscall_mode != NONE) |
339 | vsyscall_mode == NATIVE | 341 | __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall, |
340 | ? PAGE_KERNEL_VSYSCALL | 342 | vsyscall_mode == NATIVE |
341 | : PAGE_KERNEL_VVAR); | 343 | ? PAGE_KERNEL_VSYSCALL |
344 | : PAGE_KERNEL_VVAR); | ||
345 | |||
342 | BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) != | 346 | BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) != |
343 | (unsigned long)VSYSCALL_ADDR); | 347 | (unsigned long)VSYSCALL_ADDR); |
344 | } | 348 | } |