diff options
Diffstat (limited to 'arch/x86_64/mm/init.c')
-rw-r--r-- | arch/x86_64/mm/init.c | 26 |
1 files changed, 8 insertions, 18 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index b0d604551d86..dbe53b4c7e66 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -583,9 +583,9 @@ static __init int x8664_sysctl_init(void) | |||
583 | __initcall(x8664_sysctl_init); | 583 | __initcall(x8664_sysctl_init); |
584 | #endif | 584 | #endif |
585 | 585 | ||
586 | /* Pseudo VMAs to allow ptrace access for the vsyscall pages. x86-64 has two | 586 | /* A pseudo VMAs to allow ptrace access for the vsyscall page. This only |
587 | different ones: one for 32bit and one for 64bit. Use the appropiate | 587 | covers the 64bit vsyscall page now. 32bit has a real VMA now and does |
588 | for the target task. */ | 588 | not need special handling anymore. */ |
589 | 589 | ||
590 | static struct vm_area_struct gate_vma = { | 590 | static struct vm_area_struct gate_vma = { |
591 | .vm_start = VSYSCALL_START, | 591 | .vm_start = VSYSCALL_START, |
@@ -593,22 +593,11 @@ static struct vm_area_struct gate_vma = { | |||
593 | .vm_page_prot = PAGE_READONLY | 593 | .vm_page_prot = PAGE_READONLY |
594 | }; | 594 | }; |
595 | 595 | ||
596 | static struct vm_area_struct gate32_vma = { | ||
597 | .vm_start = VSYSCALL32_BASE, | ||
598 | .vm_end = VSYSCALL32_END, | ||
599 | .vm_page_prot = PAGE_READONLY | ||
600 | }; | ||
601 | |||
602 | struct vm_area_struct *get_gate_vma(struct task_struct *tsk) | 596 | struct vm_area_struct *get_gate_vma(struct task_struct *tsk) |
603 | { | 597 | { |
604 | #ifdef CONFIG_IA32_EMULATION | 598 | #ifdef CONFIG_IA32_EMULATION |
605 | if (test_tsk_thread_flag(tsk, TIF_IA32)) { | 599 | if (test_tsk_thread_flag(tsk, TIF_IA32)) |
606 | /* lookup code assumes the pages are present. set them up | 600 | return NULL; |
607 | now */ | ||
608 | if (__map_syscall32(tsk->mm, VSYSCALL32_BASE) < 0) | ||
609 | return NULL; | ||
610 | return &gate32_vma; | ||
611 | } | ||
612 | #endif | 601 | #endif |
613 | return &gate_vma; | 602 | return &gate_vma; |
614 | } | 603 | } |
@@ -616,6 +605,8 @@ struct vm_area_struct *get_gate_vma(struct task_struct *tsk) | |||
616 | int in_gate_area(struct task_struct *task, unsigned long addr) | 605 | int in_gate_area(struct task_struct *task, unsigned long addr) |
617 | { | 606 | { |
618 | struct vm_area_struct *vma = get_gate_vma(task); | 607 | struct vm_area_struct *vma = get_gate_vma(task); |
608 | if (!vma) | ||
609 | return 0; | ||
619 | return (addr >= vma->vm_start) && (addr < vma->vm_end); | 610 | return (addr >= vma->vm_start) && (addr < vma->vm_end); |
620 | } | 611 | } |
621 | 612 | ||
@@ -625,6 +616,5 @@ int in_gate_area(struct task_struct *task, unsigned long addr) | |||
625 | */ | 616 | */ |
626 | int in_gate_area_no_task(unsigned long addr) | 617 | int in_gate_area_no_task(unsigned long addr) |
627 | { | 618 | { |
628 | return (((addr >= VSYSCALL_START) && (addr < VSYSCALL_END)) || | 619 | return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END); |
629 | ((addr >= VSYSCALL32_BASE) && (addr < VSYSCALL32_END))); | ||
630 | } | 620 | } |