Index: /trunk/src/VBox/VMM/VMMR3/PATMA.asm
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PATMA.asm	(revision 54688)
+++ /trunk/src/VBox/VMM/VMMR3/PATMA.asm	(revision 54689)
@@ -74,4 +74,35 @@
     at PATCHASMRECORD.cbFunction,     DD          NAME(%1 %+ _EndProc) - NAME(%1)
     at PATCHASMRECORD.cRelocs,        DD          %3
+iend                                                         
+%endmacro
+
+;;
+; Simple PATCHASMRECORD initializer
+; @param %1     The patch function name.
+; @param %2     Jump lable (or nothing).
+; @param %3     Relative jump label (or nothing).
+; @param %4     Size override label (or nothing).
+; @param %5     The number of fixups.
+;
+%macro PATCHASMRECORD_INIT_EX 5
+istruc PATCHASMRECORD
+    at PATCHASMRECORD.pbFunction,     RTCCPTR_DEF NAME(%1)
+%ifid %2
+    at PATCHASMRECORD.offJump,        DD          %2 - NAME(%1)
+%else
+    at PATCHASMRECORD.offJump,        DD          0
+%endif
+%ifid %3
+    at PATCHASMRECORD.offRelJump,     DD          %3 - NAME(%1)
+%else
+    at PATCHASMRECORD.offRelJump,     DD          0
+%endif
+%ifid %4
+    at PATCHASMRECORD.offSizeOverride,DD          %4 - NAME(%1)
+%else
+    at PATCHASMRECORD.offSizeOverride,DD          0
+%endif
+    at PATCHASMRECORD.cbFunction,     DD          NAME(%1 %+ _EndProc) - NAME(%1)
+    at PATCHASMRECORD.cRelocs,        DD          %5
 iend                                                         
 %endmacro
@@ -318,5 +349,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMStiReplacement
-PATMStiStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     mov     dword [ss:PATM_INHIBITIRQADDR], PATM_NEXTINSTRADDR
@@ -335,5 +365,4 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMStiEnd:
 ENDPROC     PATMStiReplacement
 
@@ -341,29 +370,18 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmStiRecord
-    RTCCPTR_DEF PATMStiStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMStiEnd - PATMStiStart
 %ifdef PATM_LOG_PATCHINSTR
-    DD      6
+    PATCHASMRECORD_INIT PATMStiReplacement, 6
 %else
-    DD      5
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INHIBITIRQADDR
-    DD      0
-    DD      PATM_NEXTINSTRADDR
-    DD      0
+    PATCHASMRECORD_INIT PATMStiReplacement, 5
+%endif
+    DD      PATM_INTERRUPTFLAG,  0
+    DD      PATM_INHIBITIRQADDR, 0
+    DD      PATM_NEXTINSTRADDR,  0
 %ifdef PATM_LOG_PATCHINSTR
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    DD      PATM_PENDINGACTION,  0
+%endif
+    DD      PATM_VMFLAGS,        0
+    DD      PATM_INTERRUPTFLAG,  0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -383,5 +401,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMTrapEntry
-PATMTrapEntryStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushf
@@ -425,5 +442,4 @@
 PATMTrapEntryJump:
     DD      PATM_JUMPDELTA
-PATMTrapEntryEnd:
 ENDPROC     PATMTrapEntry
 
@@ -431,25 +447,16 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmTrapEntryRecord
-    RTCCPTR_DEF PATMTrapEntryStart
-    DD      PATMTrapEntryJump - PATMTrapEntryStart
-    DD      0
-    DD      0
-    DD      PATMTrapEntryEnd - PATMTrapEntryStart
 %ifdef PATM_LOG_PATCHIRET
-    DD      4
+    PATCHASMRECORD_INIT_JUMP PATMTrapEntry, PATMTrapEntryJump, 4
 %else
-    DD      3
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT_JUMP PATMTrapEntry, PATMTrapEntryJump, 3
+%endif
+    DD      PATM_INTERRUPTFLAG, 0
 %ifdef PATM_LOG_PATCHIRET
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    DD      PATM_PENDINGACTION, 0
+%endif
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -512,5 +519,4 @@
 PATMTrapErrorCodeEntryJump:
     DD      PATM_JUMPDELTA
-PATMTrapErrorCodeEntryEnd:
 ENDPROC     PATMTrapEntryErrorCode
 
@@ -518,25 +524,16 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmTrapEntryRecordErrorCode
-    RTCCPTR_DEF PATMTrapErrorCodeEntryStart
-    DD      PATMTrapErrorCodeEntryJump - PATMTrapErrorCodeEntryStart
-    DD      0
-    DD      0
-    DD      PATMTrapErrorCodeEntryEnd - PATMTrapErrorCodeEntryStart
 %ifdef PATM_LOG_PATCHIRET
-    DD      4
+    PATCHASMRECORD_INIT_JUMP PATMTrapEntryErrorCode, PATMTrapErrorCodeEntryJump, 4
 %else
-    DD      3
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT_JUMP PATMTrapEntryErrorCode, PATMTrapErrorCodeEntryJump, 3
+%endif
+    DD      PATM_INTERRUPTFLAG, 0
 %ifdef PATM_LOG_PATCHIRET
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    DD      PATM_PENDINGACTION, 0
+%endif
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -556,5 +553,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIntEntry
-PATMIntEntryStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushf
@@ -595,5 +591,4 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMIntEntryEnd:
 ENDPROC     PATMIntEntry
 
@@ -601,25 +596,16 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIntEntryRecord
-    RTCCPTR_DEF PATMIntEntryStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMIntEntryEnd - PATMIntEntryStart
 %ifdef PATM_LOG_PATCHIRET
-    DD      4
+    PATCHASMRECORD_INIT PATMIntEntry, 4
 %else
-    DD      3
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMIntEntry, 3
+%endif
+    DD      PATM_INTERRUPTFLAG, 0
 %ifdef PATM_LOG_PATCHIRET
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    DD      PATM_PENDINGACTION, 0
+%endif
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -640,5 +626,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIntEntryErrorCode
-PATMIntEntryErrorCodeStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushf
@@ -679,5 +664,4 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMIntEntryErrorCodeEnd:
 ENDPROC     PATMIntEntryErrorCode
 
@@ -685,25 +669,16 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIntEntryRecordErrorCode
-    RTCCPTR_DEF PATMIntEntryErrorCodeStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMIntEntryErrorCodeEnd - PATMIntEntryErrorCodeStart
 %ifdef PATM_LOG_PATCHIRET
-    DD      4
+    PATCHASMRECORD_INIT PATMIntEntryErrorCode, 4
 %else
-    DD      3
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMIntEntryErrorCode, 3
+%endif
+    DD      PATM_INTERRUPTFLAG, 0
 %ifdef PATM_LOG_PATCHIRET
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    DD      PATM_PENDINGACTION, 0
+%endif
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -713,5 +688,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPopf32Replacement
-PATMPopf32Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
 %ifdef PATM_LOG_PATCHINSTR
@@ -766,5 +740,4 @@
 PATMPopf32Jump:
     DD      PATM_JUMPDELTA
-PATMPopf32End:
 ENDPROC     PATMPopf32Replacement
 
@@ -772,41 +745,24 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPopf32Record
-    RTCCPTR_DEF PATMPopf32Start
-    DD      PATMPopf32Jump - PATMPopf32Start
-    DD      0
-    DD      0
-    DD      PATMPopf32End - PATMPopf32Start
 %ifdef PATM_LOG_PATCHINSTR
-    DD      12
+    PATCHASMRECORD_INIT_JUMP PATMPopf32Replacement, PATMPopf32Jump, 12
 %else
-    DD      11
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT_JUMP PATMPopf32Replacement, PATMPopf32Jump, 11
+%endif
+    DD      PATM_INTERRUPTFLAG,      0
 %ifdef PATM_LOG_PATCHINSTR
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VM_FORCEDACTIONS
-    DD      0
-    DD      PATM_TEMP_EAX
-    DD      0
-    DD      PATM_TEMP_ECX
-    DD      0
-    DD      PATM_TEMP_EDI
-    DD      0
-    DD      PATM_TEMP_RESTORE_FLAGS
-    DD      0
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      PATM_NEXTINSTRADDR
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    DD      PATM_PENDINGACTION,      0
+%endif
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VM_FORCEDACTIONS,   0
+    DD      PATM_TEMP_EAX,           0
+    DD      PATM_TEMP_ECX,           0
+    DD      PATM_TEMP_EDI,           0
+    DD      PATM_TEMP_RESTORE_FLAGS, 0
+    DD      PATM_PENDINGACTION,      0
+    DD      PATM_NEXTINSTRADDR,      0
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -816,5 +772,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPopf32Replacement_NoExit
-PATMPopf32_NoExitStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
 %ifdef PATM_LOG_PATCHINSTR
@@ -862,5 +817,4 @@
     popfd
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMPopf32_NoExitEnd:
 ENDPROC     PATMPopf32Replacement_NoExit
 
@@ -868,45 +822,26 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPopf32Record_NoExit
-    RTCCPTR_DEF PATMPopf32_NoExitStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMPopf32_NoExitEnd - PATMPopf32_NoExitStart
 %ifdef PATM_LOG_PATCHINSTR
-    DD      14
+    PATCHASMRECORD_INIT PATMPopf32Replacement_NoExit, 14
 %else
-    DD      13
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMPopf32Replacement_NoExit, 13
+%endif
+    DD      PATM_INTERRUPTFLAG,      0
 %ifdef PATM_LOG_PATCHINSTR
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VM_FORCEDACTIONS
-    DD      0
-    DD      PATM_TEMP_EAX
-    DD      0
-    DD      PATM_TEMP_ECX
-    DD      0
-    DD      PATM_TEMP_EDI
-    DD      0
-    DD      PATM_TEMP_RESTORE_FLAGS
-    DD      0
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      PATM_NEXTINSTRADDR
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    DD      PATM_PENDINGACTION,      0
+%endif
+    DD      PATM_VM_FORCEDACTIONS,   0
+    DD      PATM_TEMP_EAX,           0
+    DD      PATM_TEMP_ECX,           0
+    DD      PATM_TEMP_EDI,           0
+    DD      PATM_TEMP_RESTORE_FLAGS, 0
+    DD      PATM_PENDINGACTION,      0
+    DD      PATM_NEXTINSTRADDR,      0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -916,5 +851,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPopf16Replacement
-PATMPopf16Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     test    word [esp], X86_EFL_IF
@@ -945,5 +879,4 @@
 PATMPopf16Jump:
     DD      PATM_JUMPDELTA
-PATMPopf16End:
 ENDPROC     PATMPopf16Replacement
 
@@ -951,29 +884,15 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPopf16Record
-    RTCCPTR_DEF PATMPopf16Start
-    DD      PATMPopf16Jump - PATMPopf16Start
-    DD      0
-    DD      0
-    DD      PATMPopf16End - PATMPopf16Start
-    DD      9
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_VM_FORCEDACTIONS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    PATCHASMRECORD_INIT_JUMP PATMPopf16Replacement, PATMPopf16Jump, 9
+    DD      PATM_INTERRUPTFLAG,    0
+    DD      PATM_INTERRUPTFLAG,    0
+    DD      PATM_VM_FORCEDACTIONS, 0
+    DD      PATM_INTERRUPTFLAG,    0
+    DD      PATM_VMFLAGS,          0
+    DD      PATM_VMFLAGS,          0
+    DD      PATM_VMFLAGS,          0
+    DD      PATM_VMFLAGS,          0
+    DD      PATM_INTERRUPTFLAG,    0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -984,5 +903,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPopf16Replacement_NoExit
-PATMPopf16Start_NoExit:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     test    word [esp], X86_EFL_IF
@@ -1009,5 +927,4 @@
     popf    ;after the and and or operations!! (flags must be preserved)
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMPopf16End_NoExit:
 ENDPROC     PATMPopf16Replacement_NoExit
 
@@ -1015,29 +932,15 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPopf16Record_NoExit
-    RTCCPTR_DEF PATMPopf16Start_NoExit
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMPopf16End_NoExit - PATMPopf16Start_NoExit
-    DD      9
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_VM_FORCEDACTIONS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    PATCHASMRECORD_INIT PATMPopf16Replacement_NoExit, 9
+    DD      PATM_INTERRUPTFLAG,    0
+    DD      PATM_INTERRUPTFLAG,    0
+    DD      PATM_VM_FORCEDACTIONS, 0
+    DD      PATM_INTERRUPTFLAG,    0
+    DD      PATM_VMFLAGS,          0
+    DD      PATM_VMFLAGS,          0
+    DD      PATM_VMFLAGS,          0
+    DD      PATM_VMFLAGS,          0
+    DD      PATM_INTERRUPTFLAG,    0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -1047,5 +950,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPushf32Replacement
-PATMPushf32Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushfd
@@ -1070,5 +972,4 @@
     popfd
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMPushf32End:
 ENDPROC     PATMPushf32Replacement
 
@@ -1076,25 +977,16 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPushf32Record
-    RTCCPTR_DEF PATMPushf32Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMPushf32End - PATMPushf32Start
 %ifdef PATM_LOG_PATCHINSTR
-    DD      4
+    PATCHASMRECORD_INIT PATMPushf32Replacement, 4
 %else
-    DD      3
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMPushf32Replacement, 3
+%endif
+    DD      PATM_INTERRUPTFLAG, 0
 %ifdef PATM_LOG_PATCHINSTR
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    DD      PATM_PENDINGACTION, 0
+%endif
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -1104,5 +996,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPushf16Replacement
-PATMPushf16Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     DB      0x66    ; size override
@@ -1121,5 +1012,4 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMPushf16End:
 ENDPROC     PATMPushf16Replacement
 
@@ -1127,17 +1017,9 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPushf16Record
-    RTCCPTR_DEF PATMPushf16Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMPushf16End - PATMPushf16Start
-    DD      3
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
+    PATCHASMRECORD_INIT PATMPushf16Replacement, 3
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -1147,5 +1029,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPushCSReplacement
-PATMPushCSStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     push    cs
@@ -1165,5 +1046,4 @@
 PATMPushCSJump:
     DD      PATM_JUMPDELTA
-PATMPushCSEnd:
 ENDPROC     PATMPushCSReplacement
 
@@ -1171,36 +1051,31 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPushCSRecord
-    RTCCPTR_DEF PATMPushCSStart
-    DD      PATMPushCSJump - PATMPushCSStart
-    DD      0
-    DD      0
-    DD      PATMPushCSEnd - PATMPushCSStart
-    DD      2
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
-
-
-;;****************************************************
-;; Abstract:
-;;
-;; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0
-;; then
-;;     if return to ring 0 (iretstack.new_cs & 3 == 0)
-;;     then
-;;          if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0
-;;          then
-;;              iretstack.new_cs |= 1
-;;          else
-;;              int 3
-;;     endif
-;;     uVMFlags &= ~X86_EFL_IF
-;;     iret
-;; else
-;;     int 3
-;;****************************************************
-;;
+    PATCHASMRECORD_INIT_JUMP PATMPushCSReplacement, PATMPushCSJump, 2
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
+;
+;****************************************************
+; Abstract:
+;
+; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0
+; then
+;     if return to ring 0 (iretstack.new_cs & 3 == 0)
+;     then
+;          if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0
+;          then
+;              iretstack.new_cs |= 1
+;          else
+;              int 3
+;     endif
+;     uVMFlags &= ~X86_EFL_IF
+;     iret
+; else
+;     int 3
+;****************************************************
+;
 ; Stack:
 ;
@@ -1217,5 +1092,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIretReplacement
-PATMIretStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushfd
@@ -1380,5 +1254,4 @@
     TIMES PATCHJUMPTABLE_SIZE DB 0              ; lookup slots
 
-PATMIretEnd:
 ENDPROC     PATMIretReplacement
 
@@ -1386,90 +1259,61 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIretRecord
-    RTCCPTR_DEF PATMIretStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMIretEnd- PATMIretStart
 %ifdef PATM_LOG_PATCHIRET
-    DD      26
+    PATCHASMRECORD_INIT PATMIretReplacement, 26
 %else
-    DD      25
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMIretReplacement, 25
+%endif
+    DD      PATM_INTERRUPTFLAG,      0
 %ifdef PATM_LOG_PATCHIRET
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VM_FORCEDACTIONS
-    DD      0
-    DD      PATM_TEMP_EAX
-    DD      0
-    DD      PATM_TEMP_ECX
-    DD      0
-    DD      PATM_TEMP_EDI
-    DD      0
-    DD      PATM_TEMP_RESTORE_FLAGS
-    DD      0
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      PATM_CURINSTRADDR
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INHIBITIRQADDR
-    DD      0
-    DD      PATM_CURINSTRADDR
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_FIXUP
-    DD      PATMIretTable - PATMIretStart
-    DD      PATM_IRET_FUNCTION
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_TEMP_EAX
-    DD      0
-    DD      PATM_TEMP_ECX
-    DD      0
-    DD      PATM_TEMP_RESTORE_FLAGS
-    DD      0
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      0ffffffffh
-
-
-;;****************************************************
-;; Abstract:
-;;
-;; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0
-;; then
-;;     if return to ring 0 (iretstack.new_cs & 3 == 0)
-;;     then
-;;          if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0
-;;          then
-;;              iretstack.new_cs |= 1
-;;          else
-;;              int 3
-;;     endif
-;;     uVMFlags &= ~X86_EFL_IF
-;;     iret
-;; else
-;;     int 3
-;;****************************************************
-;;
+    DD      PATM_PENDINGACTION,      0
+%endif
+    DD      PATM_VM_FORCEDACTIONS,   0
+    DD      PATM_TEMP_EAX,           0
+    DD      PATM_TEMP_ECX,           0
+    DD      PATM_TEMP_EDI,           0
+    DD      PATM_TEMP_RESTORE_FLAGS, 0
+    DD      PATM_PENDINGACTION,      0
+    DD      PATM_CURINSTRADDR,       0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_INHIBITIRQADDR,     0
+    DD      PATM_CURINSTRADDR,       0
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      PATM_FIXUP,              PATMIretTable - NAME(PATMIretReplacement)
+    DD      PATM_IRET_FUNCTION,      0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_TEMP_EAX,           0
+    DD      PATM_TEMP_ECX,           0
+    DD      PATM_TEMP_RESTORE_FLAGS, 0
+    DD      PATM_PENDINGACTION,      0
+    DD      0ffffffffh,              0ffffffffh
+
+
+;
+;
+;****************************************************
+; Abstract:
+;
+; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0
+; then
+;     if return to ring 0 (iretstack.new_cs & 3 == 0)
+;     then
+;          if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0
+;          then
+;              iretstack.new_cs |= 1
+;          else
+;              int 3
+;     endif
+;     uVMFlags &= ~X86_EFL_IF
+;     iret
+; else
+;     int 3
+;****************************************************
+;
 ; Stack:
 ;
@@ -1483,8 +1327,7 @@
 ; esp + 4  - CS
 ; esp      - EIP
-;;
+;
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIretRing1Replacement
-PATMIretRing1Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushfd
@@ -1679,5 +1522,4 @@
     TIMES PATCHJUMPTABLE_SIZE DB 0              ; lookup slots
 
-PATMIretRing1End:
 ENDPROC     PATMIretRing1Replacement
 
@@ -1685,69 +1527,38 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIretRing1Record
-    RTCCPTR_DEF PATMIretRing1Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMIretRing1End- PATMIretRing1Start
 %ifdef PATM_LOG_PATCHIRET
-    DD      26
+    PATCHASMRECORD_INIT PATMIretRing1Replacement, 26
 %else
-    DD      25
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-%ifdef PATM_LOG_PATCHIRET
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_VM_FORCEDACTIONS
-    DD      0
-    DD      PATM_TEMP_EAX
-    DD      0
-    DD      PATM_TEMP_ECX
-    DD      0
-    DD      PATM_TEMP_EDI
-    DD      0
-    DD      PATM_TEMP_RESTORE_FLAGS
-    DD      0
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      PATM_CURINSTRADDR
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INHIBITIRQADDR
-    DD      0
-    DD      PATM_CURINSTRADDR
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_FIXUP
-    DD      PATMIretRing1Table - PATMIretRing1Start
-    DD      PATM_IRET_FUNCTION
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_TEMP_EAX
-    DD      0
-    DD      PATM_TEMP_ECX
-    DD      0
-    DD      PATM_TEMP_RESTORE_FLAGS
-    DD      0
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      0ffffffffh
+    PATCHASMRECORD_INIT PATMIretRing1Replacement, 25
+%endif
+    DD      PATM_INTERRUPTFLAG,      0
+%ifdef PATM_LOG_PATCHIRET            
+    DD      PATM_PENDINGACTION,      0
+%endif                               
+    DD      PATM_VM_FORCEDACTIONS,   0
+    DD      PATM_TEMP_EAX,           0
+    DD      PATM_TEMP_ECX,           0
+    DD      PATM_TEMP_EDI,           0
+    DD      PATM_TEMP_RESTORE_FLAGS, 0
+    DD      PATM_PENDINGACTION,      0
+    DD      PATM_CURINSTRADDR,       0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_INHIBITIRQADDR,     0
+    DD      PATM_CURINSTRADDR,       0
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      PATM_FIXUP,              PATMIretRing1Table - NAME(PATMIretRing1Replacement)
+    DD      PATM_IRET_FUNCTION,      0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_VMFLAGS,            0
+    DD      PATM_TEMP_EAX,           0
+    DD      PATM_TEMP_ECX,           0
+    DD      PATM_TEMP_RESTORE_FLAGS, 0
+    DD      PATM_PENDINGACTION,      0
+    DD      0ffffffffh,              0ffffffffh
 
 
@@ -1771,5 +1582,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIretFunction
-PATMIretFunction_Start:
     push    ecx
     push    edx
@@ -1829,21 +1639,12 @@
     pop     ecx
     ret
-
-PATMIretFunction_End:
 ENDPROC     PATMIretFunction
 
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIretFunctionRecord
-    RTCCPTR_DEF PATMIretFunction_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMIretFunction_End - PATMIretFunction_Start
-    DD      2
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      PATM_PATCHBASE
-    DD      0
-    DD      0ffffffffh
+    PATCHASMRECORD_INIT PATMIretFunction, 2
+    DD      PATM_PENDINGACTION, 0
+    DD      PATM_PATCHBASE,     0
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -1853,5 +1654,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMCpuidReplacement
-PATMCpuidStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushf
@@ -1899,6 +1699,4 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-
-PATMCpuidEnd:
 ENDPROC PATMCpuidReplacement
 
@@ -1906,12 +1704,5 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCpuidRecord 
-    istruc PATCHASMRECORD
-    at PATCHASMRECORD.pbFunction,     RTCCPTR_DEF PATMCpuidStart
-    at PATCHASMRECORD.offJump,        DD          0
-    at PATCHASMRECORD.offRelJump,     DD          0
-    at PATCHASMRECORD.offSizeOverride,DD          0
-    at PATCHASMRECORD.cbFunction,     DD          PATMCpuidEnd- PATMCpuidStart
-    at PATCHASMRECORD.cRelocs,        DD          9
-    iend
+    PATCHASMRECORD_INIT PATMCpuidReplacement, 9
     DD      PATM_INTERRUPTFLAG,     0       ; 0
     DD      PATM_CPUID_STD_MAX,     0       ; 1
@@ -1931,5 +1722,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMJEcxReplacement
-PATMJEcxStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushfd
@@ -1948,22 +1738,13 @@
     popfd
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMJEcxEnd:
 ENDPROC PATMJEcxReplacement
 
 ; Patch record for 'JEcx'
 BEGIN_PATCH_RODATA_SECTION
-GLOBALNAME g_patmJEcxRecord
-    RTCCPTR_DEF PATMJEcxStart
-    DD      0
-    DD      PATMJEcxJump - PATMJEcxStart
-    DD      PATMJEcxSizeOverride - PATMJEcxStart
-    DD      PATMJEcxEnd- PATMJEcxStart
-    DD      3
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+GLOBALNAME g_patmJEcxRecord 
+    PATCHASMRECORD_INIT_EX PATMJEcxReplacement, , PATMJEcxJump, PATMJEcxSizeOverride, 3
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
     DD      0ffffffffh, 0ffffffffh
 
@@ -1974,5 +1755,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMLoopReplacement
-PATMLoopStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushfd
@@ -1991,5 +1771,4 @@
     popfd
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMLoopEnd:
 ENDPROC PATMLoopReplacement
 
@@ -1997,29 +1776,18 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLoopRecord
-    RTCCPTR_DEF PATMLoopStart
-    DD      0
-    DD      PATMLoopJump - PATMLoopStart
-    DD      PATMLoopSizeOverride - PATMLoopStart
-    DD      PATMLoopEnd- PATMLoopStart
-    DD      3
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh, 0ffffffffh
-
-
-;
-;
+    PATCHASMRECORD_INIT_EX PATMLoopReplacement, , PATMLoopJump, PATMLoopSizeOverride, 3
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
+; jump if ZF=1 AND (E)CX != 0
 ;
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMLoopZReplacement
-PATMLoopZStart:
-    ; jump if ZF=1 AND (E)CX != 0
-
-    mov     dword [ss:PATM_INTERRUPTFLAG], 0
-    jnz     PATMLoopZEnd
+    mov     dword [ss:PATM_INTERRUPTFLAG], 0
+    jnz     NAME(PATMLoopZReplacement_EndProc)
     pushfd
 PATMLoopZSizeOverride:
@@ -2037,5 +1805,4 @@
     popfd
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMLoopZEnd:
 ENDPROC PATMLoopZReplacement
 
@@ -2043,29 +1810,18 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLoopZRecord
-    RTCCPTR_DEF PATMLoopZStart
-    DD      0
-    DD      PATMLoopZJump - PATMLoopZStart
-    DD      PATMLoopZSizeOverride - PATMLoopZStart
-    DD      PATMLoopZEnd- PATMLoopZStart
-    DD      3
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh, 0ffffffffh
-
-
-;
-;
+    PATCHASMRECORD_INIT_EX PATMLoopZReplacement, , PATMLoopZJump, PATMLoopZSizeOverride, 3
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
+; jump if ZF=0 AND (E)CX != 0
 ;
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMLoopNZReplacement
-PATMLoopNZStart:
-    ; jump if ZF=0 AND (E)CX != 0
-
-    mov     dword [ss:PATM_INTERRUPTFLAG], 0
-    jz      PATMLoopNZEnd
+    mov     dword [ss:PATM_INTERRUPTFLAG], 0
+    jz      NAME(PATMLoopNZReplacement_EndProc)
     pushfd
 PATMLoopNZSizeOverride:
@@ -2083,5 +1839,4 @@
     popfd
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMLoopNZEnd:
 ENDPROC PATMLoopNZReplacement
 
@@ -2089,16 +1844,8 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLoopNZRecord
-    RTCCPTR_DEF PATMLoopNZStart
-    DD      0
-    DD      PATMLoopNZJump - PATMLoopNZStart
-    DD      PATMLoopNZSizeOverride - PATMLoopNZStart
-    DD      PATMLoopNZEnd- PATMLoopNZStart
-    DD      3
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT_EX PATMLoopNZReplacement, , PATMLoopNZJump, PATMLoopNZSizeOverride, 3
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2115,7 +1862,7 @@
 ;
 ; @note NEVER change this without bumping the SSM version
+;
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMLookupAndCall
-PATMLookupAndCallStart:
     push    eax
     push    edx
@@ -2217,7 +1964,5 @@
     ; the called function will set PATM_INTERRUPTFLAG (!!)
     jmp     dword [ss:PATM_CALL_PATCH_TARGET_ADDR]
-
-PATMLookupAndCallEnd:
-; returning here -> do not add code here or after the jmp!!!!!
+    ; returning here -> do not add code here or after the jmp!!!!!
 ENDPROC PATMLookupAndCall
 
@@ -2225,36 +1970,21 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLookupAndCallRecord
-    RTCCPTR_DEF PATMLookupAndCallStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMLookupAndCallEnd - PATMLookupAndCallStart
 %ifdef PATM_LOG_PATCHINSTR
-    DD      10
+    PATCHASMRECORD_INIT PATMLookupAndCall, 10
 %else
-    DD      9
-%endif
-    DD      PATM_CALL_RETURN_ADDR
-    DD      0
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      PATM_PATCHBASE
-    DD      0
-    DD      PATM_STACKPTR
-    DD      0
-    DD      PATM_STACKBASE
-    DD      0
-    DD      PATM_STACKBASE_GUEST
-    DD      0
-    DD      PATM_CALL_PATCH_TARGET_ADDR
-    DD      0
-%ifdef PATM_LOG_PATCHINSTR
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_CALL_RETURN_ADDR
-    DD      0
-    DD      PATM_CALL_PATCH_TARGET_ADDR
-    DD      0
+    PATCHASMRECORD_INIT PATMLookupAndCall, 9
+%endif
+    DD      PATM_CALL_RETURN_ADDR,       0
+    DD      PATM_PENDINGACTION,          0
+    DD      PATM_PATCHBASE,              0
+    DD      PATM_STACKPTR,               0
+    DD      PATM_STACKBASE,              0
+    DD      PATM_STACKBASE_GUEST,        0
+    DD      PATM_CALL_PATCH_TARGET_ADDR, 0
+%ifdef PATM_LOG_PATCHINSTR               
+    DD      PATM_PENDINGACTION,          0
+%endif                                   
+    DD      PATM_CALL_RETURN_ADDR,       0
+    DD      PATM_CALL_PATCH_TARGET_ADDR, 0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2269,7 +1999,7 @@
 ;
 ; @note NEVER change this without bumping the SSM version
+;
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMLookupAndJump
-PATMLookupAndJumpStart:
     push    eax
     push    edx
@@ -2337,6 +2067,4 @@
     ; the jump destination will set PATM_INTERRUPTFLAG (!!)
     jmp     dword [ss:PATM_TEMP_EAX]                      ; call duplicated patch destination address
-
-PATMLookupAndJumpEnd:
 ENDPROC PATMLookupAndJump
 
@@ -2344,20 +2072,10 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLookupAndJumpRecord
-    RTCCPTR_DEF PATMLookupAndJumpStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMLookupAndJumpEnd - PATMLookupAndJumpStart
-    DD      5
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      PATM_PATCHBASE
-    DD      0
-    DD      PATM_TEMP_EAX
-    DD      0
-    DD      PATM_TEMP_EFLAGS
-    DD      0
-    DD      PATM_TEMP_EAX
-    DD      0
+    PATCHASMRECORD_INIT PATMLookupAndJump, 5
+    DD      PATM_PENDINGACTION, 0
+    DD      PATM_PATCHBASE,     0
+    DD      PATM_TEMP_EAX,      0
+    DD      PATM_TEMP_EFLAGS,   0
+    DD      PATM_TEMP_EAX,      0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2370,5 +2088,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMCall
-PATMCallStart:
     pushfd
     push    PATM_FIXUP              ; fixup for jump table below
@@ -2385,5 +2102,5 @@
 %ifdef DEBUG
     ; for disassembly
-    jmp     PATMCallEnd
+    jmp     NAME(PATMCall_EndProc)
 %endif
 
@@ -2395,6 +2112,5 @@
     TIMES PATCHDIRECTJUMPTABLE_SIZE DB 0        ; only one lookup slot
 
-PATMCallEnd:
-; returning here -> do not add code here or after the jmp!!!!!
+    ; returning here -> do not add code here or after the jmp!!!!!
 ENDPROC PATMCall
 
@@ -2402,20 +2118,10 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCallRecord
-    RTCCPTR_DEF PATMCallStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMCallEnd - PATMCallStart
-    DD      5
-    DD      PATM_FIXUP
-    DD      PATMCallTable - PATMCallStart
-    DD      PATM_PATCHNEXTBLOCK
-    DD      0
-    DD      PATM_RETURNADDR
-    DD      0
-    DD      PATM_LOOKUP_AND_CALL_FUNCTION
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMCall, 5
+    DD      PATM_FIXUP,                     PATMCallTable - NAME(PATMCall)
+    DD      PATM_PATCHNEXTBLOCK,            0
+    DD      PATM_RETURNADDR,                0
+    DD      PATM_LOOKUP_AND_CALL_FUNCTION,  0
+    DD      PATM_INTERRUPTFLAG,             0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2427,5 +2133,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMCallIndirect
-PATMCallIndirectStart:
     pushfd
     push    PATM_FIXUP              ; fixup for jump table below
@@ -2442,5 +2147,5 @@
 %ifdef DEBUG
     ; for disassembly
-    jmp     PATMCallIndirectEnd
+    jmp     NAME(PATMCallIndirect_EndProc)
 %endif
 
@@ -2452,6 +2157,5 @@
     TIMES PATCHJUMPTABLE_SIZE DB 0              ; lookup slots
 
-PATMCallIndirectEnd:
-; returning here -> do not add code here or after the jmp!!!!!
+    ; returning here -> do not add code here or after the jmp!!!!!
 ENDPROC PATMCallIndirect
 
@@ -2459,20 +2163,10 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCallIndirectRecord
-    RTCCPTR_DEF PATMCallIndirectStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMCallIndirectEnd - PATMCallIndirectStart
-    DD      5
-    DD      PATM_FIXUP
-    DD      PATMCallIndirectTable - PATMCallIndirectStart
-    DD      PATM_PATCHNEXTBLOCK
-    DD      0
-    DD      PATM_RETURNADDR
-    DD      0
-    DD      PATM_LOOKUP_AND_CALL_FUNCTION
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMCallIndirect, 5
+    DD      PATM_FIXUP,                     PATMCallIndirectTable - NAME(PATMCallIndirect)
+    DD      PATM_PATCHNEXTBLOCK,            0
+    DD      PATM_RETURNADDR,                0
+    DD      PATM_LOOKUP_AND_CALL_FUNCTION,  0
+    DD      PATM_INTERRUPTFLAG,             0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2485,5 +2179,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMJumpIndirect
-PATMJumpIndirectStart:
     ; save flags (just to be sure)
     pushfd
@@ -2505,5 +2198,5 @@
 %ifdef DEBUG
     ; for disassembly
-    jmp     PATMJumpIndirectEnd
+    jmp     NAME(PATMJumpIndirect_EndProc)
 %endif
 
@@ -2515,6 +2208,5 @@
     TIMES PATCHJUMPTABLE_SIZE DB 0              ; lookup slots
 
-PATMJumpIndirectEnd:
-; returning here -> do not add code here or after the jmp!!!!!
+    ; returning here -> do not add code here or after the jmp!!!!!
 ENDPROC PATMJumpIndirect
 
@@ -2522,20 +2214,10 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmJumpIndirectRecord
-    RTCCPTR_DEF PATMJumpIndirectStart
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMJumpIndirectEnd - PATMJumpIndirectStart
-    DD      5
-    DD      PATM_TEMP_EFLAGS
-    DD      0
-    DD      PATM_FIXUP
-    DD      PATMJumpIndirectTable - PATMJumpIndirectStart
-    DD      PATM_LOOKUP_AND_JUMP_FUNCTION
-    DD      0
-    DD      PATM_TEMP_EFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMJumpIndirect, 5
+    DD      PATM_TEMP_EFLAGS,               0
+    DD      PATM_FIXUP,                     PATMJumpIndirectTable - NAME(PATMJumpIndirect)
+    DD      PATM_LOOKUP_AND_JUMP_FUNCTION,  0
+    DD      PATM_TEMP_EFLAGS,               0
+    DD      PATM_INTERRUPTFLAG,             0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2546,5 +2228,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMRet
-PATMRet_Start:
     ; probe stack here as we can't recover from page faults later on
     not     dword [esp-32]
@@ -2583,23 +2264,13 @@
                                                 ; caller will duplicate the ret or ret n instruction
                                                 ; the patched call will set PATM_INTERRUPTFLAG after the return!
-PATMRet_End:
 ENDPROC     PATMRet
 
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmRetRecord
-    RTCCPTR_DEF PATMRet_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMRet_End - PATMRet_Start
-    DD      4
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_FIXUP
-    DD      PATMRetTable - PATMRet_Start
-    DD      PATM_RETURN_FUNCTION
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT PATMRet, 4
+    DD      PATM_INTERRUPTFLAG,   0
+    DD      PATM_FIXUP,           PATMRetTable - NAME(PATMRet)
+    DD      PATM_RETURN_FUNCTION, 0
+    DD      PATM_INTERRUPTFLAG,   0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2622,7 +2293,7 @@
 ;
 ; @note NEVER change this without bumping the SSM version
+;
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMRetFunction
-PATMRetFunction_Start:
     push    ecx
     push    edx
@@ -2749,41 +2420,25 @@
     pop     ecx
     ret
-
-PATMRetFunction_End:
 ENDPROC     PATMRetFunction
 
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmRetFunctionRecord
-    RTCCPTR_DEF PATMRetFunction_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMRetFunction_End - PATMRetFunction_Start
 %ifdef PATM_LOG_PATCHINSTR
-    DD      9
+    PATCHASMRECORD_INIT PATMRetFunction, 9
 %else
-    DD      7
-%endif
-    DD      PATM_STACKPTR
-    DD      0
-    DD      PATM_STACKPTR
-    DD      0
-    DD      PATM_STACKBASE_GUEST
-    DD      0
-    DD      PATM_STACKBASE
-    DD      0
-    DD      PATM_PATCHBASE
-    DD      0
-%ifdef PATM_LOG_PATCHINSTR
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_PENDINGACTION
-    DD      0
-    DD      PATM_PATCHBASE
-    DD      0
-%ifdef PATM_LOG_PATCHINSTR
-    DD      PATM_PENDINGACTION
-    DD      0
+    PATCHASMRECORD_INIT PATMRetFunction, 7
+%endif
+    DD      PATM_STACKPTR,        0
+    DD      PATM_STACKPTR,        0
+    DD      PATM_STACKBASE_GUEST, 0
+    DD      PATM_STACKBASE,       0
+    DD      PATM_PATCHBASE,       0
+%ifdef PATM_LOG_PATCHINSTR        
+    DD      PATM_PENDINGACTION,   0
+%endif                            
+    DD      PATM_PENDINGACTION,   0
+    DD      PATM_PATCHBASE,       0
+%ifdef PATM_LOG_PATCHINSTR        
+    DD      PATM_PENDINGACTION,   0
 %endif
     DD      0ffffffffh, 0ffffffffh
@@ -2795,5 +2450,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMCheckIF
-PATMCheckIF_Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushf
@@ -2805,5 +2459,5 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-    jmp     PATMCheckIF_End
+    jmp     NAME(PATMCheckIF_EndProc)
 
 PATMCheckIF_Safe:
@@ -2827,5 +2481,4 @@
 PATMCheckIF_Jump:
     DD      PATM_JUMPDELTA
-PATMCheckIF_End:
 ENDPROC     PATMCheckIF
 
@@ -2833,28 +2486,17 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCheckIFRecord
-    RTCCPTR_DEF PATMCheckIF_Start
-    DD      PATMCheckIF_Jump - PATMCheckIF_Start
-    DD      0
-    DD      0
-    DD      PATMCheckIF_End - PATMCheckIF_Start
 %ifdef PATM_LOG_PATCHINSTR
-    DD      6
+    PATCHASMRECORD_INIT_JUMP PATMCheckIF, PATMCheckIF_Jump, 6
 %else
-    DD      5
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_STACKPTR
-    DD      0
-%ifdef PATM_LOG_PATCHINSTR
-    DD      PATM_PENDINGACTION
-    DD      0
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT_JUMP PATMCheckIF, PATMCheckIF_Jump, 5
+%endif
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_STACKPTR,      0
+%ifdef PATM_LOG_PATCHINSTR      
+    DD      PATM_PENDINGACTION, 0
+%endif                          
+    DD      PATM_INTERRUPTFLAG, 0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2865,5 +2507,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMJumpToGuest_IF1
-PATMJumpToGuest_IF1_Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushf
@@ -2884,5 +2525,4 @@
 PATMJumpToGuest_IF1_Jump:
     DD      PATM_JUMPDELTA
-PATMJumpToGuest_IF1_End:
 ENDPROC     PATMJumpToGuest_IF1
 
@@ -2890,18 +2530,9 @@
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME PATMJumpToGuest_IF1Record
-    RTCCPTR_DEF PATMJumpToGuest_IF1_Start
-    DD      PATMJumpToGuest_IF1_Jump - PATMJumpToGuest_IF1_Start
-    DD      0
-    DD      0
-    DD      PATMJumpToGuest_IF1_End - PATMJumpToGuest_IF1_Start
-    DD      4
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_VMFLAGS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT_JUMP PATMJumpToGuest_IF1, PATMJumpToGuest_IF1_Jump, 4
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_INTERRUPTFLAG, 0
     DD      0ffffffffh, 0ffffffffh
 
@@ -2912,5 +2543,4 @@
 BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMMovFromSS
-PATMMovFromSS_Start:
     push    eax
     pushfd
@@ -2924,22 +2554,16 @@
     popfd
     pop     eax
-PATMMovFromSS_Start_End:
 ENDPROC PATMMovFromSS
 
 BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmMovFromSSRecord
-    RTCCPTR_DEF PATMMovFromSS_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMMovFromSS_Start_End - PATMMovFromSS_Start
-    DD      0
-    DD      0ffffffffh, 0ffffffffh
-
-
-
-
-SECTION .rodata
-; For assertion during init (to make absolutely sure the flags are in sync in vm.mac & vm.h)
+    PATCHASMRECORD_INIT PATMMovFromSS, 0
+    DD      0ffffffffh, 0ffffffffh
+
+
+
+
+;; For assertion during init (to make absolutely sure the flags are in sync in vm.mac & vm.h)
+BEGINCONST
 GLOBALNAME g_fPatmInterruptFlag
     DD      VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
