С вот таким патчем для arch/i386/kernel/vm86.c тоже все работает (отличие -- добавили #else для случая CONFIG_X86_NO_TSS=y и старые команды для этого случая)
--- arch/i386/kernel/vm86.c.old 2007-06-12 06:05:00.000000000 +0400
+++ arch/i386/kernel/vm86.c 2007-06-12 06:11:17.000000000 +0400
@@ -125,11 +125,15 @@
}
#ifndef CONFIG_X86_NO_TSS
- tss = &per_cpu(init_tss, get_cpu());
+ tss = __get_cpu_tss(get_cpu());
#endif
current->thread.esp0 = current->thread.saved_esp0;
current->thread.sysenter_cs = __KERNEL_CS;
+#ifndef CONFIG_X86_NO_TSS
+ load_virtual_esp0(tss, current);
+#else
load_esp0(tss, ¤t->thread);
+#endif
current->thread.saved_esp0 = 0;
#ifndef CONFIG_X86_NO_TSS
put_cpu();
@@ -305,14 +309,17 @@
savesegment(gs, tsk->thread.saved_gs);
#ifndef CONFIG_X86_NO_TSS
- tss = &per_cpu(init_tss, get_cpu());
+ tss = __get_cpu_tss(get_cpu());
#endif
tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
if (cpu_has_sep)
tsk->thread.sysenter_cs = 0;
- load_esp0(tss, &tsk->thread);
+
#ifndef CONFIG_X86_NO_TSS
+ load_virtual_esp0(tss, tsk);
put_cpu();
+#else
+ load_esp0(tss, &tsk->thread);
#endif
tsk->thread.screen_bitmap = info->screen_bitmap;