Index: /trunk/src/VBox/Runtime/r0drv/solaris/initterm-r0drv-solaris.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/initterm-r0drv-solaris.c	(revision 41681)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/initterm-r0drv-solaris.c	(revision 41682)
@@ -154,5 +154,6 @@
             else if (max_cpuid + 1 != IPRT_SOL_NCPUS)
             {
-                cmn_err(CE_NOTE, "rtR0InitNative: cpuset_t size mismatch! max_cpuid=%d IPRT_SOL_NCPUS=%d\n", max_cpuid, IPRT_SOL_NCPUS);
+                cmn_err(CE_NOTE, "rtR0InitNative: cpuset_t size mismatch! max_cpuid=%d IPRT_SOL_NCPUS=%d\n", max_cpuid,
+                        IPRT_SOL_NCPUS);
                 rc = VERR_NOT_SUPPORTED;
                 goto errorbail;
@@ -163,6 +164,8 @@
          * Optional: Timeout hooks.
          */
-        RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "timeout_generic", (void **)&g_pfnrtR0Sol_timeout_generic);
-        RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "untimeout_generic", (void **)&g_pfnrtR0Sol_untimeout_generic);
+        RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "timeout_generic",
+                                   (void **)&g_pfnrtR0Sol_timeout_generic);
+        RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "untimeout_generic",
+                                   (void **)&g_pfnrtR0Sol_untimeout_generic);
         if ((g_pfnrtR0Sol_timeout_generic == NULL) != (g_pfnrtR0Sol_untimeout_generic == NULL))
         {
@@ -173,5 +176,12 @@
             g_pfnrtR0Sol_untimeout_generic = NULL;
         }
-        RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "cyclic_reprogram", (void **)&g_pfnrtR0Sol_cyclic_reprogram);
+        RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "cyclic_reprogram",
+                                   (void **)&g_pfnrtR0Sol_cyclic_reprogram);
+
+        /*
+         * Optional: Querying page no-relocation support.
+         */
+        RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /*pszModule */, "page_noreloc_supported",
+                                   (void **)&g_pfnrtR0Sol_page_noreloc_supported);
 
         /*
Index: /trunk/src/VBox/Runtime/r0drv/solaris/memobj-r0drv-solaris.c
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/memobj-r0drv-solaris.c	(revision 41681)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/memobj-r0drv-solaris.c	(revision 41682)
@@ -84,4 +84,5 @@
 static kmutex_t                 g_LargePageOffsetMtx;
 static u_offset_t               g_offLargePage;
+static bool                     g_fLargePageNoReloc;
 
 
@@ -291,4 +292,20 @@
 {
     /*
+     * Check PG_NORELOC support for large pages. Using this helps prevent _1G page
+     * fragementation on systems that support it.
+     */
+    static bool fPageNoRelocChecked = false;
+    if (fPageNoRelocChecked == false)
+    {
+        fPageNoRelocChecked = true;
+        g_fLargePageNoReloc = false;
+        if (   g_pfnrtR0Sol_page_noreloc_supported
+            && g_pfnrtR0Sol_page_noreloc_supported(cbLargePage))
+        {
+            g_fLargePageNoReloc = true;
+        }
+    }
+
+    /*
      * Non-pageable memory reservation request for _4K pages, don't sleep.
      */
@@ -311,5 +328,6 @@
             KernelSeg.s_as = &kas;
             page_t *pRootPage = page_create_va_large(&g_LargePageVnode, offPage, cbLargePage,
-                                                     PG_EXCL, &KernelSeg, 0 /* vaddr */, NULL /* locality group */);
+                                                     PG_EXCL | (g_fLargePageNoReloc ? PG_NORELOC : 0), &KernelSeg,
+                                                     0 /* vaddr */,NULL /* locality group */);
             if (pRootPage)
             {
@@ -399,12 +417,13 @@
             AssertRelease(pFoundPage);
 
-#if 0
-            /*
-             * This can only be guaranteed if PG_NORELOC is used while allocating the pages.
-             */
-            AssertReleaseMsg(pFoundPage == pPage,
+            if (g_fLargePageNoReloc)
+            {
+                /*
+                 * This can only be guaranteed if PG_NORELOC is used while allocating the pages.
+                 */
+                AssertReleaseMsg(pFoundPage == pPage,
                              ("lookup failed %p:%llu returned %p, expected %p\n", &g_LargePageVnode, offPage,
                               pFoundPage, pPage));
-#endif
+            }
 
             /*
Index: /trunk/src/VBox/Runtime/r0drv/solaris/the-solaris-kernel.h
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/solaris/the-solaris-kernel.h	(revision 41681)
+++ /trunk/src/VBox/Runtime/r0drv/solaris/the-solaris-kernel.h	(revision 41682)
@@ -82,18 +82,19 @@
 typedef int          (*PFNSOL_cyclic_reprogram)(cyclic_id_t id, hrtime_t expiration);
 typedef void         (*PFNSOL_contig_free)(void *addr, size_t size);
+typedef int          (*PFNSOL_page_noreloc_supported)(size_t cbPageSize);
 
 /* IPRT globals. */
-extern bool                     g_frtSolSplSetsEIF;
-extern RTCPUSET                 g_rtMpSolCpuSet;
-extern PFNSOL_timeout_generic   g_pfnrtR0Sol_timeout_generic;
-extern PFNSOL_untimeout_generic g_pfnrtR0Sol_untimeout_generic;
-extern PFNSOL_cyclic_reprogram  g_pfnrtR0Sol_cyclic_reprogram;
-extern PFNSOL_contig_free       g_pfnrtR0Sol_contig_free;
-extern bool                     g_frtSolUseKflt;
-extern size_t                   g_offrtSolThreadPreempt;
-extern size_t                   g_offrtSolCpuPreempt;
-extern size_t                   g_offrtSolCpuForceKernelPreempt;
-extern bool                     g_frtSolInitDone;
-extern RTDBGKRNLINFO            g_hKrnlDbgInfo;
+extern bool                            g_frtSolSplSetsEIF;
+extern RTCPUSET                        g_rtMpSolCpuSet;
+extern PFNSOL_timeout_generic          g_pfnrtR0Sol_timeout_generic;
+extern PFNSOL_untimeout_generic        g_pfnrtR0Sol_untimeout_generic;
+extern PFNSOL_cyclic_reprogram         g_pfnrtR0Sol_cyclic_reprogram;
+extern PFNSOL_contig_free              g_pfnrtR0Sol_contig_free;
+extern PFNSOL_page_noreloc_supported   g_pfnrtR0Sol_page_noreloc_supported;
+extern size_t                          g_offrtSolThreadPreempt;
+extern size_t                          g_offrtSolCpuPreempt;
+extern size_t                          g_offrtSolCpuForceKernelPreempt;
+extern bool                            g_frtSolInitDone;
+extern RTDBGKRNLINFO                   g_hKrnlDbgInfo;
 
 /*
