diff options
Diffstat (limited to 'arch/i386/kernel/vm86.c')
-rw-r--r-- | arch/i386/kernel/vm86.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c index f51c894a7da5..aee14fafd13d 100644 --- a/arch/i386/kernel/vm86.c +++ b/arch/i386/kernel/vm86.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/smp_lock.h> | 43 | #include <linux/smp_lock.h> |
44 | #include <linux/highmem.h> | 44 | #include <linux/highmem.h> |
45 | #include <linux/ptrace.h> | 45 | #include <linux/ptrace.h> |
46 | #include <linux/audit.h> | ||
46 | 47 | ||
47 | #include <asm/uaccess.h> | 48 | #include <asm/uaccess.h> |
48 | #include <asm/io.h> | 49 | #include <asm/io.h> |
@@ -252,6 +253,7 @@ out: | |||
252 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk) | 253 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk) |
253 | { | 254 | { |
254 | struct tss_struct *tss; | 255 | struct tss_struct *tss; |
256 | long eax; | ||
255 | /* | 257 | /* |
256 | * make sure the vm86() system call doesn't try to do anything silly | 258 | * make sure the vm86() system call doesn't try to do anything silly |
257 | */ | 259 | */ |
@@ -305,13 +307,19 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk | |||
305 | tsk->thread.screen_bitmap = info->screen_bitmap; | 307 | tsk->thread.screen_bitmap = info->screen_bitmap; |
306 | if (info->flags & VM86_SCREEN_BITMAP) | 308 | if (info->flags & VM86_SCREEN_BITMAP) |
307 | mark_screen_rdonly(tsk->mm); | 309 | mark_screen_rdonly(tsk->mm); |
310 | __asm__ __volatile__("xorl %eax,%eax; movl %eax,%fs; movl %eax,%gs\n\t"); | ||
311 | __asm__ __volatile__("movl %%eax, %0\n" :"=r"(eax)); | ||
312 | |||
313 | /*call audit_syscall_exit since we do not exit via the normal paths */ | ||
314 | if (unlikely(current->audit_context)) | ||
315 | audit_syscall_exit(current, AUDITSC_RESULT(eax), eax); | ||
316 | |||
308 | __asm__ __volatile__( | 317 | __asm__ __volatile__( |
309 | "xorl %%eax,%%eax; movl %%eax,%%fs; movl %%eax,%%gs\n\t" | ||
310 | "movl %0,%%esp\n\t" | 318 | "movl %0,%%esp\n\t" |
311 | "movl %1,%%ebp\n\t" | 319 | "movl %1,%%ebp\n\t" |
312 | "jmp resume_userspace" | 320 | "jmp resume_userspace" |
313 | : /* no outputs */ | 321 | : /* no outputs */ |
314 | :"r" (&info->regs), "r" (task_thread_info(tsk)) : "ax"); | 322 | :"r" (&info->regs), "r" (task_thread_info(tsk))); |
315 | /* we never return here */ | 323 | /* we never return here */ |
316 | } | 324 | } |
317 | 325 | ||