Index: /trunk/src/VBox/VMM/VMMR3/PATMA.asm
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PATMA.asm	(revision 54687)
+++ /trunk/src/VBox/VMM/VMMR3/PATMA.asm	(revision 54688)
@@ -4,5 +4,5 @@
 ;
 
-; Copyright (C) 2006-2012 Oracle Corporation
+; Copyright (C) 2006-2015 Oracle Corporation
 ;
 ; This file is part of VirtualBox Open Source Edition (OSE), as
@@ -35,4 +35,7 @@
 %include "PATMA.mac"
 
+;*******************************************************************************
+;*  Defined Constants And Macros                                               *
+;*******************************************************************************
 %ifdef DEBUG
 ; Noisy, but useful for debugging certain problems
@@ -41,9 +44,60 @@
 %endif
 
-BEGINCONST
-
+;;
+; Simple PATCHASMRECORD initializer
+; @param %1     The patch function name.
+; @param %2     The number of fixups.
+;
+%macro PATCHASMRECORD_INIT 2
+istruc PATCHASMRECORD
+    at PATCHASMRECORD.pbFunction,     RTCCPTR_DEF NAME(%1)
+    at PATCHASMRECORD.offJump,        DD          0
+    at PATCHASMRECORD.offRelJump,     DD          0
+    at PATCHASMRECORD.offSizeOverride,DD          0
+    at PATCHASMRECORD.cbFunction,     DD          NAME(%1 %+ _EndProc) - NAME(%1)
+    at PATCHASMRECORD.cRelocs,        DD          %2
+iend                                                         
+%endmacro
+
+;;
+; Simple PATCHASMRECORD initializer
+; @param %1     The patch function name.
+; @param %2     Jump lable.
+; @param %3     The number of fixups.
+;
+%macro PATCHASMRECORD_INIT_JUMP 3
+istruc PATCHASMRECORD
+    at PATCHASMRECORD.pbFunction,     RTCCPTR_DEF NAME(%1)
+    at PATCHASMRECORD.offJump,        DD          %2 - NAME(%1)
+    at PATCHASMRECORD.offRelJump,     DD          0
+    at PATCHASMRECORD.offSizeOverride,DD          0
+    at PATCHASMRECORD.cbFunction,     DD          NAME(%1 %+ _EndProc) - NAME(%1)
+    at PATCHASMRECORD.cRelocs,        DD          %3
+iend                                                         
+%endmacro
+
+;;
+; Switches to the code section and aligns the function.
+%macro BEGIN_PATCH_CODE_SECTION 0
+BEGINCODE
+align 32
+%endmacro
+
+;;
+; Switches to the data section for the read-only patch descriptor data and 
+; aligns it appropriately.
+%macro BEGIN_PATCH_RODATA_SECTION 0   
+BEGINDATA
+align 16
+%endmacro
+
+
+;
+; Switch to 32-bit mode (x86).
+;
 %ifdef RT_ARCH_AMD64
- BITS 32 ; switch to 32-bit mode (x86).
-%endif
+ BITS 32 
+%endif
+
 
 %ifdef VBOX_WITH_STATISTICS
@@ -51,6 +105,6 @@
 ; Patch call statistics
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMStats
-PATMStats_Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushf
@@ -59,83 +113,55 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMStats_End:
 ENDPROC     PATMStats
-
 
 ; Patch record for statistics
 GLOBALNAME g_patmStatsRecord
-    RTCCPTR_DEF PATMStats_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMStats_End - PATMStats_Start
-    DD      4
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_ALLPATCHCALLS
-    DD      0
-    DD      PATM_PERPATCHCALLS
-    DD      0
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
-%endif
+    PATCHASMRECORD_INIT PATMStats, 4
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      PATM_ALLPATCHCALLS, 0
+    DD      PATM_PERPATCHCALLS, 0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
+%endif ; VBOX_WITH_STATISTICS
+
 
 ;
 ; Set PATM_INTERRUPTFLAG
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMSetPIF
-PATMSetPIF_Start:
-    mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMSetPIF_End:
+    mov     dword [ss:PATM_INTERRUPTFLAG], 1
 ENDPROC     PATMSetPIF
 
-
-SECTION .data
 ; Patch record for setting PATM_INTERRUPTFLAG
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmSetPIFRecord
-    RTCCPTR_DEF PATMSetPIF_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMSetPIF_End - PATMSetPIF_Start
-    DD      1
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
-SECTION .text
+    PATCHASMRECORD_INIT PATMSetPIF, 1
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
 
 ;
 ; Clear PATM_INTERRUPTFLAG
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMClearPIF
-PATMClearPIF_Start:
     ; probe stack here as we can't recover from page faults later on
     not     dword [esp-64]
     not     dword [esp-64]
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
-PATMClearPIF_End:
 ENDPROC     PATMClearPIF
 
-
-SECTION .data
 ; Patch record for clearing PATM_INTERRUPTFLAG
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmClearPIFRecord
-    RTCCPTR_DEF PATMClearPIF_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMClearPIF_End - PATMClearPIF_Start
-    DD      1
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
-SECTION .text
+    PATCHASMRECORD_INIT PATMClearPIF, 1
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
 
 ;
 ; Clear PATM_INHIBITIRQADDR and fault if IF=0
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMClearInhibitIRQFaultIF0
-PATMClearInhibitIRQFaultIF0_Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     mov     dword [ss:PATM_INHIBITIRQADDR], 0
@@ -170,49 +196,30 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMClearInhibitIRQFaultIF0_End:
 ENDPROC     PATMClearInhibitIRQFaultIF0
 
-
-SECTION .data
 ; Patch record for clearing PATM_INHIBITIRQADDR
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmClearInhibitIRQFaultIF0Record
-    RTCCPTR_DEF PATMClearInhibitIRQFaultIF0_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMClearInhibitIRQFaultIF0_End - PATMClearInhibitIRQFaultIF0_Start
-    DD      12
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INHIBITIRQADDR
-    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      PATM_INTERRUPTFLAG
-    DD      0
-    DD      0ffffffffh
-SECTION .text
+    PATCHASMRECORD_INIT PATMClearInhibitIRQFaultIF0, 12
+    DD      PATM_INTERRUPTFLAG,      0
+    DD      PATM_INHIBITIRQADDR,     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      PATM_INTERRUPTFLAG,      0
+    DD      0ffffffffh, 0ffffffffh
+
 
 ;
 ; Clear PATM_INHIBITIRQADDR and continue if IF=0 (duplicated function only; never jump back to guest code afterwards!!)
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMClearInhibitIRQContIF0
-PATMClearInhibitIRQContIF0_Start:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     mov     dword [ss:PATM_INHIBITIRQADDR], 0
@@ -242,45 +249,29 @@
     popf
     mov     dword [ss:PATM_INTERRUPTFLAG], 1
-PATMClearInhibitIRQContIF0_End:
 ENDPROC     PATMClearInhibitIRQContIF0
 
-
-SECTION .data
 ; Patch record for clearing PATM_INHIBITIRQADDR
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmClearInhibitIRQContIF0Record
-    RTCCPTR_DEF PATMClearInhibitIRQContIF0_Start
-    DD      0
-    DD      0
-    DD      0
-    DD      PATMClearInhibitIRQContIF0_End - PATMClearInhibitIRQContIF0_Start
-    DD      11
-    DD      PATM_INTERRUPTFLAG
-    DD      0
-    DD      PATM_INHIBITIRQADDR
-    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
-SECTION .text
-
-
+    PATCHASMRECORD_INIT PATMClearInhibitIRQContIF0, 11
+    DD      PATM_INTERRUPTFLAG,      0   
+    DD      PATM_INHIBITIRQADDR,     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
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMCliReplacement
-PATMCliStart:
     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     pushf
@@ -303,35 +294,27 @@
 PATMCliJump:
     DD      PATM_JUMPDELTA
-PATMCliEnd:
 ENDPROC     PATMCliReplacement
 
-
-SECTION .data
 ; Patch record for 'cli'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCliRecord
-    RTCCPTR_DEF PATMCliStart
-    DD      PATMCliJump - PATMCliStart
-    DD      0
-    DD      0
-    DD      PATMCliEnd - PATMCliStart
 %ifdef PATM_LOG_PATCHINSTR
-    DD      4
+    PATCHASMRECORD_INIT_JUMP PATMCliReplacement, PATMCliJump, 4
 %else
-    DD      3
-%endif
-    DD      PATM_INTERRUPTFLAG
-    DD      0
+    PATCHASMRECORD_INIT_JUMP PATMCliReplacement, PATMCliJump, 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
-SECTION .text
-
-
+    DD      PATM_PENDINGACTION, 0
+%endif
+    DD      PATM_VMFLAGS,       0
+    DD      PATM_INTERRUPTFLAG, 0
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMStiReplacement
 PATMStiStart:
@@ -355,6 +338,6 @@
 ENDPROC     PATMStiReplacement
 
-SECTION .data
 ; Patch record for 'sti'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmStiRecord
     RTCCPTR_DEF PATMStiStart
@@ -383,5 +366,5 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
+
 
 ;
@@ -398,4 +381,5 @@
 ; esp      - EIP
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMTrapEntry
 PATMTrapEntryStart:
@@ -444,7 +428,6 @@
 ENDPROC     PATMTrapEntry
 
-
-SECTION .data
 ; Patch record for trap gate entrypoint
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmTrapEntryRecord
     RTCCPTR_DEF PATMTrapEntryStart
@@ -469,5 +452,5 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
+
 
 ;
@@ -485,4 +468,5 @@
 ; esp      - error code
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMTrapEntryErrorCode
 PATMTrapErrorCodeEntryStart:
@@ -531,7 +515,6 @@
 ENDPROC     PATMTrapEntryErrorCode
 
-
-SECTION .data
 ; Patch record for trap gate entrypoint
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmTrapEntryRecordErrorCode
     RTCCPTR_DEF PATMTrapErrorCodeEntryStart
@@ -556,5 +539,4 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
 
 
@@ -572,4 +554,5 @@
 ; esp      - EIP
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIntEntry
 PATMIntEntryStart:
@@ -615,7 +598,6 @@
 ENDPROC     PATMIntEntry
 
-
-SECTION .data
 ; Patch record for interrupt gate entrypoint
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIntEntryRecord
     RTCCPTR_DEF PATMIntEntryStart
@@ -640,5 +622,5 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
+
 
 ;
@@ -656,4 +638,5 @@
 ; esp      - error code
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIntEntryErrorCode
 PATMIntEntryErrorCodeStart:
@@ -699,7 +682,6 @@
 ENDPROC     PATMIntEntryErrorCode
 
-
-SECTION .data
 ; Patch record for interrupt gate entrypoint
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIntEntryRecordErrorCode
     RTCCPTR_DEF PATMIntEntryErrorCodeStart
@@ -724,9 +706,10 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
+
 
 ;
 ; 32 bits Popf replacement that faults when IF remains 0
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPopf32Replacement
 PATMPopf32Start:
@@ -786,7 +769,6 @@
 ENDPROC     PATMPopf32Replacement
 
-
-SECTION .data
 ; Patch record for 'popfd'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPopf32Record
     RTCCPTR_DEF PATMPopf32Start
@@ -827,7 +809,10 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
-
+
+
+;
 ; no need to check the IF flag when popf isn't an exit point of a patch (e.g. function duplication)
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPopf32Replacement_NoExit
 PATMPopf32_NoExitStart:
@@ -880,7 +865,6 @@
 ENDPROC     PATMPopf32Replacement_NoExit
 
-
-SECTION .data
 ; Patch record for 'popfd'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPopf32Record_NoExit
     RTCCPTR_DEF PATMPopf32_NoExitStart
@@ -925,5 +909,4 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
 
 
@@ -931,4 +914,5 @@
 ; 16 bits Popf replacement that faults when IF remains 0
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPopf16Replacement
 PATMPopf16Start:
@@ -964,7 +948,6 @@
 ENDPROC     PATMPopf16Replacement
 
-
-SECTION .data
 ; Patch record for 'popf'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPopf16Record
     RTCCPTR_DEF PATMPopf16Start
@@ -993,9 +976,11 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
+
 
 ;
 ; 16 bits Popf replacement that faults when IF remains 0
 ; @todo not necessary to fault in that case (see 32 bits version)
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPopf16Replacement_NoExit
 PATMPopf16Start_NoExit:
@@ -1027,7 +1012,6 @@
 ENDPROC     PATMPopf16Replacement_NoExit
 
-
-SECTION .data
 ; Patch record for 'popf'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPopf16Record_NoExit
     RTCCPTR_DEF PATMPopf16Start_NoExit
@@ -1056,7 +1040,10 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
-
-
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPushf32Replacement
 PATMPushf32Start:
@@ -1086,7 +1073,6 @@
 ENDPROC     PATMPushf32Replacement
 
-
-SECTION .data
 ; Patch record for 'pushfd'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPushf32Record
     RTCCPTR_DEF PATMPushf32Start
@@ -1111,7 +1097,10 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
-
-
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPushf16Replacement
 PATMPushf16Start:
@@ -1135,7 +1124,6 @@
 ENDPROC     PATMPushf16Replacement
 
-
-SECTION .data
 ; Patch record for 'pushf'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPushf16Record
     RTCCPTR_DEF PATMPushf16Start
@@ -1152,7 +1140,10 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
-
-
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMPushCSReplacement
 PATMPushCSStart:
@@ -1177,7 +1168,6 @@
 ENDPROC     PATMPushCSReplacement
 
-
-SECTION .data
 ; Patch record for 'push cs'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmPushCSRecord
     RTCCPTR_DEF PATMPushCSStart
@@ -1192,5 +1182,5 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
+
 
 ;;****************************************************
@@ -1225,4 +1215,5 @@
 ; esp      - EIP
 ;;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIretReplacement
 PATMIretStart:
@@ -1392,6 +1383,6 @@
 ENDPROC     PATMIretReplacement
 
-SECTION .data
 ; Patch record for 'iretd'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIretRecord
     RTCCPTR_DEF PATMIretStart
@@ -1460,5 +1451,5 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
+
 
 ;;****************************************************
@@ -1493,4 +1484,5 @@
 ; esp      - EIP
 ;;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIretRing1Replacement
 PATMIretRing1Start:
@@ -1690,6 +1682,6 @@
 ENDPROC     PATMIretRing1Replacement
 
-SECTION .data
 ; Patch record for 'iretd'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIretRing1Record
     RTCCPTR_DEF PATMIretRing1Start
@@ -1758,5 +1750,4 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
 
 
@@ -1778,5 +1769,5 @@
 ;
 ; @note NEVER change this without bumping the SSM version
-align 32
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMIretFunction
 PATMIretFunction_Start:
@@ -1842,5 +1833,5 @@
 ENDPROC     PATMIretFunction
 
-SECTION .data
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmIretFunctionRecord
     RTCCPTR_DEF PATMIretFunction_Start
@@ -1855,8 +1846,10 @@
     DD      0
     DD      0ffffffffh
-SECTION .text
-
-
-align 32 ; yasm / nasm diff - remove me!
+
+
+;
+; PATMCpuidReplacement
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMCpuidReplacement
 PATMCpuidStart:
@@ -1910,6 +1903,6 @@
 ENDPROC PATMCpuidReplacement
 
-SECTION .data
 ; Patch record for 'cpuid'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCpuidRecord 
     istruc PATCHASMRECORD
@@ -1931,7 +1924,10 @@
     DD      PATM_INTERRUPTFLAG,     0       ; 8
     DD      0ffffffffh, 0ffffffffh          ; 9 - for sanity checks
-SECTION .text
-
-
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMJEcxReplacement
 PATMJEcxStart:
@@ -1955,6 +1951,6 @@
 ENDPROC PATMJEcxReplacement
 
-SECTION .data
 ; Patch record for 'JEcx'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmJEcxRecord
     RTCCPTR_DEF PATMJEcxStart
@@ -1970,8 +1966,11 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
-align 32; yasm / nasm diffing. remove me!
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMLoopReplacement
 PATMLoopStart:
@@ -1995,6 +1994,6 @@
 ENDPROC PATMLoopReplacement
 
-SECTION .data
 ; Patch record for 'Loop'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLoopRecord
     RTCCPTR_DEF PATMLoopStart
@@ -2010,7 +2009,11 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMLoopZReplacement
 PATMLoopZStart:
@@ -2037,6 +2040,6 @@
 ENDPROC PATMLoopZReplacement
 
-SECTION .data
 ; Patch record for 'Loopz'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLoopZRecord
     RTCCPTR_DEF PATMLoopZStart
@@ -2052,8 +2055,11 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
-
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
+;
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMLoopNZReplacement
 PATMLoopNZStart:
@@ -2080,6 +2086,6 @@
 ENDPROC PATMLoopNZReplacement
 
-SECTION .data
 ; Patch record for 'LoopNZ'
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLoopNZRecord
     RTCCPTR_DEF PATMLoopNZStart
@@ -2095,8 +2101,8 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
-align 32
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
 ; Global patch function for indirect calls
 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and doing:
@@ -2109,4 +2115,5 @@
 ;
 ; @note NEVER change this without bumping the SSM version
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMLookupAndCall
 PATMLookupAndCallStart:
@@ -2215,6 +2222,6 @@
 ENDPROC PATMLookupAndCall
 
-SECTION .data
 ; Patch record for indirect calls and jumps
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLookupAndCallRecord
     RTCCPTR_DEF PATMLookupAndCallStart
@@ -2250,9 +2257,8 @@
     DD      PATM_CALL_PATCH_TARGET_ADDR
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
-
-align 32
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
 ; Global patch function for indirect jumps
 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and doing:
@@ -2263,4 +2269,5 @@
 ;
 ; @note NEVER change this without bumping the SSM version
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMLookupAndJump
 PATMLookupAndJumpStart:
@@ -2334,6 +2341,6 @@
 ENDPROC PATMLookupAndJump
 
-SECTION .data
 ; Patch record for indirect calls and jumps
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmLookupAndJumpRecord
     RTCCPTR_DEF PATMLookupAndJumpStart
@@ -2353,11 +2360,7 @@
     DD      PATM_TEMP_EAX
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
-
-
-
-align 32
+    DD      0ffffffffh, 0ffffffffh
+
+
 ; Patch function for static calls
 ; @note static calls have only one lookup slot!
@@ -2365,4 +2368,5 @@
 ;   push    [pTargetGC]
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMCall
 PATMCallStart:
@@ -2395,6 +2399,6 @@
 ENDPROC PATMCall
 
-SECTION .data
 ; Patch record for direct calls
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCallRecord
     RTCCPTR_DEF PATMCallStart
@@ -2414,13 +2418,12 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
-
-align 32
+    DD      0ffffffffh, 0ffffffffh
+
+
 ; Patch function for indirect calls
 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and adding:
 ;   push    [pTargetGC]
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMCallIndirect
 PATMCallIndirectStart:
@@ -2453,6 +2456,6 @@
 ENDPROC PATMCallIndirect
 
-SECTION .data
 ; Patch record for indirect calls
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCallIndirectRecord
     RTCCPTR_DEF PATMCallIndirectStart
@@ -2472,13 +2475,13 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
-
-align 32
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
 ; Patch function for indirect jumps
 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and adding:
 ;   push    [pTargetGC]
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMJumpIndirect
 PATMJumpIndirectStart:
@@ -2516,6 +2519,6 @@
 ENDPROC PATMJumpIndirect
 
-SECTION .data
 ; Patch record for indirect jumps
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmJumpIndirectRecord
     RTCCPTR_DEF PATMJumpIndirectStart
@@ -2535,11 +2538,11 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
+    DD      0ffffffffh, 0ffffffffh
+
 
 ;
 ; return from duplicated function
 ;
-align 32
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMRet
 PATMRet_Start:
@@ -2583,5 +2586,5 @@
 ENDPROC     PATMRet
 
-SECTION .data
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmRetRecord
     RTCCPTR_DEF PATMRet_Start
@@ -2599,6 +2602,6 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
+    DD      0ffffffffh, 0ffffffffh
+
 
 ;
@@ -2619,5 +2622,5 @@
 ;
 ; @note NEVER change this without bumping the SSM version
-align 32
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMRetFunction
 PATMRetFunction_Start:
@@ -2750,5 +2753,5 @@
 ENDPROC     PATMRetFunction
 
-SECTION .data
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmRetFunctionRecord
     RTCCPTR_DEF PATMRetFunction_Start
@@ -2784,6 +2787,5 @@
     DD      0
 %endif
-    DD      0ffffffffh
-SECTION .text
+    DD      0ffffffffh, 0ffffffffh
 
 
@@ -2791,4 +2793,5 @@
 ; Jump to original instruction if IF=1
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMCheckIF
 PATMCheckIF_Start:
@@ -2827,6 +2830,6 @@
 ENDPROC     PATMCheckIF
 
-SECTION .data
 ; Patch record for call instructions
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmCheckIFRecord
     RTCCPTR_DEF PATMCheckIF_Start
@@ -2854,10 +2857,11 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
+    DD      0ffffffffh, 0ffffffffh
+
 
 ;
 ; Jump back to guest if IF=1, else fault
 ;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC   PATMJumpToGuest_IF1
 PATMJumpToGuest_IF1_Start:
@@ -2883,6 +2887,6 @@
 ENDPROC     PATMJumpToGuest_IF1
 
-SECTION .data
 ; Patch record for call instructions
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME PATMJumpToGuest_IF1Record
     RTCCPTR_DEF PATMJumpToGuest_IF1_Start
@@ -2900,9 +2904,11 @@
     DD      PATM_INTERRUPTFLAG
     DD      0
-    DD      0ffffffffh
-SECTION .text
-
-
-; check and correct RPL of pushed ss
+    DD      0ffffffffh, 0ffffffffh
+
+
+;
+; Check and correct RPL of pushed ss.
+;
+BEGIN_PATCH_CODE_SECTION
 BEGINPROC PATMMovFromSS
 PATMMovFromSS_Start:
@@ -2921,5 +2927,5 @@
 ENDPROC PATMMovFromSS
 
-SECTION .data
+BEGIN_PATCH_RODATA_SECTION
 GLOBALNAME g_patmMovFromSSRecord
     RTCCPTR_DEF PATMMovFromSS_Start
@@ -2929,5 +2935,5 @@
     DD      PATMMovFromSS_Start_End - PATMMovFromSS_Start
     DD      0
-    DD      0ffffffffh
+    DD      0ffffffffh, 0ffffffffh
 
 
Index: /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp	(revision 54687)
+++ /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp	(revision 54688)
@@ -45,5 +45,12 @@
 #include "PATMPatch.h"
 
-/* internal structure for passing more information about call fixups to patmPatchGenCode */
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Internal structure for passing more information about call fixups to
+ * patmPatchGenCode.
+ */
 typedef struct
 {
@@ -54,5 +61,34 @@
 } PATMCALLINFO, *PPATMCALLINFO;
 
-int patmPatchAddReloc32(PVM pVM, PPATCHINFO pPatch, uint8_t *pRelocHC, uint32_t uType, RTRCPTR pSource, RTRCPTR pDest)
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+#define PATCHGEN_PROLOG_NODEF(pVM, pPatch) \
+    do { \
+        pPB = PATCHCODE_PTR_HC(pPatch) + pPatch->uCurPatchOffset; \
+        if (pPB + 256 >= pVM->patm.s.pPatchMemHC + pVM->patm.s.cbPatchMem) \
+        { \
+            pVM->patm.s.fOutOfMemory = true; \
+            Assert(pPB + 256 >= pVM->patm.s.pPatchMemHC + pVM->patm.s.cbPatchMem); \
+            return VERR_NO_MEMORY; \
+        } \
+    } while (0)
+
+#define PATCHGEN_PROLOG(pVM, pPatch) \
+    uint8_t *pPB; \
+    PATCHGEN_PROLOG_NODEF(pVM, pPatch)
+
+#define PATCHGEN_EPILOG(pPatch, size) \
+    do { \
+        Assert(size <= 640); \
+        pPatch->uCurPatchOffset += size; \
+    } while (0)
+
+
+
+
+int patmPatchAddReloc32(PVM pVM, PPATCHINFO pPatch, uint8_t *pRelocHC, uint32_t uType,
+                        RTRCPTR pSource /*= 0*/, RTRCPTR pDest /*= 0*/)
 {
     PRELOCREC pRec;
@@ -96,24 +132,4 @@
     return VINF_SUCCESS;
 }
-
-#define PATCHGEN_PROLOG_NODEF(pVM, pPatch)                                      \
-    pPB = PATCHCODE_PTR_HC(pPatch) + pPatch->uCurPatchOffset;            \
-                                                                               \
-    if (pPB + 256 >= pVM->patm.s.pPatchMemHC + pVM->patm.s.cbPatchMem)          \
-    {                                                                          \
-        pVM->patm.s.fOutOfMemory = true; \
-        Assert(pPB + 256 >= pVM->patm.s.pPatchMemHC + pVM->patm.s.cbPatchMem); \
-        return VERR_NO_MEMORY; \
-    }
-
-#define PATCHGEN_PROLOG(pVM, pPatch)                                      \
-    uint8_t *pPB;                                                         \
-    PATCHGEN_PROLOG_NODEF(pVM, pPatch);
-
-
-#define PATCHGEN_EPILOG(pPatch, size) \
-    Assert(size <= 640);              \
-    pPatch->uCurPatchOffset += size;
-
 
 static uint32_t patmPatchGenCode(PVM pVM, PPATCHINFO pPatch, uint8_t *pPB, PCPATCHASMRECORD pAsmRecord,
@@ -226,20 +242,16 @@
 
                 case PATM_CPUID_STD_PTR:
-                    /** @todo dirty hack when correcting this fixup (state restore) */
                     dest = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
                     break;
 
                 case PATM_CPUID_EXT_PTR:
-                    /** @todo dirty hack when correcting this fixup (state restore) */
                     dest = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM);
                     break;
 
                 case PATM_CPUID_CENTAUR_PTR:
-                    /** @todo dirty hack when correcting this fixup (state restore) */
                     dest = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
                     break;
 
                 case PATM_CPUID_DEF_PTR:
-                    /** @todo dirty hack when correcting this fixup (state restore) */
                     dest = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM);
                     break;
@@ -377,6 +389,6 @@
         *(uint32_t *)&pPB[pAsmRecord->offJump] = displ;
         patmPatchAddReloc32(pVM, pPatch, &pPB[pAsmRecord->offJump], FIXUP_REL_JMPTOGUEST,
-                        PATCHCODE_PTR_GC(pPatch) + pPatch->uCurPatchOffset + pAsmRecord->offJump - 1 + SIZEOF_NEARJUMP32,
-                        pReturnAddrGC);
+                            PATCHCODE_PTR_GC(pPatch) + pPatch->uCurPatchOffset + pAsmRecord->offJump - 1 + SIZEOF_NEARJUMP32,
+                            pReturnAddrGC);
     }
 
Index: /trunk/src/VBox/VMM/VMMR3/PATMSSM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PATMSSM.cpp	(revision 54687)
+++ /trunk/src/VBox/VMM/VMMR3/PATMSSM.cpp	(revision 54688)
@@ -1102,5 +1102,5 @@
  * @returns VBox status code.
  * @param   pVM             Pointer to the VM.
- * @param   ulSSMVersion    SSM version
+ * @param   uVersion        Saved state version.
  * @param   patmInfo        Saved PATM structure
  * @param   pPatch          Patch record
@@ -1109,5 +1109,6 @@
  * @param   pFixup          Fixup address
  */
-static void patmCorrectFixup(PVM pVM, unsigned ulSSMVersion, PATM &patmInfo, PPATCHINFO pPatch, PRELOCREC pRec, int32_t offset, RTRCPTR *pFixup)
+static void patmCorrectFixup(PVM pVM, unsigned uVersion, PATM &patmInfo, PPATCHINFO pPatch, PRELOCREC pRec,
+                             int32_t offset, RTRCPTR *pFixup)
 {
     int32_t delta = pVM->patm.s.pPatchMemGC - patmInfo.pPatchMemGC;
@@ -1120,142 +1121,138 @@
             break;
 
-        if (    *pFixup >= patmInfo.pGCStateGC
-            &&  *pFixup <  patmInfo.pGCStateGC + sizeof(PATMGCSTATE))
-        {
-            LogFlow(("Changing absolute GCState at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, *pFixup, (*pFixup - patmInfo.pGCStateGC) + pVM->patm.s.pGCStateGC));
-            *pFixup = (*pFixup - patmInfo.pGCStateGC) + pVM->patm.s.pGCStateGC;
-        }
-        else
-        if (    *pFixup >= patmInfo.pCPUMCtxGC
-            &&  *pFixup <  patmInfo.pCPUMCtxGC + sizeof(CPUMCTX))
-        {
-            LogFlow(("Changing absolute CPUMCTX at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, *pFixup, (*pFixup - patmInfo.pCPUMCtxGC) + pVM->patm.s.pCPUMCtxGC));
+        RTRCPTR const uFixup = *pFixup;
+        if (    uFixup >= patmInfo.pGCStateGC
+            &&  uFixup <  patmInfo.pGCStateGC + sizeof(PATMGCSTATE))
+        {
+            LogFlow(("Changing absolute GCState at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, uFixup, (uFixup - patmInfo.pGCStateGC) + pVM->patm.s.pGCStateGC));
+            *pFixup = (uFixup - patmInfo.pGCStateGC) + pVM->patm.s.pGCStateGC;
+        }
+        else if (   uFixup >= patmInfo.pCPUMCtxGC
+                 && uFixup <  patmInfo.pCPUMCtxGC + sizeof(CPUMCTX))
+        {
+            LogFlow(("Changing absolute CPUMCTX at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, uFixup, (uFixup - patmInfo.pCPUMCtxGC) + pVM->patm.s.pCPUMCtxGC));
 
             /* The CPUMCTX structure has completely changed, so correct the offsets too. */
-            if (ulSSMVersion == PATM_SAVED_STATE_VERSION_VER16)
+            if (uVersion == PATM_SAVED_STATE_VERSION_VER16)
             {
-                unsigned uCPUMOffset = *pFixup - patmInfo.pCPUMCtxGC;
+                unsigned offCpumCtx = uFixup - patmInfo.pCPUMCtxGC;
 
                 /* ''case RT_OFFSETOF()'' does not work as gcc refuses to use & as a constant expression.
                  * Defining RT_OFFSETOF as __builtin_offsetof for gcc would make this possible. But this
                  * function is not available in older gcc versions, at least not in gcc-3.3 */
-                if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr0))
-                {
-                    LogFlow(("Changing dr[0] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[0])));
+                if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr0))
+                {
+                    LogFlow(("Changing dr[0] offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, dr[0])));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[0]);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr1))
-                {
-                    LogFlow(("Changing dr[1] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[1])));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr1))
+                {
+                    LogFlow(("Changing dr[1] offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, dr[1])));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[1]);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr2))
-                {
-                    LogFlow(("Changing dr[2] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[2])));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr2))
+                {
+                    LogFlow(("Changing dr[2] offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, dr[2])));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[2]);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr3))
-                {
-                    LogFlow(("Changing dr[3] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[3])));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr3))
+                {
+                    LogFlow(("Changing dr[3] offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, dr[3])));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[3]);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr4))
-                {
-                    LogFlow(("Changing dr[4] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[4])));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr4))
+                {
+                    LogFlow(("Changing dr[4] offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, dr[4])));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[4]);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr5))
-                {
-                    LogFlow(("Changing dr[5] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[5])));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr5))
+                {
+                    LogFlow(("Changing dr[5] offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, dr[5])));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[5]);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr6))
-                {
-                    LogFlow(("Changing dr[6] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[6])));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr6))
+                {
+                    LogFlow(("Changing dr[6] offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, dr[6])));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[6]);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr7))
-                {
-                    LogFlow(("Changing dr[7] offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, dr[7])));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, dr7))
+                {
+                    LogFlow(("Changing dr[7] offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, dr[7])));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, dr[7]);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr0))
-                {
-                    LogFlow(("Changing cr0 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, cr0)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr0))
+                {
+                    LogFlow(("Changing cr0 offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, cr0)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, cr0);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr2))
-                {
-                    LogFlow(("Changing cr2 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, cr2)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr2))
+                {
+                    LogFlow(("Changing cr2 offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, cr2)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, cr2);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr3))
-                {
-                    LogFlow(("Changing cr3 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, cr3)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr3))
+                {
+                    LogFlow(("Changing cr3 offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, cr3)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, cr3);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr4))
-                {
-                    LogFlow(("Changing cr4 offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, cr4)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, cr4))
+                {
+                    LogFlow(("Changing cr4 offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, cr4)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, cr4);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, tr))
-                {
-                    LogFlow(("Changing tr offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, tr)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, tr))
+                {
+                    LogFlow(("Changing tr offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, tr)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, tr);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, ldtr))
-                {
-                    LogFlow(("Changing ldtr offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, ldtr)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, ldtr))
+                {
+                    LogFlow(("Changing ldtr offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, ldtr)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, ldtr);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, gdtr.pGdt))
-                {
-                    LogFlow(("Changing pGdt offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, gdtr.pGdt)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, gdtr.pGdt))
+                {
+                    LogFlow(("Changing pGdt offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, gdtr.pGdt)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, gdtr.pGdt);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, gdtr.cbGdt))
-                {
-                    LogFlow(("Changing cbGdt offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, gdtr.cbGdt)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, gdtr.cbGdt))
+                {
+                    LogFlow(("Changing cbGdt offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, gdtr.cbGdt)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, gdtr.cbGdt);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, idtr.pIdt))
-                {
-                    LogFlow(("Changing pIdt offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, idtr.pIdt)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, idtr.pIdt))
+                {
+                    LogFlow(("Changing pIdt offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, idtr.pIdt)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, idtr.pIdt);
                 }
-                else if (uCPUMOffset == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, idtr.cbIdt))
-                {
-                    LogFlow(("Changing cbIdt offset from %x to %x\n", uCPUMOffset, RT_OFFSETOF(CPUMCTX, idtr.cbIdt)));
+                else if (offCpumCtx == (unsigned)RT_OFFSETOF(CPUMCTX_VER1_6, idtr.cbIdt))
+                {
+                    LogFlow(("Changing cbIdt offset from %x to %x\n", offCpumCtx, RT_OFFSETOF(CPUMCTX, idtr.cbIdt)));
                     *pFixup = pVM->patm.s.pCPUMCtxGC + RT_OFFSETOF(CPUMCTX, idtr.cbIdt);
                 }
                 else
-                    AssertMsgFailed(("Unexpected CPUMCTX offset %x\n", uCPUMOffset));
+                    AssertMsgFailed(("Unexpected CPUMCTX offset %x\n", offCpumCtx));
             }
             else
-                *pFixup = (*pFixup - patmInfo.pCPUMCtxGC) + pVM->patm.s.pCPUMCtxGC;
-        }
-        else
-        if (    *pFixup >= patmInfo.pStatsGC
-            &&  *pFixup <  patmInfo.pStatsGC + PATM_STAT_MEMSIZE)
-        {
-            LogFlow(("Changing absolute Stats at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, *pFixup, (*pFixup - patmInfo.pStatsGC) + pVM->patm.s.pStatsGC));
-            *pFixup = (*pFixup - patmInfo.pStatsGC) + pVM->patm.s.pStatsGC;
-        }
-        else
-        if (    *pFixup >= patmInfo.pGCStackGC
-            &&  *pFixup <  patmInfo.pGCStackGC + PATM_STACK_TOTAL_SIZE)
-        {
-            LogFlow(("Changing absolute Stack at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, *pFixup, (*pFixup - patmInfo.pGCStackGC) + pVM->patm.s.pGCStackGC));
-            *pFixup = (*pFixup - patmInfo.pGCStackGC) + pVM->patm.s.pGCStackGC;
-        }
-        else
-        if (    *pFixup >= patmInfo.pPatchMemGC
-            &&  *pFixup <  patmInfo.pPatchMemGC + patmInfo.cbPatchMem)
-        {
-            LogFlow(("Changing absolute PatchMem at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, *pFixup, (*pFixup - patmInfo.pPatchMemGC) + pVM->patm.s.pPatchMemGC));
-            *pFixup = (*pFixup - patmInfo.pPatchMemGC) + pVM->patm.s.pPatchMemGC;
-        }
-        else
+                *pFixup = (uFixup - patmInfo.pCPUMCtxGC) + pVM->patm.s.pCPUMCtxGC;
+        }
+        else if (   uFixup >= patmInfo.pStatsGC
+                 && uFixup <  patmInfo.pStatsGC + PATM_STAT_MEMSIZE)
+        {
+            LogFlow(("Changing absolute Stats at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, uFixup, (uFixup - patmInfo.pStatsGC) + pVM->patm.s.pStatsGC));
+            *pFixup = (uFixup - patmInfo.pStatsGC) + pVM->patm.s.pStatsGC;
+        }
+        else if (   uFixup >= patmInfo.pGCStackGC
+                 && uFixup <  patmInfo.pGCStackGC + PATM_STACK_TOTAL_SIZE)
+        {
+            LogFlow(("Changing absolute Stack at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, uFixup, (uFixup - patmInfo.pGCStackGC) + pVM->patm.s.pGCStackGC));
+            *pFixup = (uFixup - patmInfo.pGCStackGC) + pVM->patm.s.pGCStackGC;
+        }
+        else if (   uFixup >= patmInfo.pPatchMemGC
+                 && uFixup <  patmInfo.pPatchMemGC + patmInfo.cbPatchMem)
+        {
+            LogFlow(("Changing absolute PatchMem at %RRv from %RRv to %RRv\n", patmInfo.pPatchMemGC + offset, uFixup, (uFixup - patmInfo.pPatchMemGC) + pVM->patm.s.pPatchMemGC));
+            *pFixup = (uFixup - patmInfo.pPatchMemGC) + pVM->patm.s.pPatchMemGC;
+        }
         /* Boldly ASSUMES:
          * 1. That pCPUMCtxGC is in the VM structure and that its location is
@@ -1264,20 +1261,17 @@
          *    structure.
          * 3. That the CPUM leafs are less than 8KB into the structure. */
-        if (    ulSSMVersion <= PATM_SAVED_STATE_VERSION_FIXUP_HACK
-            &&  *pFixup - (patmInfo.pCPUMCtxGC & UINT32_C(0xffc00000)) < UINT32_C(32))
-        {
-            LogFlow(("Changing fLocalForcedActions fixup from %RRv to %RRv\n", *pFixup, pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions)));
+        else if (   uVersion <= PATM_SAVED_STATE_VERSION_FIXUP_HACK
+                 && uFixup - (patmInfo.pCPUMCtxGC & UINT32_C(0xffc00000)) < UINT32_C(32))
+        {
+            LogFlow(("Changing fLocalForcedActions fixup from %RRv to %RRv\n", uFixup, pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions)));
             *pFixup = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions);
         }
-        else
-        if (    ulSSMVersion <= PATM_SAVED_STATE_VERSION_FIXUP_HACK
-            &&  *pFixup - (patmInfo.pCPUMCtxGC & UINT32_C(0xffc00000)) < UINT32_C(8192))
+        else if (   uVersion <= PATM_SAVED_STATE_VERSION_FIXUP_HACK
+                 && uFixup - (patmInfo.pCPUMCtxGC & UINT32_C(0xffc00000)) < UINT32_C(8192))
         {
             static int cCpuidFixup = 0;
-#ifdef LOG_ENABLED
-            RTRCPTR oldFixup = *pFixup;
-#endif
+
             /* very dirty assumptions about the cpuid patch and cpuid ordering. */
-            switch(cCpuidFixup & 3)
+            switch (cCpuidFixup & 3)
             {
             case 0:
@@ -1294,38 +1288,34 @@
                 break;
             }
-            LogFlow(("Changing cpuid fixup %d from %RRv to %RRv\n", cCpuidFixup, oldFixup, *pFixup));
+            LogFlow(("Changing cpuid fixup %d from %RRv to %RRv\n", cCpuidFixup, uFixup, *pFixup));
             cCpuidFixup++;
         }
-        else
-        if (ulSSMVersion >= PATM_SAVED_STATE_VERSION_MEM)
-        {
-#ifdef LOG_ENABLED
-            RTRCPTR oldFixup = *pFixup;
-#endif
-            /* Core.Key abused to store the type of fixup */
+        else if (uVersion >= PATM_SAVED_STATE_VERSION_MEM)
+        {
+            /* Core.Key abused to store the type of fixup. */
             switch ((uintptr_t)pRec->Core.Key)
             {
             case PATM_FIXUP_CPU_FF_ACTION:
                 *pFixup = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions);
-                LogFlow(("Changing cpu ff action fixup from %x to %x\n", oldFixup, *pFixup));
+                LogFlow(("Changing cpu ff action fixup from %x to %x\n", uFixup, *pFixup));
                 break;
             case PATM_FIXUP_CPUID_DEFAULT:
                 *pFixup = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM);
-                LogFlow(("Changing cpuid def fixup from %x to %x\n", oldFixup, *pFixup));
+                LogFlow(("Changing cpuid def fixup from %x to %x\n", uFixup, *pFixup));
                 break;
             case PATM_FIXUP_CPUID_STANDARD:
                 *pFixup = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
-                LogFlow(("Changing cpuid std fixup from %x to %x\n", oldFixup, *pFixup));
+                LogFlow(("Changing cpuid std fixup from %x to %x\n", uFixup, *pFixup));
                 break;
             case PATM_FIXUP_CPUID_EXTENDED:
                 *pFixup = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM);
-                LogFlow(("Changing cpuid ext fixup from %x to %x\n", oldFixup, *pFixup));
+                LogFlow(("Changing cpuid ext fixup from %x to %x\n", uFixup, *pFixup));
                 break;
             case PATM_FIXUP_CPUID_CENTAUR:
                 *pFixup = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
-                LogFlow(("Changing cpuid centaur fixup from %x to %x\n", oldFixup, *pFixup));
+                LogFlow(("Changing cpuid centaur fixup from %x to %x\n", uFixup, *pFixup));
                 break;
             default:
-                AssertMsgFailed(("Unexpected fixup value %x\n", *pFixup));
+                AssertMsgFailed(("Unexpected fixup value %p\n", (uintptr_t)pRec->Core.Key));
                 break;
             }
Index: /trunk/src/VBox/VMM/include/PATMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/PATMInternal.h	(revision 54687)
+++ /trunk/src/VBox/VMM/include/PATMInternal.h	(revision 54688)
@@ -153,7 +153,4 @@
 } RELOCREC, *PRELOCREC;
 
-/* forward decl */
-struct _PATCHINFO;
-
 /* Cache record for guest to host pointer conversions. */
 typedef struct
@@ -258,5 +255,5 @@
  * Patch information.
  */
-typedef struct _PATCHINFO
+typedef struct PATCHINFO
 {
     /** Current patch state (enabled, disabled, etc.). */
