|
@@ -94,7 +94,6 @@
|
|
|
|
|
|
void save_v86_state(struct kernel_vm86_regs *regs, int retval)
|
|
|
{
|
|
|
- struct tss_struct *tss;
|
|
|
struct task_struct *tsk = current;
|
|
|
struct vm86plus_struct __user *user;
|
|
|
struct vm86 *vm86 = current->thread.vm86;
|
|
@@ -146,13 +145,13 @@ void save_v86_state(struct kernel_vm86_regs *regs, int retval)
|
|
|
do_exit(SIGSEGV);
|
|
|
}
|
|
|
|
|
|
- tss = &per_cpu(cpu_tss, get_cpu());
|
|
|
+ preempt_disable();
|
|
|
tsk->thread.sp0 = vm86->saved_sp0;
|
|
|
tsk->thread.sysenter_cs = __KERNEL_CS;
|
|
|
- load_sp0(tss, &tsk->thread);
|
|
|
+ load_sp0(tsk->thread.sp0);
|
|
|
refresh_sysenter_cs(&tsk->thread);
|
|
|
vm86->saved_sp0 = 0;
|
|
|
- put_cpu();
|
|
|
+ preempt_enable();
|
|
|
|
|
|
memcpy(®s->pt, &vm86->regs32, sizeof(struct pt_regs));
|
|
|
|
|
@@ -238,7 +237,6 @@ SYSCALL_DEFINE2(vm86, unsigned long, cmd, unsigned long, arg)
|
|
|
|
|
|
static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus)
|
|
|
{
|
|
|
- struct tss_struct *tss;
|
|
|
struct task_struct *tsk = current;
|
|
|
struct vm86 *vm86 = tsk->thread.vm86;
|
|
|
struct kernel_vm86_regs vm86regs;
|
|
@@ -366,8 +364,8 @@ static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus)
|
|
|
vm86->saved_sp0 = tsk->thread.sp0;
|
|
|
lazy_save_gs(vm86->regs32.gs);
|
|
|
|
|
|
- tss = &per_cpu(cpu_tss, get_cpu());
|
|
|
/* make room for real-mode segments */
|
|
|
+ preempt_disable();
|
|
|
tsk->thread.sp0 += 16;
|
|
|
|
|
|
if (static_cpu_has(X86_FEATURE_SEP)) {
|
|
@@ -375,8 +373,8 @@ static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus)
|
|
|
refresh_sysenter_cs(&tsk->thread);
|
|
|
}
|
|
|
|
|
|
- load_sp0(tss, &tsk->thread);
|
|
|
- put_cpu();
|
|
|
+ load_sp0(tsk->thread.sp0);
|
|
|
+ preempt_enable();
|
|
|
|
|
|
if (vm86->flags & VM86_SCREEN_BITMAP)
|
|
|
mark_screen_rdonly(tsk->mm);
|