Index: /trunk/src/VBox/Runtime/r0drv/solaris/vbi/i86pc/os/vbi.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/vbi/i86pc/os/vbi.c	(revision 37946)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/vbi/i86pc/os/vbi.c	(revision 37947)
@@ -78,5 +78,5 @@
 /* Introduced in v9 */
 static int use_kflt = 0;
-static page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr);
+static page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr, size_t pgsize);
 
 
@@ -161,4 +161,7 @@
 /* kthread_t */
 static int off_s11_t_preempt    = 42;
+
+/* 64-bit Solaris 11 snv_166+ offsets (CR 7037143) */
+static int off_s11_t_preempt_new = 48;
 #else
 /* 32-bit Solaris 10 offsets */
@@ -280,4 +283,22 @@
 		off_cpu_kprunrun = off_s11_cpu_kprunrun;
 		off_t_preempt = off_s11_t_preempt;
+
+#ifdef _LP64
+		/* Only 64-bit kernels */
+		long snv_version = 0;
+		if (!strncmp(utsname.version, "snv_", 4))
+		{
+			ddi_strtol(utsname.version + 4, NULL /* endptr */, 0, &snv_version);
+			if (snv_version >= 166)
+			{
+				off_t_preempt = off_s11_t_preempt_new;
+				cmn_err(CE_NOTE,  "here\n");
+			}
+
+			cmn_err(CE_NOTE, "Detected S11 version %ld: Preemption offset=%d\n", snv_version, off_t_preempt);
+		}
+		else
+			cmn_err(CE_NOTE, "WARNING!! Cannot determine version. Assuming pre snv_166. Preemption offset=%ld may be busted!\n", off_t_preempt);
+#endif
 	} else {
 		/* Solaris 10 detected... */
@@ -1333,9 +1354,9 @@
 				{
 					/* get a page from the freelists */
-					page_t *ppage = vbi_page_get_fromlist(1 /* freelist */, virtAddr);
+					page_t *ppage = vbi_page_get_fromlist(1 /* freelist */, virtAddr, PAGESIZE);
 					if (!ppage)
 					{
 						/* try from the cachelists */
-						ppage = vbi_page_get_fromlist(2 /* cachelist */, virtAddr);
+						ppage = vbi_page_get_fromlist(2 /* cachelist */, virtAddr, PAGESIZE);
 						if (!ppage)
 						{
@@ -1434,7 +1455,8 @@
 
 
-
-static page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr)
-{
+static page_t *
+vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr, size_t pgsize)
+{
+	/* pgsize only applies when using the freelist */
 	seg_t kernseg;
 	kernseg.s_as = &kas;
@@ -1443,12 +1465,9 @@
 	{
 		ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
-							PAGESIZE, 0 /* flags */, NULL /* local group */);
-		if (!ppage)
+							pgsize, 0 /* flags */, NULL /* local group */);
+		if (!ppage && use_kflt)
 		{
-			if (use_kflt)
-			{
-				ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
-							PAGESIZE, 0x0200 /* PG_KFLT */, NULL /* local group */);
-			}
+			ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
+						pgsize, 0x0200 /* PG_KFLT */, NULL /* local group */);
 		}
 	}
@@ -1458,11 +1477,8 @@
 		ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
 							0 /* flags */, NULL /* local group */);
-		if (!ppage)
+		if (!ppage && use_kflt)
 		{
-			if (use_kflt)
-			{
-				ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
-							0x0200 /* PG_KFLT */, NULL /* local group */);
-			}
+			ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr,
+						0x0200 /* PG_KFLT */, NULL /* local group */);
 		}
 	}
@@ -1489,7 +1505,7 @@
 	 */
 	rc = page_resv(npages, KM_NOSLEEP);
-	if (!rc) {
+	if (!rc)
 		return NULL;
-	}
+
 	rc = page_create_wait(npages, 0 /* flags */);
 	if (!rc) {
@@ -1504,14 +1520,10 @@
 	vaddr = NULL;
 	kernseg.s_as = &kas;
-	pproot = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg,
-		vaddr, pgsize, 0x0000 /* flags */, NULL /*lgrp*/);
-	if (!pproot && use_kflt) {
-		pproot = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg,
-			vaddr, pgsize, 0x0200 /* PG_KFLT */, NULL /*lgrp*/);
-		if (!pproot) {
-			page_create_putback(npages);
-			page_unresv(npages);
-			return NULL;
-		}
+	pproot = vbi_page_get_fromlist(1 /* freelist */, vaddr, pgsize);
+	if (!pproot)
+	{
+		page_create_putback(npages);
+		page_unresv(npages);
+		return NULL;
 	}
 	AssertMsg(!(page_pptonum(pproot) & (npages - 1)), ("%p:%lx npages=%lx\n", pproot, page_pptonum(pproot), npages));
