Index: /trunk/src/VBox/VMM/VMMR3/PATM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PATM.cpp	(revision 54745)
+++ /trunk/src/VBox/VMM/VMMR3/PATM.cpp	(revision 54746)
@@ -4584,19 +4584,20 @@
             /* Full breakdown for the GUI. */
             STAMR3RegisterF(pVM, &pVM->patm.s.pStatsHC[pPatchRec->patch.uPatchIdx], STAMTYPE_RATIO_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_GOOD_BAD, PATMPatchType(pVM, &pPatchRec->patch),
-                            "/PATM/Stats/PatchBD/0x%RRv", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.cbPatchBlockSize,STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,      NULL, "/PATM/Stats/PatchBD/0x%RRv/cbPatchBlockSize", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.cbPatchJump,     STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,      NULL, "/PATM/Stats/PatchBD/0x%RRv/cbPatchJump", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.cbPrivInstr,     STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,      NULL, "/PATM/Stats/PatchBD/0x%RRv/cbPrivInstr", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.cCodeWrites,     STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/Stats/PatchBD/0x%RRv/cCodeWrites", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.cInvalidWrites,  STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/Stats/PatchBD/0x%RRv/cInvalidWrites", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.cTraps,          STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/Stats/PatchBD/0x%RRv/cTraps", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.flags,           STAMTYPE_X32, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,       NULL, "/PATM/Stats/PatchBD/0x%RRv/flags", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.nrJumpRecs,      STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/Stats/PatchBD/0x%RRv/nrJumpRecs", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.nrFixups,        STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/Stats/PatchBD/0x%RRv/nrFixups", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.opcode,          STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/Stats/PatchBD/0x%RRv/opcode", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.uOldState,       STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,       NULL, "/PATM/Stats/PatchBD/0x%RRv/uOldState", pPatchRec->patch.pPrivInstrGC);
-            STAMR3RegisterF(pVM, &pPatchRec->patch.uOpMode,         STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,       NULL, "/PATM/Stats/PatchBD/0x%RRv/uOpMode", pPatchRec->patch.pPrivInstrGC);
+                            "/PATM/PatchBD/0x%RRv", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.pPatchBlockOffset,STAMTYPE_X32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,     NULL, "/PATM/PatchBD/0x%RRv/offPatchBlock", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.cbPatchBlockSize,STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,      NULL, "/PATM/PatchBD/0x%RRv/cbPatchBlockSize", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.cbPatchJump,     STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,      NULL, "/PATM/PatchBD/0x%RRv/cbPatchJump", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.cbPrivInstr,     STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,      NULL, "/PATM/PatchBD/0x%RRv/cbPrivInstr", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.cCodeWrites,     STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/PatchBD/0x%RRv/cCodeWrites", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.cInvalidWrites,  STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/PatchBD/0x%RRv/cInvalidWrites", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.cTraps,          STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/PatchBD/0x%RRv/cTraps", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.flags,           STAMTYPE_X64, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,       NULL, "/PATM/PatchBD/0x%RRv/flags", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.nrJumpRecs,      STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/PatchBD/0x%RRv/nrJumpRecs", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.nrFixups,        STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/PatchBD/0x%RRv/nrFixups", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.opcode,          STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, NULL, "/PATM/PatchBD/0x%RRv/opcode", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.uOldState,       STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,       NULL, "/PATM/PatchBD/0x%RRv/uOldState", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.uOpMode,         STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,       NULL, "/PATM/PatchBD/0x%RRv/uOpMode", pPatchRec->patch.pPrivInstrGC);
             /// @todo change the state to be a callback so we can get a state mnemonic instead.
-            STAMR3RegisterF(pVM, &pPatchRec->patch.uState,          STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,       NULL, "/PATM/Stats/PatchBD/0x%RRv/uState", pPatchRec->patch.pPrivInstrGC);
+            STAMR3RegisterF(pVM, &pPatchRec->patch.uState,          STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,       NULL, "/PATM/PatchBD/0x%RRv/uState", pPatchRec->patch.pPrivInstrGC);
 #endif
         }
@@ -5637,5 +5638,5 @@
     {
         STAMR3DeregisterF(pVM->pUVM, "/PATM/Stats/Patch/0x%RRv", pPatchRec->patch.pPrivInstrGC);
-        STAMR3DeregisterF(pVM->pUVM, "/PATM/Stats/PatchBD/0x%RRv*", pPatchRec->patch.pPrivInstrGC);
+        STAMR3DeregisterF(pVM->pUVM, "/PATM/PatchBD/0x%RRv*", pPatchRec->patch.pPrivInstrGC);
     }
 #endif
@@ -5750,5 +5751,5 @@
     {
         STAMR3DeregisterF(pVM->pUVM, "/PATM/Stats/Patch/0x%RRv", pPatchRec->patch.pPrivInstrGC);
-        STAMR3DeregisterF(pVM->pUVM, "/PATM/Stats/PatchBD/0x%RRv*", pPatchRec->patch.pPrivInstrGC);
+        STAMR3DeregisterF(pVM->pUVM, "/PATM/PatchBD/0x%RRv*", pPatchRec->patch.pPrivInstrGC);
     }
 #endif
Index: /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp	(revision 54745)
+++ /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp	(revision 54746)
@@ -7,5 +7,5 @@
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -65,23 +65,32 @@
 *   Defined Constants And Macros                                               *
 *******************************************************************************/
-#define PATCHGEN_PROLOG_NODEF(pVM, pPatch) \
+/** Value to use when not sure about the patch size. */
+#define PATCHGEN_DEF_SIZE   256
+
+#define PATCHGEN_PROLOG_NODEF(pVM, pPatch, a_cbMaxEmit) \
     do { \
-        pPB = PATCHCODE_PTR_HC(pPatch) + pPatch->uCurPatchOffset; \
-        if (pPB + 256 >= pVM->patm.s.pPatchMemHC + pVM->patm.s.cbPatchMem) \
+        cbGivenPatchSize = (a_cbMaxEmit) + 16U /*jmp++*/; \
+        if (RT_LIKELY((pPatch)->pPatchBlockOffset + pPatch->uCurPatchOffset + cbGivenPatchSize < pVM->patm.s.cbPatchMem)) \
+            pPB = PATCHCODE_PTR_HC(pPatch) + pPatch->uCurPatchOffset; \
+        else \
         { \
             pVM->patm.s.fOutOfMemory = true; \
-            Assert(pPB + 256 >= pVM->patm.s.pPatchMemHC + pVM->patm.s.cbPatchMem); \
+            AssertMsgFailed(("offPatch=%#x + offEmit=%#x + a_cbMaxEmit=%#x + jmp -->  cbTotalWithFudge=%#x >= cbPatchMem=%#x", \
+                             (pPatch)->pPatchBlockOffset, pPatch->uCurPatchOffset, a_cbMaxEmit, \
+                             (pPatch)->pPatchBlockOffset + pPatch->uCurPatchOffset + cbGivenPatchSize, pVM->patm.s.cbPatchMem)); \
             return VERR_NO_MEMORY; \
         } \
     } while (0)
 
-#define PATCHGEN_PROLOG(pVM, pPatch) \
+#define PATCHGEN_PROLOG(pVM, pPatch, a_cbMaxEmit) \
     uint8_t *pPB; \
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch)
-
-#define PATCHGEN_EPILOG(pPatch, size) \
+    uint32_t cbGivenPatchSize; \
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, a_cbMaxEmit)
+
+#define PATCHGEN_EPILOG(pPatch, a_cbActual) \
     do { \
-        Assert(size <= 640); \
-        pPatch->uCurPatchOffset += size; \
+        AssertMsg((a_cbActual) <= cbGivenPatchSize, ("a_cbActual=%#x cbGivenPatchSize=%#x\n", a_cbActual, cbGivenPatchSize)); \
+        Assert((a_cbActual) <= 640); \
+        pPatch->uCurPatchOffset += (a_cbActual); \
     } while (0)
 
@@ -441,9 +450,8 @@
 int patmPatchGenDuplicate(PVM pVM, PPATCHINFO pPatch, DISCPUSTATE *pCpu, RCPTRTYPE(uint8_t *) pCurInstrGC)
 {
-    int rc = VINF_SUCCESS;
-    PATCHGEN_PROLOG(pVM, pPatch);
-
     uint32_t const cbInstrShutUpGcc = pCpu->cbInstr;
-    rc = patmPatchReadBytes(pVM, pPB, pCurInstrGC, cbInstrShutUpGcc);
+    PATCHGEN_PROLOG(pVM, pPatch, cbInstrShutUpGcc);
+
+    int rc = patmPatchReadBytes(pVM, pPB, pCurInstrGC, cbInstrShutUpGcc);
     AssertRC(rc);
     PATCHGEN_EPILOG(pPatch, cbInstrShutUpGcc);
@@ -455,14 +463,12 @@
     uint32_t size;
     PATMCALLINFO callInfo;
-
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PCPATCHASMRECORD pPatchAsmRec = EMIsRawRing1Enabled(pVM) ? &g_patmIretRing1Record : &g_patmIretRecord;
+
+    PATCHGEN_PROLOG(pVM, pPatch, pPatchAsmRec->cbFunction);
 
     AssertMsg(fSizeOverride == false, ("operand size override!!\n"));
     callInfo.pCurInstrGC = pCurInstrGC;
 
-    if (EMIsRawRing1Enabled(pVM))
-        size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmIretRing1Record, 0, false, &callInfo);
-    else
-        size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmIretRecord, 0, false, &callInfo);
+    size = patmPatchGenCode(pVM, pPatch, pPB, pPatchAsmRec, 0, false, &callInfo);
 
     PATCHGEN_EPILOG(pPatch, size);
@@ -473,5 +479,5 @@
 {
     uint32_t size;
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmCliRecord.cbFunction);
 
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmCliRecord, 0, false);
@@ -490,5 +496,5 @@
 
     Log(("patmPatchGenSti at %RRv; next %RRv\n", pCurInstrGC, pNextInstrGC));
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmStiRecord.cbFunction);
     callInfo.pNextInstrGC = pNextInstrGC;
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmStiRecord, 0, false, &callInfo);
@@ -503,6 +509,11 @@
     uint32_t        size;
     PATMCALLINFO    callInfo;
-
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PCPATCHASMRECORD pPatchAsmRec;
+    if (fSizeOverride == true)
+        pPatchAsmRec = fGenJumpBack ? &g_patmPopf16Record : &g_patmPopf16Record_NoExit;
+    else
+        pPatchAsmRec = fGenJumpBack ? &g_patmPopf32Record : &g_patmPopf32Record_NoExit;
+
+    PATCHGEN_PROLOG(pVM, pPatch, pPatchAsmRec->cbFunction);
 
     callInfo.pNextInstrGC = pReturnAddrGC;
@@ -512,12 +523,6 @@
     /* Note: keep IOPL in mind when changing any of this!! (see comments in PATMA.asm, PATMPopf32Replacement) */
     if (fSizeOverride == true)
-    {
         Log(("operand size override!!\n"));
-        size = patmPatchGenCode(pVM, pPatch, pPB, (fGenJumpBack) ? &g_patmPopf16Record : &g_patmPopf16Record_NoExit , pReturnAddrGC, fGenJumpBack, &callInfo);
-    }
-    else
-    {
-        size = patmPatchGenCode(pVM, pPatch, pPB, (fGenJumpBack) ? &g_patmPopf32Record : &g_patmPopf32Record_NoExit, pReturnAddrGC, fGenJumpBack, &callInfo);
-    }
+    size = patmPatchGenCode(pVM, pPatch, pPB, pPatchAsmRec, pReturnAddrGC, fGenJumpBack, &callInfo);
 
     PATCHGEN_EPILOG(pPatch, size);
@@ -529,15 +534,8 @@
 {
     uint32_t size;
-    PATCHGEN_PROLOG(pVM, pPatch);
-
-    if (fSizeOverride == true)
-    {
-        Log(("operand size override!!\n"));
-        size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmPushf16Record, 0, false);
-    }
-    else
-    {
-        size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmPushf32Record, 0, false);
-    }
+    PCPATCHASMRECORD pPatchAsmRec = fSizeOverride == true ?  &g_patmPushf16Record : &g_patmPushf32Record;
+    PATCHGEN_PROLOG(pVM, pPatch, pPatchAsmRec->cbFunction);
+
+    size = patmPatchGenCode(pVM, pPatch, pPB, pPatchAsmRec, 0, false);
 
     PATCHGEN_EPILOG(pPatch, size);
@@ -548,5 +546,5 @@
 {
     uint32_t size;
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmPushCSRecord.cbFunction);
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmPushCSRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
@@ -558,7 +556,4 @@
     uint32_t size = 0;
     PCPATCHASMRECORD pPatchAsmRec;
-
-    PATCHGEN_PROLOG(pVM, pPatch);
-
     switch (opcode)
     {
@@ -581,4 +576,5 @@
     Assert(pPatchAsmRec->offSizeOverride && pPatchAsmRec->offRelJump);
 
+    PATCHGEN_PROLOG(pVM, pPatch, pPatchAsmRec->cbFunction);
     Log(("PatchGenLoop %d jump %d to %08x offrel=%d\n", opcode, pPatch->nrJumpRecs, pTargetGC, pPatchAsmRec->offRelJump));
 
@@ -602,5 +598,5 @@
 {
     uint32_t offset = 0;
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, PATCHGEN_DEF_SIZE);
 
     // internal relative jumps from patch code to patch code; no relocation record required
@@ -713,5 +709,5 @@
     AssertRCReturn(rc, rc);
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, PATCHGEN_DEF_SIZE);
     /* 2: We must push the target address onto the stack before appending the indirect call code. */
 
@@ -773,8 +769,9 @@
 
     /* 3: Generate code to lookup address in our local cache; call hypervisor PATM code if it can't be located. */
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PCPATCHASMRECORD pPatchAsmRec = fIndirect ? &g_patmCallIndirectRecord : &g_patmCallRecord;
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, pPatchAsmRec->cbFunction);
     callInfo.pReturnGC      = pCurInstrGC + pCpu->cbInstr;
     callInfo.pTargetGC      = (fIndirect) ? 0xDEADBEEF : pTargetGC;
-    size = patmPatchGenCode(pVM, pPatch, pPB, (fIndirect) ? &g_patmCallIndirectRecord : &g_patmCallRecord, 0, false, &callInfo);
+    size = patmPatchGenCode(pVM, pPatch, pPB, pPatchAsmRec, 0, false, &callInfo);
     PATCHGEN_EPILOG(pPatch, size);
 
@@ -811,5 +808,5 @@
     AssertRCReturn(rc, rc);
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, PATCHGEN_DEF_SIZE);
     /* 2: We must push the target address onto the stack before appending the indirect call code. */
 
@@ -850,5 +847,5 @@
 
     /* 3: Generate code to lookup address in our local cache; call hypervisor PATM code if it can't be located. */
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, g_patmJumpIndirectRecord.cbFunction);
     callInfo.pReturnGC      = pCurInstrGC + pCpu->cbInstr;
     callInfo.pTargetGC      = 0xDEADBEEF;
@@ -872,5 +869,4 @@
 int patmPatchGenRet(PVM pVM, PPATCHINFO pPatch, DISCPUSTATE *pCpu, RCPTRTYPE(uint8_t *) pCurInstrGC)
 {
-    int size = 0, rc;
     RTRCPTR pPatchRetInstrGC;
 
@@ -892,18 +888,18 @@
     /* Jump back to the original instruction if IF is set again. */
     Assert(!patmFindActivePatchByEntrypoint(pVM, pCurInstrGC));
-    rc = patmPatchGenCheckIF(pVM, pPatch, pCurInstrGC);
+    int rc = patmPatchGenCheckIF(pVM, pPatch, pCurInstrGC);
     AssertRCReturn(rc, rc);
 
     /* align this block properly to make sure the jump table will not be misaligned. */
-    PATCHGEN_PROLOG(pVM, pPatch);
-    size = (RTHCUINTPTR)pPB & 3;
+    PATCHGEN_PROLOG(pVM, pPatch, 4);
+    uint32_t size = (RTHCUINTPTR)pPB & 3;
     if (size)
         size = 4 - size;
 
-    for (int i=0;i<size;i++)
+    for (uint32_t i = 0; i < size; i++)
         pPB[i] = 0x90;   /* nop */
     PATCHGEN_EPILOG(pPatch, size);
 
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, g_patmRetRecord.cbFunction);
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmRetRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
@@ -931,9 +927,7 @@
 int patmPatchGenGlobalFunctions(PVM pVM, PPATCHINFO pPatch)
 {
-    int size = 0;
-
     pVM->patm.s.pfnHelperCallGC = PATCHCODE_PTR_GC(pPatch) + pPatch->uCurPatchOffset;
-    PATCHGEN_PROLOG(pVM, pPatch);
-    size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmLookupAndCallRecord, 0, false);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmLookupAndCallRecord.cbFunction);
+    uint32_t size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmLookupAndCallRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
 
@@ -942,5 +936,5 @@
 
     pVM->patm.s.pfnHelperRetGC = PATCHCODE_PTR_GC(pPatch) + pPatch->uCurPatchOffset;
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, g_patmRetFunctionRecord.cbFunction);
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmRetFunctionRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
@@ -950,5 +944,5 @@
 
     pVM->patm.s.pfnHelperJumpGC = PATCHCODE_PTR_GC(pPatch) + pPatch->uCurPatchOffset;
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, g_patmLookupAndJumpRecord.cbFunction);
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmLookupAndJumpRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
@@ -958,5 +952,5 @@
 
     pVM->patm.s.pfnHelperIretGC = PATCHCODE_PTR_GC(pPatch) + pPatch->uCurPatchOffset;
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, g_patmIretFunctionRecord.cbFunction);
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmIretFunctionRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
@@ -980,5 +974,5 @@
 int patmPatchGenIllegalInstr(PVM pVM, PPATCHINFO pPatch)
 {
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, 1);
 
     pPB[0] = 0xCC;
@@ -1001,5 +995,5 @@
     uint32_t size;
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmCheckIFRecord.cbFunction);
 
     /* Add lookup record for patch to guest address translation */
@@ -1024,10 +1018,10 @@
 int patmPatchGenSetPIF(PVM pVM, PPATCHINFO pPatch, RTRCPTR pInstrGC)
 {
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmSetPIFRecord.cbFunction);
 
     /* Add lookup record for patch to guest address translation */
     patmR3AddP2GLookupRecord(pVM, pPatch, pPB, pInstrGC, PATM_LOOKUP_PATCH2GUEST);
 
-    int size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmSetPIFRecord, 0, false);
+    uint32_t size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmSetPIFRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
     return VINF_SUCCESS;
@@ -1045,10 +1039,10 @@
 int patmPatchGenClearPIF(PVM pVM, PPATCHINFO pPatch, RTRCPTR pInstrGC)
 {
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmSetPIFRecord.cbFunction);
 
     /* Add lookup record for patch to guest address translation */
     patmR3AddP2GLookupRecord(pVM, pPatch, pPB, pInstrGC, PATM_LOOKUP_PATCH2GUEST);
 
-    int size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmClearPIFRecord, 0, false);
+    uint32_t size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmClearPIFRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
     return VINF_SUCCESS;
@@ -1066,8 +1060,8 @@
 int patmPatchGenClearInhibitIRQ(PVM pVM, PPATCHINFO pPatch, RTRCPTR pNextInstrGC)
 {
-    int          size;
     PATMCALLINFO callInfo;
-
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PCPATCHASMRECORD pPatchAsmRec = pPatch->flags & PATMFL_DUPLICATE_FUNCTION
+                                  ? &g_patmClearInhibitIRQContIF0Record : &g_patmClearInhibitIRQFaultIF0Record;
+    PATCHGEN_PROLOG(pVM, pPatch, pPatchAsmRec->cbFunction);
 
     Assert((pPatch->flags & (PATMFL_GENERATE_JUMPTOGUEST|PATMFL_DUPLICATE_FUNCTION)) != (PATMFL_GENERATE_JUMPTOGUEST|PATMFL_DUPLICATE_FUNCTION));
@@ -1078,8 +1072,5 @@
     callInfo.pNextInstrGC = pNextInstrGC;
 
-    if (pPatch->flags & PATMFL_DUPLICATE_FUNCTION)
-        size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmClearInhibitIRQContIF0Record, 0, false, &callInfo);
-    else
-        size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmClearInhibitIRQFaultIF0Record, 0, false, &callInfo);
+    uint32_t size = patmPatchGenCode(pVM, pPatch, pPB, pPatchAsmRec, 0, false, &callInfo);
 
     PATCHGEN_EPILOG(pPatch, size);
@@ -1106,5 +1097,7 @@
     {
         uint32_t size;
-        PATCHGEN_PROLOG(pVM, pPatch);
+        PCPATCHASMRECORD pPatchAsmRec = pPatch->flags & PATMFL_INTHANDLER_WITH_ERRORCODE
+                                      ? &g_patmIntEntryRecordErrorCode : &g_patmIntEntryRecord;
+        PATCHGEN_PROLOG(pVM, pPatch, pPatchAsmRec->cbFunction);
 
         /* Add lookup record for patch to guest address translation */
@@ -1112,7 +1105,5 @@
 
         /* Generate entrypoint for the interrupt handler (correcting CS in the interrupt stack frame) */
-        size = patmPatchGenCode(pVM, pPatch, pPB,
-                                (pPatch->flags & PATMFL_INTHANDLER_WITH_ERRORCODE) ? &g_patmIntEntryRecordErrorCode : &g_patmIntEntryRecord,
-                                0, false);
+        size = patmPatchGenCode(pVM, pPatch, pPB, pPatchAsmRec, 0, false);
 
         PATCHGEN_EPILOG(pPatch, size);
@@ -1137,8 +1128,10 @@
 {
     uint32_t size;
+    PCPATCHASMRECORD pPatchAsmRec = (pPatch->flags & PATMFL_TRAPHANDLER_WITH_ERRORCODE)
+                                  ? &g_patmTrapEntryRecordErrorCode : &g_patmTrapEntryRecord;
 
     Assert(!EMIsRawRing1Enabled(pVM));
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, pPatchAsmRec->cbFunction);
 
     /* Add lookup record for patch to guest address translation */
@@ -1146,7 +1139,5 @@
 
     /* Generate entrypoint for the trap handler (correcting CS in the interrupt stack frame) */
-    size = patmPatchGenCode(pVM, pPatch, pPB,
-                            (pPatch->flags & PATMFL_TRAPHANDLER_WITH_ERRORCODE) ? &g_patmTrapEntryRecordErrorCode : &g_patmTrapEntryRecord,
-                            pTrapHandlerGC, true);
+    size = patmPatchGenCode(pVM, pPatch, pPB, pPatchAsmRec, pTrapHandlerGC, true);
     PATCHGEN_EPILOG(pPatch, size);
 
@@ -1159,5 +1150,5 @@
     uint32_t size;
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmStatsRecord.cbFunction);
 
     /* Add lookup record for stats code -> guest handler. */
@@ -1186,5 +1177,5 @@
     uint32_t offset;
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, PATCHGEN_DEF_SIZE);
 
     mod = 0;            //effective address (only)
@@ -1236,5 +1227,5 @@
     uint32_t offset;
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, PATCHGEN_DEF_SIZE);
 
     mod = 0;            //effective address (only)
@@ -1302,10 +1293,10 @@
     Assert(pPatch->flags & PATMFL_CODE32);
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmClearPIFRecord.cbFunction + 2 + g_patmMovFromSSRecord.cbFunction + 2 + g_patmSetPIFRecord.cbFunction);
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmClearPIFRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
 
     /* push ss */
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, 2);
     offset = 0;
     if (pCpu->fPrefix & DISPREFIX_OPSIZE)
@@ -1315,10 +1306,10 @@
 
     /* checks and corrects RPL of pushed ss*/
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, g_patmMovFromSSRecord.cbFunction);
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmMovFromSSRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
 
     /* pop general purpose register */
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, 2);
     offset = 0;
     if (pCpu->fPrefix & DISPREFIX_OPSIZE)
@@ -1328,5 +1319,5 @@
 
 
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch, g_patmSetPIFRecord.cbFunction);
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmSetPIFRecord, 0, false);
     PATCHGEN_EPILOG(pPatch, size);
@@ -1355,5 +1346,5 @@
     Assert(pCpu->fPrefix == DISPREFIX_NONE || pCpu->fPrefix == DISPREFIX_OPSIZE);
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, PATCHGEN_DEF_SIZE);
 
     if (pCpu->Param1.fUse == DISUSE_REG_GEN32 || pCpu->Param1.fUse == DISUSE_REG_GEN16)
@@ -1484,5 +1475,5 @@
 //58                   pop         eax
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, PATCHGEN_DEF_SIZE);
     pPB[offset++] = 0x50;              // push      eax
     pPB[offset++] = 0x52;              // push      edx
@@ -1543,5 +1534,5 @@
 {
     uint32_t size;
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, g_patmCpuidRecord.cbFunction);
 
     size = patmPatchGenCode(pVM, pPatch, pPB, &g_patmCpuidRecord, 0, false);
@@ -1574,5 +1565,5 @@
     }
 
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, PATMJumpToGuest_IF1Record.cbFunction);
 
     /* Add lookup record for patch to guest address translation */
@@ -1595,5 +1586,5 @@
 
     Assert(PATMIsPatchGCAddr(pVM, pPatchAddrGC));
-    PATCHGEN_PROLOG(pVM, pPatch);
+    PATCHGEN_PROLOG(pVM, pPatch, SIZEOF_NEARJUMP32);
 
     if (fAddLookupRecord)
