Index: x86/conf/files.x86
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/conf/files.x86,v
retrieving revision 1.79
diff -u -p -r1.79 files.x86
--- x86/conf/files.x86 29 Aug 2012 17:13:21 -0000 1.79
+++ x86/conf/files.x86 12 Sep 2012 22:23:15 -0000
@@ -16,6 +16,9 @@ defflag opt_pcifixup.h PCI_ADDR_FIXUP PC
# To be able to test for NetBSD/xen in shared files
defflag opt_xen.h DO_NOT_DEFINE
+# XXX: uwe: move TSS to its own page
+defflag opt_vbox_tss_kludge.h VBOX_TSS_KLUDGE
+
define cpubus { [apid = -1] }
define cpufeaturebus {}
define ioapicbus { [apid = -1] }
Index: x86/include/cpu.h
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/include/cpu.h,v
retrieving revision 1.52
diff -u -p -r1.52 cpu.h
--- x86/include/cpu.h 15 Jul 2012 15:17:56 -0000 1.52
+++ x86/include/cpu.h 12 Sep 2012 22:23:15 -0000
@@ -46,6 +46,9 @@
#if defined(_KERNEL) || defined(_KMEMUSER)
#if defined(_KERNEL_OPT)
#include "opt_xen.h"
+#if !defined(XEN)
+#include "opt_vbox_tss_kludge.h"
+#endif
#ifdef i386
#include "opt_user_ldt.h"
#include "opt_vm86.h"
@@ -209,8 +212,10 @@ struct cpu_info {
device_t ci_temperature; /* Intel coretemp(4) or equivalent */
device_t ci_vm; /* Virtual machine guest driver */
+#if !defined(VBOX_TSS_KLUDGE) /* XXX: uwe: moved to the end onto a page of its own */
struct i386tss ci_tss; /* Per-cpu TSS; shared among LWPs */
char ci_iomap[IOMAPSIZE]; /* I/O Bitmap */
+#endif
int ci_tss_sel; /* TSS selector of this cpu */
/*
@@ -238,6 +243,11 @@ struct cpu_info {
/* The following must be in a single cache line. */
int ci_want_resched __aligned(64);
int ci_padout __aligned(64);
+
+#if defined(VBOX_TSS_KLUDGE) /* XXX: uwe: moved to the end onto a page of its own */
+ struct i386tss ci_tss __aligned(4096); /* Per-cpu TSS; shared among LWPs */
+ char ci_iomap[IOMAPSIZE]; /* I/O Bitmap */
+#endif
};
/*
Index: x86/x86/patch.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/patch.c,v
retrieving revision 1.21
diff -u -p -r1.21 patch.c
--- x86/x86/patch.c 18 Apr 2010 23:47:51 -0000 1.21
+++ x86/x86/patch.c 12 Sep 2012 22:23:16 -0000
@@ -146,6 +146,12 @@ x86_patch(bool early)
u_long cr0;
int i;
+#if 1 /* XXX: uwe: vbox seems to be very confused by this */
+ volatile int punt = 1;
+ if (punt)
+ return;
+#endif
+
if (early) {
if (first)
return;
Index: i386/i386/spl.S
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/i386/spl.S,v
retrieving revision 1.37
diff -u -p -r1.37 spl.S
--- i386/i386/spl.S 15 Jun 2012 14:09:26 -0000 1.37
+++ i386/i386/spl.S 12 Sep 2012 22:23:16 -0000
@@ -180,6 +180,10 @@ IDTVEC(spllower)
#ifndef XEN
CLI(%eax)
#endif
+#if 1 /* XXX: uwe: workaround vbox problem */
+ ## provide padding before the following label for vbox to stomp over
+ .byte 0x0f , 0x1f, 0x40, 0x00 # 4 byte NOP insn
+#endif
.Lspllower_resume:
#ifdef XEN
CLI(%eax)