diff options
-rw-r--r-- | arch/x86/ia32/ia32entry.S | 7 | ||||
-rw-r--r-- | arch/x86/ia32/syscall32.c | 4 | ||||
-rw-r--r-- | arch/x86/kernel/asm-offsets_64.c | 3 | ||||
-rw-r--r-- | include/asm-x86/thread_info_64.h | 3 |
4 files changed, 13 insertions, 4 deletions
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index df588f0f76e1..2499a324feaa 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <asm/ia32_unistd.h> | 12 | #include <asm/ia32_unistd.h> |
13 | #include <asm/thread_info.h> | 13 | #include <asm/thread_info.h> |
14 | #include <asm/segment.h> | 14 | #include <asm/segment.h> |
15 | #include <asm/vsyscall32.h> | ||
16 | #include <asm/irqflags.h> | 15 | #include <asm/irqflags.h> |
17 | #include <linux/linkage.h> | 16 | #include <linux/linkage.h> |
18 | 17 | ||
@@ -104,7 +103,7 @@ ENTRY(ia32_sysenter_target) | |||
104 | pushfq | 103 | pushfq |
105 | CFI_ADJUST_CFA_OFFSET 8 | 104 | CFI_ADJUST_CFA_OFFSET 8 |
106 | /*CFI_REL_OFFSET rflags,0*/ | 105 | /*CFI_REL_OFFSET rflags,0*/ |
107 | movl $VSYSCALL32_SYSEXIT, %r10d | 106 | movl 8*3-THREAD_SIZE+threadinfo_sysenter_return(%rsp), %r10d |
108 | CFI_REGISTER rip,r10 | 107 | CFI_REGISTER rip,r10 |
109 | pushq $__USER32_CS | 108 | pushq $__USER32_CS |
110 | CFI_ADJUST_CFA_OFFSET 8 | 109 | CFI_ADJUST_CFA_OFFSET 8 |
@@ -142,6 +141,8 @@ sysenter_do_call: | |||
142 | andl $~TS_COMPAT,threadinfo_status(%r10) | 141 | andl $~TS_COMPAT,threadinfo_status(%r10) |
143 | /* clear IF, that popfq doesn't enable interrupts early */ | 142 | /* clear IF, that popfq doesn't enable interrupts early */ |
144 | andl $~0x200,EFLAGS-R11(%rsp) | 143 | andl $~0x200,EFLAGS-R11(%rsp) |
144 | movl RIP-R11(%rsp),%edx /* User %eip */ | ||
145 | CFI_REGISTER rip,rdx | ||
145 | RESTORE_ARGS 1,24,1,1,1,1 | 146 | RESTORE_ARGS 1,24,1,1,1,1 |
146 | popfq | 147 | popfq |
147 | CFI_ADJUST_CFA_OFFSET -8 | 148 | CFI_ADJUST_CFA_OFFSET -8 |
@@ -149,8 +150,6 @@ sysenter_do_call: | |||
149 | popq %rcx /* User %esp */ | 150 | popq %rcx /* User %esp */ |
150 | CFI_ADJUST_CFA_OFFSET -8 | 151 | CFI_ADJUST_CFA_OFFSET -8 |
151 | CFI_REGISTER rsp,rcx | 152 | CFI_REGISTER rsp,rcx |
152 | movl $VSYSCALL32_SYSEXIT,%edx /* User %eip */ | ||
153 | CFI_REGISTER rip,rdx | ||
154 | TRACE_IRQS_ON | 153 | TRACE_IRQS_ON |
155 | swapgs | 154 | swapgs |
156 | sti /* sti only takes effect after the next instruction */ | 155 | sti /* sti only takes effect after the next instruction */ |
diff --git a/arch/x86/ia32/syscall32.c b/arch/x86/ia32/syscall32.c index d751d96c2ef2..98ff99f5b59a 100644 --- a/arch/x86/ia32/syscall32.c +++ b/arch/x86/ia32/syscall32.c | |||
@@ -46,6 +46,10 @@ int syscall32_setup_pages(struct linux_binprm *bprm, int exstack) | |||
46 | VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| | 46 | VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC| |
47 | VM_ALWAYSDUMP, | 47 | VM_ALWAYSDUMP, |
48 | syscall32_pages); | 48 | syscall32_pages); |
49 | if (ret == 0) { | ||
50 | current->mm->context.vdso = (void __user *)VSYSCALL32_BASE; | ||
51 | current_thread_info()->sysenter_return = VSYSCALL32_SYSEXIT; | ||
52 | } | ||
49 | up_write(&mm->mmap_sem); | 53 | up_write(&mm->mmap_sem); |
50 | return ret; | 54 | return ret; |
51 | } | 55 | } |
diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c index 40f41752c1df..c27c646214f4 100644 --- a/arch/x86/kernel/asm-offsets_64.c +++ b/arch/x86/kernel/asm-offsets_64.c | |||
@@ -46,6 +46,9 @@ int main(void) | |||
46 | ENTRY(addr_limit); | 46 | ENTRY(addr_limit); |
47 | ENTRY(preempt_count); | 47 | ENTRY(preempt_count); |
48 | ENTRY(status); | 48 | ENTRY(status); |
49 | #ifdef CONFIG_IA32_EMULATION | ||
50 | ENTRY(sysenter_return); | ||
51 | #endif | ||
49 | BLANK(); | 52 | BLANK(); |
50 | #undef ENTRY | 53 | #undef ENTRY |
51 | #define ENTRY(entry) DEFINE(pda_ ## entry, offsetof(struct x8664_pda, entry)) | 54 | #define ENTRY(entry) DEFINE(pda_ ## entry, offsetof(struct x8664_pda, entry)) |
diff --git a/include/asm-x86/thread_info_64.h b/include/asm-x86/thread_info_64.h index 1ac23c157231..c8e7736fc792 100644 --- a/include/asm-x86/thread_info_64.h +++ b/include/asm-x86/thread_info_64.h | |||
@@ -33,6 +33,9 @@ struct thread_info { | |||
33 | 33 | ||
34 | mm_segment_t addr_limit; | 34 | mm_segment_t addr_limit; |
35 | struct restart_block restart_block; | 35 | struct restart_block restart_block; |
36 | #ifdef CONFIG_IA32_EMULATION | ||
37 | void __user *sysenter_return; | ||
38 | #endif | ||
36 | }; | 39 | }; |
37 | #endif | 40 | #endif |
38 | 41 | ||