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)