VirtualBox

Changeset 54764 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Mar 15, 2015 3:25:11 AM (10 years ago)
Author:
vboxsync
Message:

Added an infix 'ASMFIX' to the PATMA.h fixup types used in the patch template code in PATMA.asm.

Location:
trunk/src/VBox/VMM
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/PATM.cpp

    r54763 r54764  
    784784        {
    785785        case FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL:
    786             Assert(pRec->pDest == pRec->pSource); Assert(PATM_IS_FIXUP_TYPE(pRec->pSource));
     786            Assert(pRec->pDest == pRec->pSource); Assert(PATM_IS_ASMFIX(pRec->pSource));
    787787            Log(("Absolute patch template fixup type %#x at %RHv -> %RHv at %RRv\n", pRec->pSource, *(RTRCUINTPTR *)pRec->pRelocPos, *(RTRCINTPTR*)pRec->pRelocPos + delta, pRec->pRelocPos));
    788788            *(RTRCUINTPTR *)pRec->pRelocPos += delta;
     
    942942            /* Only applicable when loading state. */
    943943            Assert(pRec->pDest == pRec->pSource);
    944             Assert(PATM_IS_FIXUP_TYPE(pRec->pSource));
     944            Assert(PATM_IS_ASMFIX(pRec->pSource));
    945945            break;
    946946
     
    36063606    if (pPatchTargetGC)
    36073607    {
    3608         /* Create a trampoline that also sets PATM_INTERRUPTFLAG. */
     3608        /* Create a trampoline that also sets PATM_ASMFIX_INTERRUPTFLAG. */
    36093609        rc = PATMR3InstallPatch(pVM, pBranchTarget, PATMFL_CODE32 | PATMFL_TRAMPOLINE);
    36103610    }
  • trunk/src/VBox/VMM/VMMR3/PATMA.asm

    r54763 r54764  
    208208BEGIN_PATCH_CODE_SECTION
    209209BEGINPROC   PATMStats
    210     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     210    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    211211    pushf
    212     inc     dword [ss:PATM_ALLPATCHCALLS]
    213     inc     dword [ss:PATM_PERPATCHCALLS]
     212    inc     dword [ss:PATM_ASMFIX_ALLPATCHCALLS]
     213    inc     dword [ss:PATM_ASMFIX_PERPATCHCALLS]
    214214    popf
    215     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     215    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    216216ENDPROC     PATMStats
    217217
     
    220220GLOBALNAME g_patmStatsRecord
    221221    PATCHASMRECORD_INIT PATMStats, 4
    222     DD      PATM_INTERRUPTFLAG, 0
    223     DD      PATM_ALLPATCHCALLS, 0
    224     DD      PATM_PERPATCHCALLS, 0
    225     DD      PATM_INTERRUPTFLAG, 0
     222    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     223    DD      PATM_ASMFIX_ALLPATCHCALLS, 0
     224    DD      PATM_ASMFIX_PERPATCHCALLS, 0
     225    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    226226    DD      0ffffffffh, 0ffffffffh
    227227%endif ; VBOX_WITH_STATISTICS
     
    229229
    230230;
    231 ; Set PATM_INTERRUPTFLAG
     231; Set PATM_ASMFIX_INTERRUPTFLAG
    232232;
    233233BEGIN_PATCH_CODE_SECTION
    234234BEGINPROC   PATMSetPIF
    235     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     235    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    236236ENDPROC     PATMSetPIF
    237237
    238 ; Patch record for setting PATM_INTERRUPTFLAG
     238; Patch record for setting PATM_ASMFIX_INTERRUPTFLAG
    239239BEGIN_PATCH_RODATA_SECTION
    240240GLOBALNAME g_patmSetPIFRecord
    241241    PATCHASMRECORD_INIT PATMSetPIF, 1
    242     DD      PATM_INTERRUPTFLAG, 0
    243     DD      0ffffffffh, 0ffffffffh
    244 
    245 ;
    246 ; Clear PATM_INTERRUPTFLAG
     242    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     243    DD      0ffffffffh, 0ffffffffh
     244
     245;
     246; Clear PATM_ASMFIX_INTERRUPTFLAG
    247247;
    248248BEGIN_PATCH_CODE_SECTION
     
    251251    not     dword [esp-64]
    252252    not     dword [esp-64]
    253     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     253    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    254254ENDPROC     PATMClearPIF
    255255
    256 ; Patch record for clearing PATM_INTERRUPTFLAG
     256; Patch record for clearing PATM_ASMFIX_INTERRUPTFLAG
    257257BEGIN_PATCH_RODATA_SECTION
    258258GLOBALNAME g_patmClearPIFRecord
    259259    PATCHASMRECORD_INIT PATMClearPIF, 1
    260     DD      PATM_INTERRUPTFLAG, 0
    261     DD      0ffffffffh, 0ffffffffh
    262 
    263 ;
    264 ; Clear PATM_INHIBITIRQADDR and fault if IF=0
     260    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     261    DD      0ffffffffh, 0ffffffffh
     262
     263;
     264; Clear PATM_ASMFIX_INHIBITIRQADDR and fault if IF=0
    265265;
    266266BEGIN_PATCH_CODE_SECTION
    267267BEGINPROC   PATMClearInhibitIRQFaultIF0
    268     mov     dword [ss:PATM_INTERRUPTFLAG], 0
    269     mov     dword [ss:PATM_INHIBITIRQADDR], 0
     268    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
     269    mov     dword [ss:PATM_ASMFIX_INHIBITIRQADDR], 0
    270270    pushf
    271271
    272     test    dword [ss:PATM_VMFLAGS], X86_EFL_IF
     272    test    dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF
    273273    jz      PATMClearInhibitIRQFaultIF0_Fault
    274274
    275275    ; if interrupts are pending, then we must go back to the host context to handle them!
    276     test    dword [ss:PATM_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
     276    test    dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
    277277    jz      PATMClearInhibitIRQFaultIF0_Continue
    278278
    279279    ; Go to our hypervisor trap handler to dispatch the pending irq
    280     mov     dword [ss:PATM_TEMP_EAX], eax
    281     mov     dword [ss:PATM_TEMP_ECX], ecx
    282     mov     dword [ss:PATM_TEMP_EDI], edi
    283     mov     dword [ss:PATM_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
     280    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], eax
     281    mov     dword [ss:PATM_ASMFIX_TEMP_ECX], ecx
     282    mov     dword [ss:PATM_ASMFIX_TEMP_EDI], edi
     283    mov     dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
    284284    mov     eax, PATM_ACTION_DISPATCH_PENDING_IRQ
    285     lock    or dword [ss:PATM_PENDINGACTION], eax
    286     mov     ecx, PATM_ACTION_MAGIC
    287     mov     edi, PATM_NEXTINSTRADDR
     285    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
     286    mov     ecx, PATM_ACTION_MAGIC
     287    mov     edi, PATM_ASMFIX_NEXTINSTRADDR
    288288    popfd                   ; restore flags we pushed above (the or instruction changes the flags as well)
    289289    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    292292PATMClearInhibitIRQFaultIF0_Fault:
    293293    popf
    294     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     294    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    295295    PATM_INT3
    296296
    297297PATMClearInhibitIRQFaultIF0_Continue:
    298298    popf
    299     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     299    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    300300ENDPROC     PATMClearInhibitIRQFaultIF0
    301301
    302 ; Patch record for clearing PATM_INHIBITIRQADDR
     302; Patch record for clearing PATM_ASMFIX_INHIBITIRQADDR
    303303BEGIN_PATCH_RODATA_SECTION
    304304GLOBALNAME g_patmClearInhibitIRQFaultIF0Record
    305305    PATCHASMRECORD_INIT PATMClearInhibitIRQFaultIF0, 12
    306     DD      PATM_INTERRUPTFLAG,      0
    307     DD      PATM_INHIBITIRQADDR,     0
    308     DD      PATM_VMFLAGS,            0
    309     DD      PATM_VM_FORCEDACTIONS,   0
    310     DD      PATM_TEMP_EAX,           0
    311     DD      PATM_TEMP_ECX,           0
    312     DD      PATM_TEMP_EDI,           0
    313     DD      PATM_TEMP_RESTORE_FLAGS, 0
    314     DD      PATM_PENDINGACTION,      0
    315     DD      PATM_NEXTINSTRADDR,      0
    316     DD      PATM_INTERRUPTFLAG,      0
    317     DD      PATM_INTERRUPTFLAG,      0
    318     DD      0ffffffffh, 0ffffffffh
    319 
    320 
    321 ;
    322 ; Clear PATM_INHIBITIRQADDR and continue if IF=0 (duplicated function only; never jump back to guest code afterwards!!)
     306    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     307    DD      PATM_ASMFIX_INHIBITIRQADDR,     0
     308    DD      PATM_ASMFIX_VMFLAGS,            0
     309    DD      PATM_ASMFIX_VM_FORCEDACTIONS,   0
     310    DD      PATM_ASMFIX_TEMP_EAX,           0
     311    DD      PATM_ASMFIX_TEMP_ECX,           0
     312    DD      PATM_ASMFIX_TEMP_EDI,           0
     313    DD      PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0
     314    DD      PATM_ASMFIX_PENDINGACTION,      0
     315    DD      PATM_ASMFIX_NEXTINSTRADDR,      0
     316    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     317    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     318    DD      0ffffffffh, 0ffffffffh
     319
     320
     321;
     322; Clear PATM_ASMFIX_INHIBITIRQADDR and continue if IF=0 (duplicated function only; never jump back to guest code afterwards!!)
    323323;
    324324BEGIN_PATCH_CODE_SECTION
    325325BEGINPROC   PATMClearInhibitIRQContIF0
    326     mov     dword [ss:PATM_INTERRUPTFLAG], 0
    327     mov     dword [ss:PATM_INHIBITIRQADDR], 0
     326    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
     327    mov     dword [ss:PATM_ASMFIX_INHIBITIRQADDR], 0
    328328    pushf
    329329
    330     test    dword [ss:PATM_VMFLAGS], X86_EFL_IF
     330    test    dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF
    331331    jz      PATMClearInhibitIRQContIF0_Continue
    332332
    333333    ; if interrupts are pending, then we must go back to the host context to handle them!
    334     test    dword [ss:PATM_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
     334    test    dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
    335335    jz      PATMClearInhibitIRQContIF0_Continue
    336336
    337337    ; Go to our hypervisor trap handler to dispatch the pending irq
    338     mov     dword [ss:PATM_TEMP_EAX], eax
    339     mov     dword [ss:PATM_TEMP_ECX], ecx
    340     mov     dword [ss:PATM_TEMP_EDI], edi
    341     mov     dword [ss:PATM_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
     338    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], eax
     339    mov     dword [ss:PATM_ASMFIX_TEMP_ECX], ecx
     340    mov     dword [ss:PATM_ASMFIX_TEMP_EDI], edi
     341    mov     dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
    342342    mov     eax, PATM_ACTION_DISPATCH_PENDING_IRQ
    343     lock    or dword [ss:PATM_PENDINGACTION], eax
    344     mov     ecx, PATM_ACTION_MAGIC
    345     mov     edi, PATM_NEXTINSTRADDR
     343    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
     344    mov     ecx, PATM_ACTION_MAGIC
     345    mov     edi, PATM_ASMFIX_NEXTINSTRADDR
    346346    popfd                   ; restore flags we pushed above (the or instruction changes the flags as well)
    347347    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    350350PATMClearInhibitIRQContIF0_Continue:
    351351    popf
    352     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     352    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    353353ENDPROC     PATMClearInhibitIRQContIF0
    354354
    355 ; Patch record for clearing PATM_INHIBITIRQADDR
     355; Patch record for clearing PATM_ASMFIX_INHIBITIRQADDR
    356356BEGIN_PATCH_RODATA_SECTION
    357357GLOBALNAME g_patmClearInhibitIRQContIF0Record
    358358    PATCHASMRECORD_INIT PATMClearInhibitIRQContIF0, 11
    359     DD      PATM_INTERRUPTFLAG,      0   
    360     DD      PATM_INHIBITIRQADDR,     0
    361     DD      PATM_VMFLAGS,            0
    362     DD      PATM_VM_FORCEDACTIONS,   0
    363     DD      PATM_TEMP_EAX,           0
    364     DD      PATM_TEMP_ECX,           0
    365     DD      PATM_TEMP_EDI,           0
    366     DD      PATM_TEMP_RESTORE_FLAGS, 0
    367     DD      PATM_PENDINGACTION,      0
    368     DD      PATM_NEXTINSTRADDR,      0
    369     DD      PATM_INTERRUPTFLAG,      0
     359    DD      PATM_ASMFIX_INTERRUPTFLAG,      0   
     360    DD      PATM_ASMFIX_INHIBITIRQADDR,     0
     361    DD      PATM_ASMFIX_VMFLAGS,            0
     362    DD      PATM_ASMFIX_VM_FORCEDACTIONS,   0
     363    DD      PATM_ASMFIX_TEMP_EAX,           0
     364    DD      PATM_ASMFIX_TEMP_ECX,           0
     365    DD      PATM_ASMFIX_TEMP_EDI,           0
     366    DD      PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0
     367    DD      PATM_ASMFIX_PENDINGACTION,      0
     368    DD      PATM_ASMFIX_NEXTINSTRADDR,      0
     369    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
    370370    DD      0ffffffffh, 0ffffffffh
    371371
     
    376376BEGIN_PATCH_CODE_SECTION
    377377BEGINPROC   PATMCliReplacement
    378     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     378    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    379379    pushf
    380380%ifdef PATM_LOG_PATCHINSTR
     
    382382    push    ecx
    383383    mov     eax, PATM_ACTION_LOG_CLI
    384     lock    or dword [ss:PATM_PENDINGACTION], eax
     384    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    385385    mov     ecx, PATM_ACTION_MAGIC
    386386    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    389389%endif
    390390
    391     and     dword [ss:PATM_VMFLAGS], ~X86_EFL_IF
     391    and     dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IF
    392392    popf
    393393
    394     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     394    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    395395    DB      0xE9
    396396PATMCliJump:
    397     DD      PATM_JUMPDELTA
     397    DD      PATM_ASMFIX_JUMPDELTA
    398398ENDPROC     PATMCliReplacement
    399399
     
    406406    PATCHASMRECORD_INIT_JUMP PATMCliReplacement, PATMCliJump, 3
    407407%endif
    408     DD      PATM_INTERRUPTFLAG, 0
     408    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    409409%ifdef PATM_LOG_PATCHINSTR
    410     DD      PATM_PENDINGACTION, 0
    411 %endif
    412     DD      PATM_VMFLAGS,       0
    413     DD      PATM_INTERRUPTFLAG, 0
     410    DD      PATM_ASMFIX_PENDINGACTION, 0
     411%endif
     412    DD      PATM_ASMFIX_VMFLAGS,       0
     413    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    414414    DD      0ffffffffh, 0ffffffffh
    415415
     
    420420BEGIN_PATCH_CODE_SECTION
    421421BEGINPROC   PATMStiReplacement
    422     mov     dword [ss:PATM_INTERRUPTFLAG], 0
    423     mov     dword [ss:PATM_INHIBITIRQADDR], PATM_NEXTINSTRADDR
     422    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
     423    mov     dword [ss:PATM_ASMFIX_INHIBITIRQADDR], PATM_ASMFIX_NEXTINSTRADDR
    424424    pushf
    425425%ifdef PATM_LOG_PATCHINSTR
     
    427427    push    ecx
    428428    mov     eax, PATM_ACTION_LOG_STI
    429     lock    or dword [ss:PATM_PENDINGACTION], eax
     429    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    430430    mov     ecx, PATM_ACTION_MAGIC
    431431    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    433433    pop     eax
    434434%endif
    435     or      dword [ss:PATM_VMFLAGS], X86_EFL_IF
     435    or      dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF
    436436    popf
    437     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     437    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    438438ENDPROC     PATMStiReplacement
    439439
     
    446446    PATCHASMRECORD_INIT PATMStiReplacement, 5
    447447%endif
    448     DD      PATM_INTERRUPTFLAG,  0
    449     DD      PATM_INHIBITIRQADDR, 0
    450     DD      PATM_NEXTINSTRADDR,  0
     448    DD      PATM_ASMFIX_INTERRUPTFLAG,  0
     449    DD      PATM_ASMFIX_INHIBITIRQADDR, 0
     450    DD      PATM_ASMFIX_NEXTINSTRADDR,  0
    451451%ifdef PATM_LOG_PATCHINSTR
    452     DD      PATM_PENDINGACTION,  0
    453 %endif
    454     DD      PATM_VMFLAGS,        0
    455     DD      PATM_INTERRUPTFLAG,  0
     452    DD      PATM_ASMFIX_PENDINGACTION,  0
     453%endif
     454    DD      PATM_ASMFIX_VMFLAGS,        0
     455    DD      PATM_ASMFIX_INTERRUPTFLAG,  0
    456456    DD      0ffffffffh, 0ffffffffh
    457457
     
    472472BEGIN_PATCH_CODE_SECTION
    473473BEGINPROC   PATMTrapEntry
    474     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     474    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    475475    pushf
    476476
     
    481481    lea     edx, dword [ss:esp+12+4]        ;3 dwords + pushed flags -> iret eip
    482482    mov     eax, PATM_ACTION_LOG_GATE_ENTRY
    483     lock    or dword [ss:PATM_PENDINGACTION], eax
     483    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    484484    mov     ecx, PATM_ACTION_MAGIC
    485485    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    502502    ; correct EFLAGS on the stack to include the current IOPL
    503503    push    eax
    504     mov     eax, dword [ss:PATM_VMFLAGS]
     504    mov     eax, dword [ss:PATM_ASMFIX_VMFLAGS]
    505505    and     eax, X86_EFL_IOPL
    506506    and     dword [esp+16], ~X86_EFL_IOPL       ; esp+16 = eflags = esp+8+4(efl)+4(eax)
     
    509509
    510510    popf
    511     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     511    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    512512    DB      0xE9
    513513PATMTrapEntryJump:
    514     DD      PATM_JUMPDELTA
     514    DD      PATM_ASMFIX_JUMPDELTA
    515515ENDPROC     PATMTrapEntry
    516516
     
    523523    PATCHASMRECORD_INIT_JUMP PATMTrapEntry, PATMTrapEntryJump, 3
    524524%endif
    525     DD      PATM_INTERRUPTFLAG, 0
     525    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    526526%ifdef PATM_LOG_PATCHIRET
    527     DD      PATM_PENDINGACTION, 0
    528 %endif
    529     DD      PATM_VMFLAGS,       0
    530     DD      PATM_INTERRUPTFLAG, 0
     527    DD      PATM_ASMFIX_PENDINGACTION, 0
     528%endif
     529    DD      PATM_ASMFIX_VMFLAGS,       0
     530    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    531531    DD      0ffffffffh, 0ffffffffh
    532532
     
    549549BEGINPROC   PATMTrapEntryErrorCode
    550550PATMTrapErrorCodeEntryStart:
    551     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     551    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    552552    pushf
    553553
     
    558558    lea     edx, dword [ss:esp+12+4+4]        ;3 dwords + pushed flags + error code -> iret eip
    559559    mov     eax, PATM_ACTION_LOG_GATE_ENTRY
    560     lock    or dword [ss:PATM_PENDINGACTION], eax
     560    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    561561    mov     ecx, PATM_ACTION_MAGIC
    562562    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    579579    ; correct EFLAGS on the stack to include the current IOPL
    580580    push    eax
    581     mov     eax, dword [ss:PATM_VMFLAGS]
     581    mov     eax, dword [ss:PATM_ASMFIX_VMFLAGS]
    582582    and     eax, X86_EFL_IOPL
    583583    and     dword [esp+20], ~X86_EFL_IOPL       ; esp+20 = eflags = esp+8+4(efl)+4(error code)+4(eax)
     
    586586
    587587    popf
    588     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     588    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    589589    DB      0xE9
    590590PATMTrapErrorCodeEntryJump:
    591     DD      PATM_JUMPDELTA
     591    DD      PATM_ASMFIX_JUMPDELTA
    592592ENDPROC     PATMTrapEntryErrorCode
    593593
     
    600600    PATCHASMRECORD_INIT_JUMP PATMTrapEntryErrorCode, PATMTrapErrorCodeEntryJump, 3
    601601%endif
    602     DD      PATM_INTERRUPTFLAG, 0
     602    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    603603%ifdef PATM_LOG_PATCHIRET
    604     DD      PATM_PENDINGACTION, 0
    605 %endif
    606     DD      PATM_VMFLAGS,       0
    607     DD      PATM_INTERRUPTFLAG, 0
     604    DD      PATM_ASMFIX_PENDINGACTION, 0
     605%endif
     606    DD      PATM_ASMFIX_VMFLAGS,       0
     607    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    608608    DD      0ffffffffh, 0ffffffffh
    609609
     
    624624BEGIN_PATCH_CODE_SECTION
    625625BEGINPROC   PATMIntEntry
    626     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     626    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    627627    pushf
    628628
     
    633633    lea     edx, dword [ss:esp+12+4]        ;3 dwords + pushed flags -> iret eip
    634634    mov     eax, PATM_ACTION_LOG_GATE_ENTRY
    635     lock    or dword [ss:PATM_PENDINGACTION], eax
     635    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    636636    mov     ecx, PATM_ACTION_MAGIC
    637637    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    654654    ; correct EFLAGS on the stack to include the current IOPL
    655655    push    eax
    656     mov     eax, dword [ss:PATM_VMFLAGS]
     656    mov     eax, dword [ss:PATM_ASMFIX_VMFLAGS]
    657657    and     eax, X86_EFL_IOPL
    658658    and     dword [esp+16], ~X86_EFL_IOPL       ; esp+16 = eflags = esp+8+4(efl)+4(eax)
     
    661661
    662662    popf
    663     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     663    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    664664ENDPROC     PATMIntEntry
    665665
     
    672672    PATCHASMRECORD_INIT PATMIntEntry, 3
    673673%endif
    674     DD      PATM_INTERRUPTFLAG, 0
     674    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    675675%ifdef PATM_LOG_PATCHIRET
    676     DD      PATM_PENDINGACTION, 0
    677 %endif
    678     DD      PATM_VMFLAGS,       0
    679     DD      PATM_INTERRUPTFLAG, 0
     676    DD      PATM_ASMFIX_PENDINGACTION, 0
     677%endif
     678    DD      PATM_ASMFIX_VMFLAGS,       0
     679    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    680680    DD      0ffffffffh, 0ffffffffh
    681681
     
    697697BEGIN_PATCH_CODE_SECTION
    698698BEGINPROC   PATMIntEntryErrorCode
    699     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     699    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    700700    pushf
    701701
     
    706706    lea     edx, dword [ss:esp+12+4+4]        ;3 dwords + pushed flags + error code -> iret eip
    707707    mov     eax, PATM_ACTION_LOG_GATE_ENTRY
    708     lock    or dword [ss:PATM_PENDINGACTION], eax
     708    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    709709    mov     ecx, PATM_ACTION_MAGIC
    710710    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    727727    ; correct EFLAGS on the stack to include the current IOPL
    728728    push    eax
    729     mov     eax, dword [ss:PATM_VMFLAGS]
     729    mov     eax, dword [ss:PATM_ASMFIX_VMFLAGS]
    730730    and     eax, X86_EFL_IOPL
    731731    and     dword [esp+20], ~X86_EFL_IOPL       ; esp+20 = eflags = esp+8+4(efl)+4(eax)+4(error code)
     
    734734
    735735    popf
    736     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     736    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    737737ENDPROC     PATMIntEntryErrorCode
    738738
     
    745745    PATCHASMRECORD_INIT PATMIntEntryErrorCode, 3
    746746%endif
    747     DD      PATM_INTERRUPTFLAG, 0
     747    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    748748%ifdef PATM_LOG_PATCHIRET
    749     DD      PATM_PENDINGACTION, 0
    750 %endif
    751     DD      PATM_VMFLAGS,       0
    752     DD      PATM_INTERRUPTFLAG, 0
     749    DD      PATM_ASMFIX_PENDINGACTION, 0
     750%endif
     751    DD      PATM_ASMFIX_VMFLAGS,       0
     752    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    753753    DD      0ffffffffh, 0ffffffffh
    754754
     
    759759BEGIN_PATCH_CODE_SECTION
    760760BEGINPROC   PATMPopf32Replacement
    761     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     761    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    762762%ifdef PATM_LOG_PATCHINSTR
    763763    push    eax
     
    769769
    770770PATMPopf32_Log:
    771     lock    or dword [ss:PATM_PENDINGACTION], eax
     771    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    772772    mov     ecx, PATM_ACTION_MAGIC
    773773    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    778778    test    dword [esp], X86_EFL_IF
    779779    jnz     PATMPopf32_Ok
    780     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     780    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    781781    PATM_INT3
    782782
     
    785785    ; In this particular patch it's rather unlikely the pushf was included, so we have no way to check if the flags on the stack were correctly synced
    786786    ; PATMPopf32Replacement_NoExit is different, because it's only used in IDT and function patches
    787     or      dword [ss:PATM_VMFLAGS], X86_EFL_IF
     787    or      dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF
    788788
    789789    ; if interrupts are pending, then we must go back to the host context to handle them!
    790     test    dword [ss:PATM_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
     790    test    dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
    791791    jz      PATMPopf32_Continue
    792792
    793793    ; Go to our hypervisor trap handler to dispatch the pending irq
    794     mov     dword [ss:PATM_TEMP_EAX], eax
    795     mov     dword [ss:PATM_TEMP_ECX], ecx
    796     mov     dword [ss:PATM_TEMP_EDI], edi
    797     mov     dword [ss:PATM_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
     794    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], eax
     795    mov     dword [ss:PATM_ASMFIX_TEMP_ECX], ecx
     796    mov     dword [ss:PATM_ASMFIX_TEMP_EDI], edi
     797    mov     dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
    798798    mov     eax, PATM_ACTION_DISPATCH_PENDING_IRQ
    799     lock    or dword [ss:PATM_PENDINGACTION], eax
    800     mov     ecx, PATM_ACTION_MAGIC
    801     mov     edi, PATM_NEXTINSTRADDR
     799    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
     800    mov     ecx, PATM_ACTION_MAGIC
     801    mov     edi, PATM_ASMFIX_NEXTINSTRADDR
    802802
    803803    popfd                   ; restore flags we pushed above (the or instruction changes the flags as well)
     
    807807PATMPopf32_Continue:
    808808    popfd                   ; restore flags we pushed above
    809     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     809    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    810810    DB      0xE9
    811811PATMPopf32Jump:
    812     DD      PATM_JUMPDELTA
     812    DD      PATM_ASMFIX_JUMPDELTA
    813813ENDPROC     PATMPopf32Replacement
    814814
     
    821821    PATCHASMRECORD_INIT_JUMP PATMPopf32Replacement, PATMPopf32Jump, 11
    822822%endif
    823     DD      PATM_INTERRUPTFLAG,      0
     823    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
    824824%ifdef PATM_LOG_PATCHINSTR
    825     DD      PATM_PENDINGACTION,      0
    826 %endif
    827     DD      PATM_INTERRUPTFLAG,      0
    828     DD      PATM_VMFLAGS,            0
    829     DD      PATM_VM_FORCEDACTIONS,   0
    830     DD      PATM_TEMP_EAX,           0
    831     DD      PATM_TEMP_ECX,           0
    832     DD      PATM_TEMP_EDI,           0
    833     DD      PATM_TEMP_RESTORE_FLAGS, 0
    834     DD      PATM_PENDINGACTION,      0
    835     DD      PATM_NEXTINSTRADDR,      0
    836     DD      PATM_INTERRUPTFLAG,      0
     825    DD      PATM_ASMFIX_PENDINGACTION,      0
     826%endif
     827    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     828    DD      PATM_ASMFIX_VMFLAGS,            0
     829    DD      PATM_ASMFIX_VM_FORCEDACTIONS,   0
     830    DD      PATM_ASMFIX_TEMP_EAX,           0
     831    DD      PATM_ASMFIX_TEMP_ECX,           0
     832    DD      PATM_ASMFIX_TEMP_EDI,           0
     833    DD      PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0
     834    DD      PATM_ASMFIX_PENDINGACTION,      0
     835    DD      PATM_ASMFIX_NEXTINSTRADDR,      0
     836    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
    837837    DD      0ffffffffh, 0ffffffffh
    838838
     
    843843BEGIN_PATCH_CODE_SECTION
    844844BEGINPROC   PATMPopf32Replacement_NoExit
    845     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     845    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    846846%ifdef PATM_LOG_PATCHINSTR
    847847    push    eax
     
    853853
    854854PATMPopf32_NoExitLog:
    855     lock    or dword [ss:PATM_PENDINGACTION], eax
     855    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    856856    mov     ecx, PATM_ACTION_MAGIC
    857857    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    863863
    864864    ; if interrupts are pending, then we must go back to the host context to handle them!
    865     test    dword [ss:PATM_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
     865    test    dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
    866866    jz      PATMPopf32_NoExit_Continue
    867867
    868868    ; Go to our hypervisor trap handler to dispatch the pending irq
    869     mov     dword [ss:PATM_TEMP_EAX], eax
    870     mov     dword [ss:PATM_TEMP_ECX], ecx
    871     mov     dword [ss:PATM_TEMP_EDI], edi
    872     mov     dword [ss:PATM_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
     869    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], eax
     870    mov     dword [ss:PATM_ASMFIX_TEMP_ECX], ecx
     871    mov     dword [ss:PATM_ASMFIX_TEMP_EDI], edi
     872    mov     dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
    873873    mov     eax, PATM_ACTION_DISPATCH_PENDING_IRQ
    874     lock    or dword [ss:PATM_PENDINGACTION], eax
    875     mov     ecx, PATM_ACTION_MAGIC
    876     mov     edi, PATM_NEXTINSTRADDR
    877 
    878     pop     dword [ss:PATM_VMFLAGS]     ; restore flags now (the or instruction changes the flags as well)
    879     push    dword [ss:PATM_VMFLAGS]
     874    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
     875    mov     ecx, PATM_ACTION_MAGIC
     876    mov     edi, PATM_ASMFIX_NEXTINSTRADDR
     877
     878    pop     dword [ss:PATM_ASMFIX_VMFLAGS]     ; restore flags now (the or instruction changes the flags as well)
     879    push    dword [ss:PATM_ASMFIX_VMFLAGS]
    880880    popfd
    881881
     
    884884
    885885PATMPopf32_NoExit_Continue:
    886     pop     dword [ss:PATM_VMFLAGS]
    887     push    dword [ss:PATM_VMFLAGS]
    888     popfd
    889     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     886    pop     dword [ss:PATM_ASMFIX_VMFLAGS]
     887    push    dword [ss:PATM_ASMFIX_VMFLAGS]
     888    popfd
     889    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    890890ENDPROC     PATMPopf32Replacement_NoExit
    891891
     
    898898    PATCHASMRECORD_INIT PATMPopf32Replacement_NoExit, 13
    899899%endif
    900     DD      PATM_INTERRUPTFLAG,      0
     900    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
    901901%ifdef PATM_LOG_PATCHINSTR
    902     DD      PATM_PENDINGACTION,      0
    903 %endif
    904     DD      PATM_VM_FORCEDACTIONS,   0
    905     DD      PATM_TEMP_EAX,           0
    906     DD      PATM_TEMP_ECX,           0
    907     DD      PATM_TEMP_EDI,           0
    908     DD      PATM_TEMP_RESTORE_FLAGS, 0
    909     DD      PATM_PENDINGACTION,      0
    910     DD      PATM_NEXTINSTRADDR,      0
    911     DD      PATM_VMFLAGS,            0
    912     DD      PATM_VMFLAGS,            0
    913     DD      PATM_VMFLAGS,            0
    914     DD      PATM_VMFLAGS,            0
    915     DD      PATM_INTERRUPTFLAG,      0
     902    DD      PATM_ASMFIX_PENDINGACTION,      0
     903%endif
     904    DD      PATM_ASMFIX_VM_FORCEDACTIONS,   0
     905    DD      PATM_ASMFIX_TEMP_EAX,           0
     906    DD      PATM_ASMFIX_TEMP_ECX,           0
     907    DD      PATM_ASMFIX_TEMP_EDI,           0
     908    DD      PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0
     909    DD      PATM_ASMFIX_PENDINGACTION,      0
     910    DD      PATM_ASMFIX_NEXTINSTRADDR,      0
     911    DD      PATM_ASMFIX_VMFLAGS,            0
     912    DD      PATM_ASMFIX_VMFLAGS,            0
     913    DD      PATM_ASMFIX_VMFLAGS,            0
     914    DD      PATM_ASMFIX_VMFLAGS,            0
     915    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
    916916    DD      0ffffffffh, 0ffffffffh
    917917
     
    922922BEGIN_PATCH_CODE_SECTION
    923923BEGINPROC   PATMPopf16Replacement
    924     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     924    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    925925    test    word [esp], X86_EFL_IF
    926926    jnz     PATMPopf16_Ok
    927     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     927    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    928928    PATM_INT3
    929929
     
    931931    ; if interrupts are pending, then we must go back to the host context to handle them!
    932932    ; @note we destroy the flags here, but that should really not matter (PATM_INT3 case)
    933     test    dword [ss:PATM_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
     933    test    dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
    934934    jz      PATMPopf16_Continue
    935     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     935    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    936936    PATM_INT3
    937937
    938938PATMPopf16_Continue:
    939939
    940     pop     word [ss:PATM_VMFLAGS]
    941     push    word [ss:PATM_VMFLAGS]
    942     and     dword [ss:PATM_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK
    943     or      dword [ss:PATM_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK
     940    pop     word [ss:PATM_ASMFIX_VMFLAGS]
     941    push    word [ss:PATM_ASMFIX_VMFLAGS]
     942    and     dword [ss:PATM_ASMFIX_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK
     943    or      dword [ss:PATM_ASMFIX_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK
    944944
    945945    DB      0x66    ; size override
    946946    popf    ;after the and and or operations!! (flags must be preserved)
    947     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     947    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    948948
    949949    DB      0xE9
    950950PATMPopf16Jump:
    951     DD      PATM_JUMPDELTA
     951    DD      PATM_ASMFIX_JUMPDELTA
    952952ENDPROC     PATMPopf16Replacement
    953953
     
    956956GLOBALNAME g_patmPopf16Record
    957957    PATCHASMRECORD_INIT_JUMP PATMPopf16Replacement, PATMPopf16Jump, 9
    958     DD      PATM_INTERRUPTFLAG,    0
    959     DD      PATM_INTERRUPTFLAG,    0
    960     DD      PATM_VM_FORCEDACTIONS, 0
    961     DD      PATM_INTERRUPTFLAG,    0
    962     DD      PATM_VMFLAGS,          0
    963     DD      PATM_VMFLAGS,          0
    964     DD      PATM_VMFLAGS,          0
    965     DD      PATM_VMFLAGS,          0
    966     DD      PATM_INTERRUPTFLAG,    0
     958    DD      PATM_ASMFIX_INTERRUPTFLAG,    0
     959    DD      PATM_ASMFIX_INTERRUPTFLAG,    0
     960    DD      PATM_ASMFIX_VM_FORCEDACTIONS, 0
     961    DD      PATM_ASMFIX_INTERRUPTFLAG,    0
     962    DD      PATM_ASMFIX_VMFLAGS,          0
     963    DD      PATM_ASMFIX_VMFLAGS,          0
     964    DD      PATM_ASMFIX_VMFLAGS,          0
     965    DD      PATM_ASMFIX_VMFLAGS,          0
     966    DD      PATM_ASMFIX_INTERRUPTFLAG,    0
    967967    DD      0ffffffffh, 0ffffffffh
    968968
     
    974974BEGIN_PATCH_CODE_SECTION
    975975BEGINPROC   PATMPopf16Replacement_NoExit
    976     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     976    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    977977    test    word [esp], X86_EFL_IF
    978978    jnz     PATMPopf16_Ok_NoExit
    979     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     979    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    980980    PATM_INT3
    981981
     
    983983    ; if interrupts are pending, then we must go back to the host context to handle them!
    984984    ; @note we destroy the flags here, but that should really not matter (PATM_INT3 case)
    985     test    dword [ss:PATM_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
     985    test    dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
    986986    jz      PATMPopf16_Continue_NoExit
    987     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     987    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    988988    PATM_INT3
    989989
    990990PATMPopf16_Continue_NoExit:
    991991
    992     pop     word [ss:PATM_VMFLAGS]
    993     push    word [ss:PATM_VMFLAGS]
    994     and     dword [ss:PATM_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK
    995     or      dword [ss:PATM_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK
     992    pop     word [ss:PATM_ASMFIX_VMFLAGS]
     993    push    word [ss:PATM_ASMFIX_VMFLAGS]
     994    and     dword [ss:PATM_ASMFIX_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK
     995    or      dword [ss:PATM_ASMFIX_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK
    996996
    997997    DB      0x66    ; size override
    998998    popf    ;after the and and or operations!! (flags must be preserved)
    999     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     999    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    10001000ENDPROC     PATMPopf16Replacement_NoExit
    10011001
     
    10041004GLOBALNAME g_patmPopf16Record_NoExit
    10051005    PATCHASMRECORD_INIT PATMPopf16Replacement_NoExit, 9
    1006     DD      PATM_INTERRUPTFLAG,    0
    1007     DD      PATM_INTERRUPTFLAG,    0
    1008     DD      PATM_VM_FORCEDACTIONS, 0
    1009     DD      PATM_INTERRUPTFLAG,    0
    1010     DD      PATM_VMFLAGS,          0
    1011     DD      PATM_VMFLAGS,          0
    1012     DD      PATM_VMFLAGS,          0
    1013     DD      PATM_VMFLAGS,          0
    1014     DD      PATM_INTERRUPTFLAG,    0
     1006    DD      PATM_ASMFIX_INTERRUPTFLAG,    0
     1007    DD      PATM_ASMFIX_INTERRUPTFLAG,    0
     1008    DD      PATM_ASMFIX_VM_FORCEDACTIONS, 0
     1009    DD      PATM_ASMFIX_INTERRUPTFLAG,    0
     1010    DD      PATM_ASMFIX_VMFLAGS,          0
     1011    DD      PATM_ASMFIX_VMFLAGS,          0
     1012    DD      PATM_ASMFIX_VMFLAGS,          0
     1013    DD      PATM_ASMFIX_VMFLAGS,          0
     1014    DD      PATM_ASMFIX_INTERRUPTFLAG,    0
    10151015    DD      0ffffffffh, 0ffffffffh
    10161016
     
    10211021BEGIN_PATCH_CODE_SECTION
    10221022BEGINPROC   PATMPushf32Replacement
    1023     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1023    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    10241024    pushfd
    10251025%ifdef PATM_LOG_PATCHINSTR
     
    10271027    push    ecx
    10281028    mov     eax, PATM_ACTION_LOG_PUSHF
    1029     lock    or dword [ss:PATM_PENDINGACTION], eax
     1029    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    10301030    mov     ecx, PATM_ACTION_MAGIC
    10311031    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    10381038    mov     eax, dword [esp+8]
    10391039    and     eax, PATM_FLAGS_MASK
    1040     or      eax, dword [ss:PATM_VMFLAGS]
     1040    or      eax, dword [ss:PATM_ASMFIX_VMFLAGS]
    10411041    mov     dword [esp+8], eax
    10421042    pop     eax
    10431043    popfd
    1044     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1044    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    10451045ENDPROC     PATMPushf32Replacement
    10461046
     
    10531053    PATCHASMRECORD_INIT PATMPushf32Replacement, 3
    10541054%endif
    1055     DD      PATM_INTERRUPTFLAG, 0
     1055    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    10561056%ifdef PATM_LOG_PATCHINSTR
    1057     DD      PATM_PENDINGACTION, 0
    1058 %endif
    1059     DD      PATM_VMFLAGS,       0
    1060     DD      PATM_INTERRUPTFLAG, 0
     1057    DD      PATM_ASMFIX_PENDINGACTION, 0
     1058%endif
     1059    DD      PATM_ASMFIX_VMFLAGS,       0
     1060    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    10611061    DD      0ffffffffh, 0ffffffffh
    10621062
     
    10671067BEGIN_PATCH_CODE_SECTION
    10681068BEGINPROC   PATMPushf16Replacement
    1069     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1069    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    10701070    DB      0x66    ; size override
    10711071    pushf
     
    10761076    mov     ax, word [esp+6]
    10771077    and     eax, PATM_FLAGS_MASK
    1078     or      eax, dword [ss:PATM_VMFLAGS]
     1078    or      eax, dword [ss:PATM_ASMFIX_VMFLAGS]
    10791079    mov     word [esp+6], ax
    10801080    pop     eax
     
    10821082    DB      0x66    ; size override
    10831083    popf
    1084     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1084    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    10851085ENDPROC     PATMPushf16Replacement
    10861086
     
    10891089GLOBALNAME g_patmPushf16Record
    10901090    PATCHASMRECORD_INIT PATMPushf16Replacement, 3
    1091     DD      PATM_INTERRUPTFLAG, 0
    1092     DD      PATM_VMFLAGS,       0
    1093     DD      PATM_INTERRUPTFLAG, 0
     1091    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1092    DD      PATM_ASMFIX_VMFLAGS,       0
     1093    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    10941094    DD      0ffffffffh, 0ffffffffh
    10951095
     
    11001100BEGIN_PATCH_CODE_SECTION
    11011101BEGINPROC   PATMPushCSReplacement
    1102     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1102    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    11031103    push    cs
    11041104    pushfd
     
    11131113    popfd
    11141114
    1115     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1115    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    11161116    DB      0xE9
    11171117PATMPushCSJump:
    1118     DD      PATM_JUMPDELTA
     1118    DD      PATM_ASMFIX_JUMPDELTA
    11191119ENDPROC     PATMPushCSReplacement
    11201120
     
    11231123GLOBALNAME g_patmPushCSRecord
    11241124    PATCHASMRECORD_INIT_JUMP PATMPushCSReplacement, PATMPushCSJump, 2
    1125     DD      PATM_INTERRUPTFLAG, 0
    1126     DD      PATM_INTERRUPTFLAG, 0
     1125    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1126    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    11271127    DD      0ffffffffh, 0ffffffffh
    11281128
     
    11631163BEGIN_PATCH_CODE_SECTION
    11641164BEGINPROC   PATMIretReplacement
    1165     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1165    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    11661166    pushfd
    11671167
     
    11721172    lea     edx, dword [ss:esp+12+4]        ;3 dwords + pushed flags -> iret eip
    11731173    mov     eax, PATM_ACTION_LOG_IRET
    1174     lock    or dword [ss:PATM_PENDINGACTION], eax
     1174    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    11751175    mov     ecx, PATM_ACTION_MAGIC
    11761176    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    12041204; Note: This is very important as pending pic interrupts can be overridden by apic interrupts if we don't check early enough (Fedora 5 boot)
    12051205; @@todo fix this properly, so we can dispatch pending interrupts in GC
    1206     test    dword [ss:PATM_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC
     1206    test    dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC
    12071207    jz      iret_continue
    12081208
    12091209; Go to our hypervisor trap handler to dispatch the pending irq
    1210     mov     dword [ss:PATM_TEMP_EAX], eax
    1211     mov     dword [ss:PATM_TEMP_ECX], ecx
    1212     mov     dword [ss:PATM_TEMP_EDI], edi
    1213     mov     dword [ss:PATM_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
     1210    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], eax
     1211    mov     dword [ss:PATM_ASMFIX_TEMP_ECX], ecx
     1212    mov     dword [ss:PATM_ASMFIX_TEMP_EDI], edi
     1213    mov     dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
    12141214    mov     eax, PATM_ACTION_PENDING_IRQ_AFTER_IRET
    1215     lock    or dword [ss:PATM_PENDINGACTION], eax
    1216     mov     ecx, PATM_ACTION_MAGIC
    1217     mov     edi, PATM_CURINSTRADDR
     1215    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
     1216    mov     ecx, PATM_ACTION_MAGIC
     1217    mov     edi, PATM_ASMFIX_CURINSTRADDR
    12181218
    12191219    popfd
     
    12291229    mov     eax, dword [esp+16]
    12301230    and     eax, X86_EFL_IOPL
    1231     and     dword [ss:PATM_VMFLAGS], ~X86_EFL_IOPL
    1232     or      dword [ss:PATM_VMFLAGS], eax
     1231    and     dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IOPL
     1232    or      dword [ss:PATM_ASMFIX_VMFLAGS], eax
    12331233    pop     eax
    12341234    and     dword [esp+12], ~X86_EFL_IOPL
    12351235
    12361236    ; Set IF again; below we make sure this won't cause problems.
    1237     or      dword [ss:PATM_VMFLAGS], X86_EFL_IF
     1237    or      dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF
    12381238
    12391239    ; make sure iret is executed fully (including the iret below; cli ... iret can otherwise be interrupted)
    1240     mov     dword [ss:PATM_INHIBITIRQADDR], PATM_CURINSTRADDR
    1241 
    1242     popfd
    1243     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1240    mov     dword [ss:PATM_ASMFIX_INHIBITIRQADDR], PATM_ASMFIX_CURINSTRADDR
     1241
     1242    popfd
     1243    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    12441244    iretd
    12451245    PATM_INT3
     
    12471247iret_fault:
    12481248    popfd
    1249     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1249    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    12501250    PATM_INT3
    12511251
     
    12531253    nop
    12541254    popfd
    1255     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1255    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    12561256    PATM_INT3
    12571257
     
    12601260    pushfd
    12611261    push    eax
    1262     push    PATM_FIXUP
     1262    push    PATM_ASMFIX_FIXUP
    12631263    DB      0E8h                    ; call
    1264     DD      PATM_IRET_FUNCTION
     1264    DD      PATM_ASMFIX_IRET_FUNCTION
    12651265    add     esp, 4                  ; pushed address of jump table
    12661266
     
    12821282    mov     eax, dword [esp+16]
    12831283    and     eax, X86_EFL_IOPL
    1284     and     dword [ss:PATM_VMFLAGS], ~X86_EFL_IOPL
    1285     or      dword [ss:PATM_VMFLAGS], eax
     1284    and     dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IOPL
     1285    or      dword [ss:PATM_ASMFIX_VMFLAGS], eax
    12861286    pop     eax
    12871287    and     dword [esp+12], ~X86_EFL_IOPL
    12881288
    12891289    ; Clear IF
    1290     and     dword [ss:PATM_VMFLAGS], ~X86_EFL_IF
    1291     popfd
    1292 
    1293                                                 ; the patched destination code will set PATM_INTERRUPTFLAG after the return!
     1290    and     dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IF
     1291    popfd
     1292
     1293                                                ; the patched destination code will set PATM_ASMFIX_INTERRUPTFLAG after the return!
    12941294    iretd
    12951295
     
    12991299
    13001300    ; Go to our hypervisor trap handler to perform the iret to v86 code
    1301     mov     dword [ss:PATM_TEMP_EAX], eax
    1302     mov     dword [ss:PATM_TEMP_ECX], ecx
    1303     mov     dword [ss:PATM_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX
     1301    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], eax
     1302    mov     dword [ss:PATM_ASMFIX_TEMP_ECX], ecx
     1303    mov     dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX
    13041304    mov     eax, PATM_ACTION_DO_V86_IRET
    1305     lock    or dword [ss:PATM_PENDINGACTION], eax
     1305    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    13061306    mov     ecx, PATM_ACTION_MAGIC
    13071307
     
    13351335    PATCHASMRECORD_INIT PATMIretReplacement, 25
    13361336%endif
    1337     DD      PATM_INTERRUPTFLAG,      0
     1337    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
    13381338%ifdef PATM_LOG_PATCHIRET
    1339     DD      PATM_PENDINGACTION,      0
    1340 %endif
    1341     DD      PATM_VM_FORCEDACTIONS,   0
    1342     DD      PATM_TEMP_EAX,           0
    1343     DD      PATM_TEMP_ECX,           0
    1344     DD      PATM_TEMP_EDI,           0
    1345     DD      PATM_TEMP_RESTORE_FLAGS, 0
    1346     DD      PATM_PENDINGACTION,      0
    1347     DD      PATM_CURINSTRADDR,       0
    1348     DD      PATM_VMFLAGS,            0
    1349     DD      PATM_VMFLAGS,            0
    1350     DD      PATM_VMFLAGS,            0
    1351     DD      PATM_INHIBITIRQADDR,     0
    1352     DD      PATM_CURINSTRADDR,       0
    1353     DD      PATM_INTERRUPTFLAG,      0
    1354     DD      PATM_INTERRUPTFLAG,      0
    1355     DD      PATM_INTERRUPTFLAG,      0
    1356     DD      PATM_FIXUP,              PATMIretTable - NAME(PATMIretReplacement)
    1357     DD      PATM_IRET_FUNCTION,      0
    1358     DD      PATM_VMFLAGS,            0
    1359     DD      PATM_VMFLAGS,            0
    1360     DD      PATM_VMFLAGS,            0
    1361     DD      PATM_TEMP_EAX,           0
    1362     DD      PATM_TEMP_ECX,           0
    1363     DD      PATM_TEMP_RESTORE_FLAGS, 0
    1364     DD      PATM_PENDINGACTION,      0
     1339    DD      PATM_ASMFIX_PENDINGACTION,      0
     1340%endif
     1341    DD      PATM_ASMFIX_VM_FORCEDACTIONS,   0
     1342    DD      PATM_ASMFIX_TEMP_EAX,           0
     1343    DD      PATM_ASMFIX_TEMP_ECX,           0
     1344    DD      PATM_ASMFIX_TEMP_EDI,           0
     1345    DD      PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0
     1346    DD      PATM_ASMFIX_PENDINGACTION,      0
     1347    DD      PATM_ASMFIX_CURINSTRADDR,       0
     1348    DD      PATM_ASMFIX_VMFLAGS,            0
     1349    DD      PATM_ASMFIX_VMFLAGS,            0
     1350    DD      PATM_ASMFIX_VMFLAGS,            0
     1351    DD      PATM_ASMFIX_INHIBITIRQADDR,     0
     1352    DD      PATM_ASMFIX_CURINSTRADDR,       0
     1353    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     1354    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     1355    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     1356    DD      PATM_ASMFIX_FIXUP,              PATMIretTable - NAME(PATMIretReplacement)
     1357    DD      PATM_ASMFIX_IRET_FUNCTION,      0
     1358    DD      PATM_ASMFIX_VMFLAGS,            0
     1359    DD      PATM_ASMFIX_VMFLAGS,            0
     1360    DD      PATM_ASMFIX_VMFLAGS,            0
     1361    DD      PATM_ASMFIX_TEMP_EAX,           0
     1362    DD      PATM_ASMFIX_TEMP_ECX,           0
     1363    DD      PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0
     1364    DD      PATM_ASMFIX_PENDINGACTION,      0
    13651365    DD      0ffffffffh,              0ffffffffh
    13661366
     
    14011401BEGIN_PATCH_CODE_SECTION
    14021402BEGINPROC   PATMIretRing1Replacement
    1403     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1403    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    14041404    pushfd
    14051405
     
    14101410    lea     edx, dword [ss:esp+12+4]        ;3 dwords + pushed flags -> iret eip
    14111411    mov     eax, PATM_ACTION_LOG_IRET
    1412     lock    or dword [ss:PATM_PENDINGACTION], eax
     1412    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    14131413    mov     ecx, PATM_ACTION_MAGIC
    14141414    db      0fh, 0bh        ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap)
     
    14401440; Note: This is very important as pending pic interrupts can be overridden by apic interrupts if we don't check early enough (Fedora 5 boot)
    14411441; @@todo fix this properly, so we can dispatch pending interrupts in GC
    1442     test    dword [ss:PATM_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC
     1442    test    dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC
    14431443    jz      iretring1_continue
    14441444
    14451445; Go to our hypervisor trap handler to dispatch the pending irq
    1446     mov     dword [ss:PATM_TEMP_EAX], eax
    1447     mov     dword [ss:PATM_TEMP_ECX], ecx
    1448     mov     dword [ss:PATM_TEMP_EDI], edi
    1449     mov     dword [ss:PATM_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
     1446    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], eax
     1447    mov     dword [ss:PATM_ASMFIX_TEMP_ECX], ecx
     1448    mov     dword [ss:PATM_ASMFIX_TEMP_EDI], edi
     1449    mov     dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI
    14501450    mov     eax, PATM_ACTION_PENDING_IRQ_AFTER_IRET
    1451     lock    or dword [ss:PATM_PENDINGACTION], eax
    1452     mov     ecx, PATM_ACTION_MAGIC
    1453     mov     edi, PATM_CURINSTRADDR
     1451    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
     1452    mov     ecx, PATM_ACTION_MAGIC
     1453    mov     edi, PATM_ASMFIX_CURINSTRADDR
    14541454
    14551455    popfd
     
    14851485    mov     eax, dword [esp+16]
    14861486    and     eax, X86_EFL_IOPL
    1487     and     dword [ss:PATM_VMFLAGS], ~X86_EFL_IOPL
    1488     or      dword [ss:PATM_VMFLAGS], eax
     1487    and     dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IOPL
     1488    or      dword [ss:PATM_ASMFIX_VMFLAGS], eax
    14891489    pop     eax
    14901490    and     dword [esp+12], ~X86_EFL_IOPL
    14911491
    14921492    ; Set IF again; below we make sure this won't cause problems.
    1493     or      dword [ss:PATM_VMFLAGS], X86_EFL_IF
     1493    or      dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF
    14941494
    14951495    ; make sure iret is executed fully (including the iret below; cli ... iret can otherwise be interrupted)
    1496     mov     dword [ss:PATM_INHIBITIRQADDR], PATM_CURINSTRADDR
    1497 
    1498     popfd
    1499     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1496    mov     dword [ss:PATM_ASMFIX_INHIBITIRQADDR], PATM_ASMFIX_CURINSTRADDR
     1497
     1498    popfd
     1499    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    15001500    iretd
    15011501    PATM_INT3
     
    15031503iretring1_fault:
    15041504    popfd
    1505     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1505    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    15061506    PATM_INT3
    15071507
     
    15091509    nop
    15101510    popfd
    1511     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1511    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    15121512    PATM_INT3
    15131513
     
    15161516    pushfd
    15171517    push    eax
    1518     push    PATM_FIXUP
     1518    push    PATM_ASMFIX_FIXUP
    15191519    DB      0E8h                    ; call
    1520     DD      PATM_IRET_FUNCTION
     1520    DD      PATM_ASMFIX_IRET_FUNCTION
    15211521    add     esp, 4                  ; pushed address of jump table
    15221522
     
    15351535    mov     eax, dword [esp+16]
    15361536    and     eax, X86_EFL_IOPL
    1537     and     dword [ss:PATM_VMFLAGS], ~X86_EFL_IOPL
    1538     or      dword [ss:PATM_VMFLAGS], eax
     1537    and     dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IOPL
     1538    or      dword [ss:PATM_ASMFIX_VMFLAGS], eax
    15391539    pop     eax
    15401540    and     dword [esp+12], ~X86_EFL_IOPL
    15411541
    15421542    ; Clear IF
    1543     and     dword [ss:PATM_VMFLAGS], ~X86_EFL_IF
     1543    and     dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IF
    15441544    popfd
    15451545
     
    15531553    and     dword [esp+20], ~1      ; SS
    15541554    or      dword [esp+20], 2
    1555                                                 ; the patched destination code will set PATM_INTERRUPTFLAG after the return!
     1555                                                ; the patched destination code will set PATM_ASMFIX_INTERRUPTFLAG after the return!
    15561556    iretd
    15571557
     
    15591559    ; force ring 1 CS RPL
    15601560    or      dword [esp+8], 1
    1561                                                 ; the patched destination code will set PATM_INTERRUPTFLAG after the return!
     1561                                                ; the patched destination code will set PATM_ASMFIX_INTERRUPTFLAG after the return!
    15621562    iretd
    15631563
     
    15671567
    15681568    ; Go to our hypervisor trap handler to perform the iret to v86 code
    1569     mov     dword [ss:PATM_TEMP_EAX], eax
    1570     mov     dword [ss:PATM_TEMP_ECX], ecx
    1571     mov     dword [ss:PATM_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX
     1569    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], eax
     1570    mov     dword [ss:PATM_ASMFIX_TEMP_ECX], ecx
     1571    mov     dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX
    15721572    mov     eax, PATM_ACTION_DO_V86_IRET
    1573     lock    or dword [ss:PATM_PENDINGACTION], eax
     1573    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], eax
    15741574    mov     ecx, PATM_ACTION_MAGIC
    15751575
     
    16031603    PATCHASMRECORD_INIT PATMIretRing1Replacement, 25
    16041604%endif
    1605     DD      PATM_INTERRUPTFLAG,      0
     1605    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
    16061606%ifdef PATM_LOG_PATCHIRET           
    1607     DD      PATM_PENDINGACTION,      0
     1607    DD      PATM_ASMFIX_PENDINGACTION,      0
    16081608%endif                               
    1609     DD      PATM_VM_FORCEDACTIONS,   0
    1610     DD      PATM_TEMP_EAX,           0
    1611     DD      PATM_TEMP_ECX,           0
    1612     DD      PATM_TEMP_EDI,           0
    1613     DD      PATM_TEMP_RESTORE_FLAGS, 0
    1614     DD      PATM_PENDINGACTION,      0
    1615     DD      PATM_CURINSTRADDR,       0
    1616     DD      PATM_VMFLAGS,            0
    1617     DD      PATM_VMFLAGS,            0
    1618     DD      PATM_VMFLAGS,            0
    1619     DD      PATM_INHIBITIRQADDR,     0
    1620     DD      PATM_CURINSTRADDR,       0
    1621     DD      PATM_INTERRUPTFLAG,      0
    1622     DD      PATM_INTERRUPTFLAG,      0
    1623     DD      PATM_INTERRUPTFLAG,      0
    1624     DD      PATM_FIXUP,              PATMIretRing1Table - NAME(PATMIretRing1Replacement)
    1625     DD      PATM_IRET_FUNCTION,      0
    1626     DD      PATM_VMFLAGS,            0
    1627     DD      PATM_VMFLAGS,            0
    1628     DD      PATM_VMFLAGS,            0
    1629     DD      PATM_TEMP_EAX,           0
    1630     DD      PATM_TEMP_ECX,           0
    1631     DD      PATM_TEMP_RESTORE_FLAGS, 0
    1632     DD      PATM_PENDINGACTION,      0
     1609    DD      PATM_ASMFIX_VM_FORCEDACTIONS,   0
     1610    DD      PATM_ASMFIX_TEMP_EAX,           0
     1611    DD      PATM_ASMFIX_TEMP_ECX,           0
     1612    DD      PATM_ASMFIX_TEMP_EDI,           0
     1613    DD      PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0
     1614    DD      PATM_ASMFIX_PENDINGACTION,      0
     1615    DD      PATM_ASMFIX_CURINSTRADDR,       0
     1616    DD      PATM_ASMFIX_VMFLAGS,            0
     1617    DD      PATM_ASMFIX_VMFLAGS,            0
     1618    DD      PATM_ASMFIX_VMFLAGS,            0
     1619    DD      PATM_ASMFIX_INHIBITIRQADDR,     0
     1620    DD      PATM_ASMFIX_CURINSTRADDR,       0
     1621    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     1622    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     1623    DD      PATM_ASMFIX_INTERRUPTFLAG,      0
     1624    DD      PATM_ASMFIX_FIXUP,              PATMIretRing1Table - NAME(PATMIretRing1Replacement)
     1625    DD      PATM_ASMFIX_IRET_FUNCTION,      0
     1626    DD      PATM_ASMFIX_VMFLAGS,            0
     1627    DD      PATM_ASMFIX_VMFLAGS,            0
     1628    DD      PATM_ASMFIX_VMFLAGS,            0
     1629    DD      PATM_ASMFIX_TEMP_EAX,           0
     1630    DD      PATM_ASMFIX_TEMP_ECX,           0
     1631    DD      PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0
     1632    DD      PATM_ASMFIX_PENDINGACTION,      0
    16331633    DD      0ffffffffh,              0ffffffffh
    16341634
     
    16441644;( +  0 return address )
    16451645;
    1646 ; @note assumes PATM_INTERRUPTFLAG is zero
     1646; @note assumes PATM_ASMFIX_INTERRUPTFLAG is zero
    16471647; @note assumes it can trash eax and eflags
    16481648;
     
    16801680    ; 2) Query return patch address from the hypervisor
    16811681    ; @todo private ugly interface, since we have nothing generic at the moment
    1682     lock    or dword [ss:PATM_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS
     1682    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS
    16831683    mov     eax, PATM_ACTION_LOOKUP_ADDRESS
    16841684    mov     ecx, PATM_ACTION_MAGIC
     
    16961696    jz      PATMIretFunction_Failure
    16971697
    1698     add     eax, PATM_PATCHBASE
     1698    add     eax, PATM_ASMFIX_PATCHBASE
    16991699
    17001700    pop     edi
     
    17151715GLOBALNAME g_patmIretFunctionRecord
    17161716    PATCHASMRECORD_INIT PATMIretFunction, 2
    1717     DD      PATM_PENDINGACTION, 0
    1718     DD      PATM_PATCHBASE,     0
     1717    DD      PATM_ASMFIX_PENDINGACTION, 0
     1718    DD      PATM_ASMFIX_PATCHBASE,     0
    17191719    DD      0ffffffffh, 0ffffffffh
    17201720
     
    17321732    not     dword [esp-32]
    17331733
    1734     mov     dword [ss:PATM_INTERRUPTFLAG], 0
    1735 PATCH_FIXUP PATM_INTERRUPTFLAG
     1734    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
     1735PATCH_FIXUP PATM_ASMFIX_INTERRUPTFLAG
    17361736    pushf
    17371737
     
    17411741
    17421742    popf
    1743     mov     dword [ss:PATM_INTERRUPTFLAG], 1
    1744 PATCH_FIXUP PATM_INTERRUPTFLAG
     1743    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
     1744PATCH_FIXUP PATM_ASMFIX_INTERRUPTFLAG
    17451745END_PATCH g_patmCpuidRecord, PATMCpuidReplacement
    17461746
     
    17511751BEGIN_PATCH_CODE_SECTION
    17521752BEGINPROC   PATMJEcxReplacement
    1753     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1753    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    17541754    pushfd
    17551755PATMJEcxSizeOverride:
     
    17591759
    17601760    popfd
    1761     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1761    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    17621762    DB      0xE9
    17631763PATMJEcxJump:
    1764     DD      PATM_JUMPDELTA
     1764    DD      PATM_ASMFIX_JUMPDELTA
    17651765
    17661766PATMJEcxContinue:
    17671767    popfd
    1768     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1768    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    17691769ENDPROC PATMJEcxReplacement
    17701770
     
    17731773GLOBALNAME g_patmJEcxRecord
    17741774    PATCHASMRECORD_INIT_EX PATMJEcxReplacement, , PATMJEcxJump, PATMJEcxSizeOverride, 3
    1775     DD      PATM_INTERRUPTFLAG, 0
    1776     DD      PATM_INTERRUPTFLAG, 0
    1777     DD      PATM_INTERRUPTFLAG, 0
     1775    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1776    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1777    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    17781778    DD      0ffffffffh, 0ffffffffh
    17791779
     
    17841784BEGIN_PATCH_CODE_SECTION
    17851785BEGINPROC   PATMLoopReplacement
    1786     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1786    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    17871787    pushfd
    17881788PATMLoopSizeOverride:
     
    17921792
    17931793    popfd
    1794     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1794    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    17951795    DB      0xE9
    17961796PATMLoopJump:
    1797     DD      PATM_JUMPDELTA
     1797    DD      PATM_ASMFIX_JUMPDELTA
    17981798
    17991799PATMLoopContinue:
    18001800    popfd
    1801     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1801    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    18021802ENDPROC PATMLoopReplacement
    18031803
     
    18061806GLOBALNAME g_patmLoopRecord
    18071807    PATCHASMRECORD_INIT_EX PATMLoopReplacement, , PATMLoopJump, PATMLoopSizeOverride, 3
    1808     DD      PATM_INTERRUPTFLAG, 0
    1809     DD      PATM_INTERRUPTFLAG, 0
    1810     DD      PATM_INTERRUPTFLAG, 0
     1808    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1809    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1810    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    18111811    DD      0ffffffffh, 0ffffffffh
    18121812
     
    18171817BEGIN_PATCH_CODE_SECTION
    18181818BEGINPROC   PATMLoopZReplacement
    1819     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1819    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    18201820    jnz     NAME(PATMLoopZReplacement_EndProc)
    18211821    pushfd
     
    18261826
    18271827    popfd
    1828     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1828    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    18291829    DB      0xE9
    18301830PATMLoopZJump:
    1831     DD      PATM_JUMPDELTA
     1831    DD      PATM_ASMFIX_JUMPDELTA
    18321832
    18331833PATMLoopZContinue:
    18341834    popfd
    1835     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1835    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    18361836ENDPROC PATMLoopZReplacement
    18371837
     
    18401840GLOBALNAME g_patmLoopZRecord
    18411841    PATCHASMRECORD_INIT_EX PATMLoopZReplacement, , PATMLoopZJump, PATMLoopZSizeOverride, 3
    1842     DD      PATM_INTERRUPTFLAG, 0
    1843     DD      PATM_INTERRUPTFLAG, 0
    1844     DD      PATM_INTERRUPTFLAG, 0
     1842    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1843    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1844    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    18451845    DD      0ffffffffh, 0ffffffffh
    18461846
     
    18511851BEGIN_PATCH_CODE_SECTION
    18521852BEGINPROC   PATMLoopNZReplacement
    1853     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1853    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    18541854    jz      NAME(PATMLoopNZReplacement_EndProc)
    18551855    pushfd
     
    18601860
    18611861    popfd
    1862     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1862    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    18631863    DB      0xE9
    18641864PATMLoopNZJump:
    1865     DD      PATM_JUMPDELTA
     1865    DD      PATM_ASMFIX_JUMPDELTA
    18661866
    18671867PATMLoopNZContinue:
    18681868    popfd
    1869     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     1869    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    18701870ENDPROC PATMLoopNZReplacement
    18711871
     
    18741874GLOBALNAME g_patmLoopNZRecord
    18751875    PATCHASMRECORD_INIT_EX PATMLoopNZReplacement, , PATMLoopNZJump, PATMLoopNZSizeOverride, 3
    1876     DD      PATM_INTERRUPTFLAG, 0
    1877     DD      PATM_INTERRUPTFLAG, 0
    1878     DD      PATM_INTERRUPTFLAG, 0
     1876    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1877    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     1878    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    18791879    DD      0ffffffffh, 0ffffffffh
    18801880
     
    18821882;
    18831883; Global patch function for indirect calls
    1884 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and doing:
     1884; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and doing:
    18851885;  + 20 push    [pTargetGC]
    18861886;  + 16 pushfd
     
    19001900
    19011901    mov     eax, dword [esp+16+4]                   ; guest return address
    1902     mov     dword [ss:PATM_CALL_RETURN_ADDR], eax                               ; temporary storage
     1902    mov     dword [ss:PATM_ASMFIX_CALL_RETURN_ADDR], eax                               ; temporary storage
    19031903
    19041904    mov     edx, dword [esp+16+20]  ; pushed target address
     
    19201920    ; nothing found -> let our trap handler try to find it
    19211921    ; @todo private ugly interface, since we have nothing generic at the moment
    1922     lock    or  dword [ss:PATM_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS
     1922    lock    or  dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS
    19231923    mov     eax, PATM_ACTION_LOOKUP_ADDRESS
    19241924    mov     ecx, PATM_ACTION_MAGIC
     
    19471947
    19481948    mov     ecx, eax                            ; ECX = target address (relative!)
    1949     add     ecx, PATM_PATCHBASE                 ; Make it absolute
    1950 
    1951     mov     edx, dword PATM_STACKPTR
     1949    add     ecx, PATM_ASMFIX_PATCHBASE                 ; Make it absolute
     1950
     1951    mov     edx, dword PATM_ASMFIX_STACKPTR
    19521952    cmp     dword [ss:edx], PATM_STACK_SIZE
    19531953    ja      near PATMLookupAndCall_Failure                    ; should never happen actually!!!
     
    19571957    ; save the patch return address on our private stack
    19581958    sub     dword [ss:edx], 4                   ; sizeof(RTGCPTR)
    1959     mov     eax, dword PATM_STACKBASE
     1959    mov     eax, dword PATM_ASMFIX_STACKBASE
    19601960    add     eax, dword [ss:edx]                 ; stack base + stack position
    19611961    mov     edi, dword [esp+16+8]               ; PATM return address
     
    19631963
    19641964    ; save the original return address as well (checked by ret to make sure the guest hasn't messed around with the stack)
    1965     mov     edi, dword PATM_STACKBASE_GUEST
     1965    mov     edi, dword PATM_ASMFIX_STACKBASE_GUEST
    19661966    add     edi, dword [ss:edx]                 ; stack base (guest) + stack position
    19671967    mov     eax, dword [esp+16+4]               ; guest return address
    19681968    mov     dword [ss:edi], eax
    19691969
    1970     mov     dword [ss:PATM_CALL_PATCH_TARGET_ADDR], ecx       ; temporarily store the target address
     1970    mov     dword [ss:PATM_ASMFIX_CALL_PATCH_TARGET_ADDR], ecx       ; temporarily store the target address
    19711971    pop     ecx
    19721972    pop     edi
     
    19801980    push    edx
    19811981    lea     edx, [esp + 12 - 4]                 ; stack address to store return address
    1982     lock    or dword [ss:PATM_PENDINGACTION], PATM_ACTION_LOG_CALL
     1982    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOG_CALL
    19831983    mov     eax, PATM_ACTION_LOG_CALL
    19841984    mov     ecx, PATM_ACTION_MAGIC
     
    19891989%endif
    19901990
    1991     push    dword [ss:PATM_CALL_RETURN_ADDR]   ; push original guest return address
    1992 
    1993     ; the called function will set PATM_INTERRUPTFLAG (!!)
    1994     jmp     dword [ss:PATM_CALL_PATCH_TARGET_ADDR]
     1991    push    dword [ss:PATM_ASMFIX_CALL_RETURN_ADDR]   ; push original guest return address
     1992
     1993    ; the called function will set PATM_ASMFIX_INTERRUPTFLAG (!!)
     1994    jmp     dword [ss:PATM_ASMFIX_CALL_PATCH_TARGET_ADDR]
    19951995    ; returning here -> do not add code here or after the jmp!!!!!
    19961996ENDPROC PATMLookupAndCall
     
    20042004    PATCHASMRECORD_INIT PATMLookupAndCall, 9
    20052005%endif
    2006     DD      PATM_CALL_RETURN_ADDR,       0
    2007     DD      PATM_PENDINGACTION,          0
    2008     DD      PATM_PATCHBASE,              0
    2009     DD      PATM_STACKPTR,               0
    2010     DD      PATM_STACKBASE,              0
    2011     DD      PATM_STACKBASE_GUEST,        0
    2012     DD      PATM_CALL_PATCH_TARGET_ADDR, 0
     2006    DD      PATM_ASMFIX_CALL_RETURN_ADDR,       0
     2007    DD      PATM_ASMFIX_PENDINGACTION,          0
     2008    DD      PATM_ASMFIX_PATCHBASE,              0
     2009    DD      PATM_ASMFIX_STACKPTR,               0
     2010    DD      PATM_ASMFIX_STACKBASE,              0
     2011    DD      PATM_ASMFIX_STACKBASE_GUEST,        0
     2012    DD      PATM_ASMFIX_CALL_PATCH_TARGET_ADDR, 0
    20132013%ifdef PATM_LOG_PATCHINSTR               
    2014     DD      PATM_PENDINGACTION,          0
     2014    DD      PATM_ASMFIX_PENDINGACTION,          0
    20152015%endif                                   
    2016     DD      PATM_CALL_RETURN_ADDR,       0
    2017     DD      PATM_CALL_PATCH_TARGET_ADDR, 0
     2016    DD      PATM_ASMFIX_CALL_RETURN_ADDR,       0
     2017    DD      PATM_ASMFIX_CALL_PATCH_TARGET_ADDR, 0
    20182018    DD      0ffffffffh, 0ffffffffh
    20192019
     
    20212021;
    20222022; Global patch function for indirect jumps
    2023 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and doing:
     2023; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and doing:
    20242024;  +  8 push    [pTargetGC]
    20252025;  +  4 push    [JumpTableAddress]
    20262026;( +  0 return address )
    2027 ; And saving eflags in PATM_TEMP_EFLAGS
     2027; And saving eflags in PATM_ASMFIX_TEMP_EFLAGS
    20282028;
    20292029; @note NEVER change this without bumping the SSM version
     
    20542054    ; nothing found -> let our trap handler try to find it
    20552055    ; @todo private ugly interface, since we have nothing generic at the moment
    2056     lock    or dword [ss:PATM_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS
     2056    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS
    20572057    mov     eax, PATM_ACTION_LOOKUP_ADDRESS
    20582058    mov     ecx, PATM_ACTION_MAGIC
     
    20812081
    20822082    mov     ecx, eax                            ; ECX = target address (relative!)
    2083     add     ecx, PATM_PATCHBASE                 ; Make it absolute
     2083    add     ecx, PATM_ASMFIX_PATCHBASE                 ; Make it absolute
    20842084
    20852085    ; save jump patch target
    2086     mov     dword [ss:PATM_TEMP_EAX], ecx
     2086    mov     dword [ss:PATM_ASMFIX_TEMP_EAX], ecx
    20872087    pop     ecx
    20882088    pop     edi
     
    20912091    add     esp, 12                             ; parameters + return address pushed by caller
    20922092    ; restore flags (just to be sure)
    2093     push    dword [ss:PATM_TEMP_EFLAGS]
    2094     popfd
    2095 
    2096     ; the jump destination will set PATM_INTERRUPTFLAG (!!)
    2097     jmp     dword [ss:PATM_TEMP_EAX]                      ; call duplicated patch destination address
     2093    push    dword [ss:PATM_ASMFIX_TEMP_EFLAGS]
     2094    popfd
     2095
     2096    ; the jump destination will set PATM_ASMFIX_INTERRUPTFLAG (!!)
     2097    jmp     dword [ss:PATM_ASMFIX_TEMP_EAX]                      ; call duplicated patch destination address
    20982098ENDPROC PATMLookupAndJump
    20992099
     
    21022102GLOBALNAME g_patmLookupAndJumpRecord
    21032103    PATCHASMRECORD_INIT PATMLookupAndJump, 5
    2104     DD      PATM_PENDINGACTION, 0
    2105     DD      PATM_PATCHBASE,     0
    2106     DD      PATM_TEMP_EAX,      0
    2107     DD      PATM_TEMP_EFLAGS,   0
    2108     DD      PATM_TEMP_EAX,      0
     2104    DD      PATM_ASMFIX_PENDINGACTION, 0
     2105    DD      PATM_ASMFIX_PATCHBASE,     0
     2106    DD      PATM_ASMFIX_TEMP_EAX,      0
     2107    DD      PATM_ASMFIX_TEMP_EFLAGS,   0
     2108    DD      PATM_ASMFIX_TEMP_EAX,      0
    21092109    DD      0ffffffffh, 0ffffffffh
    21102110
     
    21122112; Patch function for static calls
    21132113; @note static calls have only one lookup slot!
    2114 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and adding:
     2114; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and adding:
    21152115;   push    [pTargetGC]
    21162116;
     
    21182118BEGINPROC PATMCall
    21192119    pushfd
    2120     push    PATM_FIXUP              ; fixup for jump table below
    2121     push    PATM_PATCHNEXTBLOCK
    2122     push    PATM_RETURNADDR
     2120    push    PATM_ASMFIX_FIXUP              ; fixup for jump table below
     2121    push    PATM_ASMFIX_PATCHNEXTBLOCK
     2122    push    PATM_ASMFIX_RETURNADDR
    21232123    DB      0E8h                    ; call
    2124     DD      PATM_LOOKUP_AND_CALL_FUNCTION
     2124    DD      PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION
    21252125    ; we only return in case of a failure
    21262126    add     esp, 12                 ; pushed address of jump table
    21272127    popfd
    21282128    add     esp, 4                  ; pushed by caller (changes the flags, but that shouldn't matter (@todo))
    2129     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     2129    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    21302130    PATM_INT3
    21312131%ifdef DEBUG
     
    21482148GLOBALNAME g_patmCallRecord
    21492149    PATCHASMRECORD_INIT PATMCall, 5
    2150     DD      PATM_FIXUP,                     PATMCallTable - NAME(PATMCall)
    2151     DD      PATM_PATCHNEXTBLOCK,            0
    2152     DD      PATM_RETURNADDR,                0
    2153     DD      PATM_LOOKUP_AND_CALL_FUNCTION,  0
    2154     DD      PATM_INTERRUPTFLAG,             0
     2150    DD      PATM_ASMFIX_FIXUP,                     PATMCallTable - NAME(PATMCall)
     2151    DD      PATM_ASMFIX_PATCHNEXTBLOCK,            0
     2152    DD      PATM_ASMFIX_RETURNADDR,                0
     2153    DD      PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION,  0
     2154    DD      PATM_ASMFIX_INTERRUPTFLAG,             0
    21552155    DD      0ffffffffh, 0ffffffffh
    21562156
    21572157
    21582158; Patch function for indirect calls
    2159 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and adding:
     2159; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and adding:
    21602160;   push    [pTargetGC]
    21612161;
     
    21632163BEGINPROC PATMCallIndirect
    21642164    pushfd
    2165     push    PATM_FIXUP              ; fixup for jump table below
    2166     push    PATM_PATCHNEXTBLOCK
    2167     push    PATM_RETURNADDR
     2165    push    PATM_ASMFIX_FIXUP              ; fixup for jump table below
     2166    push    PATM_ASMFIX_PATCHNEXTBLOCK
     2167    push    PATM_ASMFIX_RETURNADDR
    21682168    DB      0E8h                    ; call
    2169     DD      PATM_LOOKUP_AND_CALL_FUNCTION
     2169    DD      PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION
    21702170    ; we only return in case of a failure
    21712171    add     esp, 12                 ; pushed address of jump table
    21722172    popfd
    21732173    add     esp, 4                  ; pushed by caller (changes the flags, but that shouldn't matter (@todo))
    2174     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     2174    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    21752175    PATM_INT3
    21762176%ifdef DEBUG
     
    21932193GLOBALNAME g_patmCallIndirectRecord
    21942194    PATCHASMRECORD_INIT PATMCallIndirect, 5
    2195     DD      PATM_FIXUP,                     PATMCallIndirectTable - NAME(PATMCallIndirect)
    2196     DD      PATM_PATCHNEXTBLOCK,            0
    2197     DD      PATM_RETURNADDR,                0
    2198     DD      PATM_LOOKUP_AND_CALL_FUNCTION,  0
    2199     DD      PATM_INTERRUPTFLAG,             0
     2195    DD      PATM_ASMFIX_FIXUP,                     PATMCallIndirectTable - NAME(PATMCallIndirect)
     2196    DD      PATM_ASMFIX_PATCHNEXTBLOCK,            0
     2197    DD      PATM_ASMFIX_RETURNADDR,                0
     2198    DD      PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION,  0
     2199    DD      PATM_ASMFIX_INTERRUPTFLAG,             0
    22002200    DD      0ffffffffh, 0ffffffffh
    22012201
     
    22032203;
    22042204; Patch function for indirect jumps
    2205 ; Caller is responsible for clearing PATM_INTERRUPTFLAG and adding:
     2205; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and adding:
    22062206;   push    [pTargetGC]
    22072207;
     
    22102210    ; save flags (just to be sure)
    22112211    pushfd
    2212     pop     dword [ss:PATM_TEMP_EFLAGS]
    2213 
    2214     push    PATM_FIXUP              ; fixup for jump table below
     2212    pop     dword [ss:PATM_ASMFIX_TEMP_EFLAGS]
     2213
     2214    push    PATM_ASMFIX_FIXUP              ; fixup for jump table below
    22152215    DB      0E8h                    ; call
    2216     DD      PATM_LOOKUP_AND_JUMP_FUNCTION
     2216    DD      PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION
    22172217    ; we only return in case of a failure
    22182218    add     esp, 8                  ; pushed address of jump table + pushed target address
    22192219
    22202220    ; restore flags (just to be sure)
    2221     push    dword [ss:PATM_TEMP_EFLAGS]
    2222     popfd
    2223 
    2224     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     2221    push    dword [ss:PATM_ASMFIX_TEMP_EFLAGS]
     2222    popfd
     2223
     2224    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    22252225    PATM_INT3
    22262226
     
    22442244GLOBALNAME g_patmJumpIndirectRecord
    22452245    PATCHASMRECORD_INIT PATMJumpIndirect, 5
    2246     DD      PATM_TEMP_EFLAGS,               0
    2247     DD      PATM_FIXUP,                     PATMJumpIndirectTable - NAME(PATMJumpIndirect)
    2248     DD      PATM_LOOKUP_AND_JUMP_FUNCTION,  0
    2249     DD      PATM_TEMP_EFLAGS,               0
    2250     DD      PATM_INTERRUPTFLAG,             0
     2246    DD      PATM_ASMFIX_TEMP_EFLAGS,               0
     2247    DD      PATM_ASMFIX_FIXUP,                     PATMJumpIndirectTable - NAME(PATMJumpIndirect)
     2248    DD      PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION,  0
     2249    DD      PATM_ASMFIX_TEMP_EFLAGS,               0
     2250    DD      PATM_ASMFIX_INTERRUPTFLAG,             0
    22512251    DD      0ffffffffh, 0ffffffffh
    22522252
     
    22602260    not     dword [esp-32]
    22612261    not     dword [esp-32]
    2262     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     2262    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    22632263    pushfd
    22642264    push    eax
    2265     push    PATM_FIXUP
     2265    push    PATM_ASMFIX_FIXUP
    22662266    DB      0E8h                    ; call
    2267     DD      PATM_RETURN_FUNCTION
     2267    DD      PATM_ASMFIX_RETURN_FUNCTION
    22682268    add     esp, 4                  ; pushed address of jump table
    22692269
     
    22732273    pop     eax
    22742274    popfd
    2275     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     2275    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    22762276    PATM_INT3
    22772277
     
    22922292    popf
    22932293                                                ; caller will duplicate the ret or ret n instruction
    2294                                                 ; the patched call will set PATM_INTERRUPTFLAG after the return!
     2294                                                ; the patched call will set PATM_ASMFIX_INTERRUPTFLAG after the return!
    22952295ENDPROC     PATMRet
    22962296
     
    22982298GLOBALNAME g_patmRetRecord
    22992299    PATCHASMRECORD_INIT PATMRet, 4
    2300     DD      PATM_INTERRUPTFLAG,   0
    2301     DD      PATM_FIXUP,           PATMRetTable - NAME(PATMRet)
    2302     DD      PATM_RETURN_FUNCTION, 0
    2303     DD      PATM_INTERRUPTFLAG,   0
     2300    DD      PATM_ASMFIX_INTERRUPTFLAG,   0
     2301    DD      PATM_ASMFIX_FIXUP,           PATMRetTable - NAME(PATMRet)
     2302    DD      PATM_ASMFIX_RETURN_FUNCTION, 0
     2303    DD      PATM_ASMFIX_INTERRUPTFLAG,   0
    23042304    DD      0ffffffffh, 0ffffffffh
    23052305
     
    23152315;( +  0 return address )
    23162316;
    2317 ; @note assumes PATM_INTERRUPTFLAG is zero
     2317; @note assumes PATM_ASMFIX_INTERRUPTFLAG is zero
    23182318; @note assumes it can trash eax and eflags
    23192319;
     
    23372337
    23382338    ; 1) Check if the return patch address was pushed on the PATM stack
    2339     cmp     dword [ss:PATM_STACKPTR], PATM_STACK_SIZE
     2339    cmp     dword [ss:PATM_ASMFIX_STACKPTR], PATM_STACK_SIZE
    23402340    jae     near PATMRetFunction_FindReturnAddress
    23412341
    2342     mov     edx, dword PATM_STACKPTR
     2342    mov     edx, dword PATM_ASMFIX_STACKPTR
    23432343
    23442344    ; check if the return address is what we expect it to be
    2345     mov     eax, dword PATM_STACKBASE_GUEST
     2345    mov     eax, dword PATM_ASMFIX_STACKBASE_GUEST
    23462346    add     eax, dword [ss:edx]                 ; stack base + stack position
    23472347    mov     eax, dword [ss:eax]                 ; original return address
     
    23532353
    23542354    ; found it, convert relative to absolute patch address and return the result to the caller
    2355     mov     eax, dword PATM_STACKBASE
     2355    mov     eax, dword PATM_ASMFIX_STACKBASE
    23562356    add     eax, dword [ss:edx]                 ; stack base + stack position
    23572357    mov     eax, dword [ss:eax]                 ; relative patm return address
    2358     add     eax, PATM_PATCHBASE
     2358    add     eax, PATM_ASMFIX_PATCHBASE
    23592359
    23602360%ifdef PATM_LOG_PATCHINSTR
     
    23652365    mov     edx, eax                            ; return address
    23662366    lea     ebx, [esp+16+12+16]                 ; stack address containing the return address
    2367     lock    or dword [ss:PATM_PENDINGACTION], PATM_ACTION_LOG_RET
     2367    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOG_RET
    23682368    mov     eax, PATM_ACTION_LOG_RET
    23692369    mov     ecx, PATM_ACTION_MAGIC
     
    24022402    ; 3) Query return patch address from the hypervisor
    24032403    ; @todo private ugly interface, since we have nothing generic at the moment
    2404     lock    or dword [ss:PATM_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS
     2404    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS
    24052405    mov     eax, PATM_ACTION_LOOKUP_ADDRESS
    24062406    mov     ecx, PATM_ACTION_MAGIC
     
    24182418    jz      PATMRetFunction_Failure
    24192419
    2420     add     eax, PATM_PATCHBASE
     2420    add     eax, PATM_ASMFIX_PATCHBASE
    24212421
    24222422%ifdef PATM_LOG_PATCHINSTR
     
    24272427    mov     edx, eax                            ; return address
    24282428    lea     ebx, [esp+16+12+16]                 ; stack address containing the return address
    2429     lock    or dword [ss:PATM_PENDINGACTION], PATM_ACTION_LOG_RET
     2429    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOG_RET
    24302430    mov     eax, PATM_ACTION_LOG_RET
    24312431    mov     ecx, PATM_ACTION_MAGIC
     
    24582458    PATCHASMRECORD_INIT PATMRetFunction, 7
    24592459%endif
    2460     DD      PATM_STACKPTR,        0
    2461     DD      PATM_STACKPTR,        0
    2462     DD      PATM_STACKBASE_GUEST, 0
    2463     DD      PATM_STACKBASE,       0
    2464     DD      PATM_PATCHBASE,       0
     2460    DD      PATM_ASMFIX_STACKPTR,        0
     2461    DD      PATM_ASMFIX_STACKPTR,        0
     2462    DD      PATM_ASMFIX_STACKBASE_GUEST, 0
     2463    DD      PATM_ASMFIX_STACKBASE,       0
     2464    DD      PATM_ASMFIX_PATCHBASE,       0
    24652465%ifdef PATM_LOG_PATCHINSTR       
    2466     DD      PATM_PENDINGACTION,   0
     2466    DD      PATM_ASMFIX_PENDINGACTION,   0
    24672467%endif                           
    2468     DD      PATM_PENDINGACTION,   0
    2469     DD      PATM_PATCHBASE,       0
     2468    DD      PATM_ASMFIX_PENDINGACTION,   0
     2469    DD      PATM_ASMFIX_PATCHBASE,       0
    24702470%ifdef PATM_LOG_PATCHINSTR       
    2471     DD      PATM_PENDINGACTION,   0
     2471    DD      PATM_ASMFIX_PENDINGACTION,   0
    24722472%endif
    24732473    DD      0ffffffffh, 0ffffffffh
     
    24792479BEGIN_PATCH_CODE_SECTION
    24802480BEGINPROC   PATMCheckIF
    2481     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     2481    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    24822482    pushf
    2483     test    dword [ss:PATM_VMFLAGS], X86_EFL_IF
     2483    test    dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF
    24842484    jnz     PATMCheckIF_Safe
    24852485    nop
     
    24872487    ; IF=0 -> unsafe, so we must call the duplicated function (which we don't do here)
    24882488    popf
    2489     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     2489    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    24902490    jmp     NAME(PATMCheckIF_EndProc)
    24912491
    24922492PATMCheckIF_Safe:
    24932493    ; invalidate the PATM stack as we'll jump back to guest code
    2494     mov     dword [ss:PATM_STACKPTR], PATM_STACK_SIZE
     2494    mov     dword [ss:PATM_ASMFIX_STACKPTR], PATM_STACK_SIZE
    24952495
    24962496%ifdef PATM_LOG_PATCHINSTR
    24972497    push    eax
    24982498    push    ecx
    2499     lock    or dword [ss:PATM_PENDINGACTION], PATM_ACTION_LOG_IF1
     2499    lock    or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOG_IF1
    25002500    mov     eax, PATM_ACTION_LOG_IF1
    25012501    mov     ecx, PATM_ACTION_MAGIC
     
    25052505%endif
    25062506    popf
    2507     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     2507    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    25082508    ; IF=1 -> we can safely jump back to the original instruction
    25092509    DB      0xE9
    25102510PATMCheckIF_Jump:
    2511     DD      PATM_JUMPDELTA
     2511    DD      PATM_ASMFIX_JUMPDELTA
    25122512ENDPROC     PATMCheckIF
    25132513
     
    25202520    PATCHASMRECORD_INIT_JUMP PATMCheckIF, PATMCheckIF_Jump, 5
    25212521%endif
    2522     DD      PATM_INTERRUPTFLAG, 0
    2523     DD      PATM_VMFLAGS,       0
    2524     DD      PATM_INTERRUPTFLAG, 0
    2525     DD      PATM_STACKPTR,      0
     2522    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     2523    DD      PATM_ASMFIX_VMFLAGS,       0
     2524    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     2525    DD      PATM_ASMFIX_STACKPTR,      0
    25262526%ifdef PATM_LOG_PATCHINSTR     
    2527     DD      PATM_PENDINGACTION, 0
     2527    DD      PATM_ASMFIX_PENDINGACTION, 0
    25282528%endif                         
    2529     DD      PATM_INTERRUPTFLAG, 0
     2529    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    25302530    DD      0ffffffffh, 0ffffffffh
    25312531
     
    25362536BEGIN_PATCH_CODE_SECTION
    25372537BEGINPROC   PATMJumpToGuest_IF1
    2538     mov     dword [ss:PATM_INTERRUPTFLAG], 0
     2538    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0
    25392539    pushf
    2540     test    dword [ss:PATM_VMFLAGS], X86_EFL_IF
     2540    test    dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF
    25412541    jnz     PATMJumpToGuest_IF1_Safe
    25422542    nop
     
    25442544    ; IF=0 -> unsafe, so fault
    25452545    popf
    2546     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     2546    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    25472547    PATM_INT3
    25482548
     
    25502550    ; IF=1 -> we can safely jump back to the original instruction
    25512551    popf
    2552     mov     dword [ss:PATM_INTERRUPTFLAG], 1
     2552    mov     dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1
    25532553    DB      0xE9
    25542554PATMJumpToGuest_IF1_Jump:
    2555     DD      PATM_JUMPDELTA
     2555    DD      PATM_ASMFIX_JUMPDELTA
    25562556ENDPROC     PATMJumpToGuest_IF1
    25572557
     
    25602560GLOBALNAME PATMJumpToGuest_IF1Record
    25612561    PATCHASMRECORD_INIT_JUMP PATMJumpToGuest_IF1, PATMJumpToGuest_IF1_Jump, 4
    2562     DD      PATM_INTERRUPTFLAG, 0
    2563     DD      PATM_VMFLAGS,       0
    2564     DD      PATM_INTERRUPTFLAG, 0
    2565     DD      PATM_INTERRUPTFLAG, 0
     2562    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     2563    DD      PATM_ASMFIX_VMFLAGS,       0
     2564    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
     2565    DD      PATM_ASMFIX_INTERRUPTFLAG, 0
    25662566    DD      0ffffffffh, 0ffffffffh
    25672567
  • trunk/src/VBox/VMM/VMMR3/PATMA.mac

    r54763 r54764  
    2222; @remarks These fixups types are part of the saved state.
    2323; @{
    24 %define PATM_VMFLAGS                            0xF1ABCD00
     24%define PATM_ASMFIX_VMFLAGS                     0xF1ABCD00
    2525%ifdef VBOX_WITH_STATISTICS
    26  %define PATM_ALLPATCHCALLS                     0xF1ABCD01
    27  %define PATM_PERPATCHCALLS                     0xF1ABCD02
     26 %define PATM_ASMFIX_ALLPATCHCALLS              0xF1ABCD01
     27 %define PATM_ASMFIX_PERPATCHCALLS              0xF1ABCD02
    2828%endif
    29 %define PATM_JUMPDELTA                          0xF1ABCD03
     29%define PATM_ASMFIX_JUMPDELTA                   0xF1ABCD03
    3030%ifdef VBOX_WITH_STATISTICS
    31  %define PATM_IRETEFLAGS                        0xF1ABCD04
    32  %define PATM_IRETCS                            0xF1ABCD05
    33  %define PATM_IRETEIP                           0xF1ABCD06
     31 %define PATM_ASMFIX_IRETEFLAGS                 0xF1ABCD04
     32 %define PATM_ASMFIX_IRETCS                     0xF1ABCD05
     33 %define PATM_ASMFIX_IRETEIP                    0xF1ABCD06
    3434%endif
    35 %define PATM_FIXUP                              0xF1ABCD07
    36 %define PATM_PENDINGACTION                      0xF1ABCD08
    37 %define PATM_CPUID_STD_PTR                      0xF1ABCD09
    38 %define PATM_CPUID_EXT_PTR                      0xF1ABCD0a
    39 %define PATM_CPUID_DEF_PTR                      0xF1ABCD0b
    40 %define PATM_STACKBASE                          0xF1ABCD0c  ;;< Stack to store our private patch return addresses
    41 %define PATM_STACKBASE_GUEST                    0xF1ABCD0d  ;;< Stack to store guest return addresses
    42 %define PATM_STACKPTR                           0xF1ABCD0e
    43 %define PATM_PATCHBASE                          0xF1ABCD0f
    44 %define PATM_INTERRUPTFLAG                      0xF1ABCD10
    45 %define PATM_INHIBITIRQADDR                     0xF1ABCD11
    46 %define PATM_VM_FORCEDACTIONS                   0xF1ABCD12
    47 %define PATM_TEMP_EAX                           0xF1ABCD13  ;;< Location for original EAX register
    48 %define PATM_TEMP_ECX                           0xF1ABCD14  ;;< Location for original ECX register
    49 %define PATM_TEMP_EDI                           0xF1ABCD15  ;;< Location for original EDI register
    50 %define PATM_TEMP_EFLAGS                        0xF1ABCD16  ;;< Location for original eflags
    51 %define PATM_TEMP_RESTORE_FLAGS                 0xF1ABCD17  ;;< Which registers to restore
    52 %define PATM_CALL_PATCH_TARGET_ADDR             0xF1ABCD18
    53 %define PATM_CALL_RETURN_ADDR                   0xF1ABCD19
    54 %define PATM_CPUID_CENTAUR_PTR                  0xF1ABCD1a
     35%define PATM_ASMFIX_FIXUP                       0xF1ABCD07
     36%define PATM_ASMFIX_PENDINGACTION               0xF1ABCD08
     37%define PATM_ASMFIX_CPUID_STD_PTR               0xF1ABCD09
     38%define PATM_ASMFIX_CPUID_EXT_PTR               0xF1ABCD0a
     39%define PATM_ASMFIX_CPUID_DEF_PTR               0xF1ABCD0b
     40%define PATM_ASMFIX_STACKBASE                   0xF1ABCD0c  ;;< Stack to store our private patch return addresses
     41%define PATM_ASMFIX_STACKBASE_GUEST             0xF1ABCD0d  ;;< Stack to store guest return addresses
     42%define PATM_ASMFIX_STACKPTR                    0xF1ABCD0e
     43%define PATM_ASMFIX_PATCHBASE                   0xF1ABCD0f
     44%define PATM_ASMFIX_INTERRUPTFLAG               0xF1ABCD10
     45%define PATM_ASMFIX_INHIBITIRQADDR              0xF1ABCD11
     46%define PATM_ASMFIX_VM_FORCEDACTIONS            0xF1ABCD12
     47%define PATM_ASMFIX_TEMP_EAX                    0xF1ABCD13  ;;< Location for original EAX register
     48%define PATM_ASMFIX_TEMP_ECX                    0xF1ABCD14  ;;< Location for original ECX register
     49%define PATM_ASMFIX_TEMP_EDI                    0xF1ABCD15  ;;< Location for original EDI register
     50%define PATM_ASMFIX_TEMP_EFLAGS                 0xF1ABCD16  ;;< Location for original eflags
     51%define PATM_ASMFIX_TEMP_RESTORE_FLAGS          0xF1ABCD17  ;;< Which registers to restore
     52%define PATM_ASMFIX_CALL_PATCH_TARGET_ADDR      0xF1ABCD18
     53%define PATM_ASMFIX_CALL_RETURN_ADDR            0xF1ABCD19
     54%define PATM_ASMFIX_CPUID_CENTAUR_PTR           0xF1ABCD1a
    5555%define PATM_ASMFIX_REUSE_LATER_0               0xF1ABCD1b
    5656%define PATM_ASMFIX_REUSE_LATER_1               0xF1ABCD1c
     
    6060
    6161;/* Anything larger doesn't require a fixup */
    62 %define PATM_NO_FIXUP                           0xF1ABCE00
    63 %define PATM_CPUID_STD_MAX                      0xF1ABCE00
    64 %define PATM_CPUID_EXT_MAX                      0xF1ABCE01
    65 %define PATM_RETURNADDR                         0xF1ABCE02
    66 %define PATM_PATCHNEXTBLOCK                     0xF1ABCE03
    67 %define PATM_CALLTARGET                         0xF1ABCE04  ;;< relative call target
    68 %define PATM_NEXTINSTRADDR                      0xF1ABCE05  ;;< absolute guest address of the next instruction
    69 %define PATM_CURINSTRADDR                       0xF1ABCE06  ;;< absolute guest address of the current instruction
    70 %define PATM_LOOKUP_AND_CALL_FUNCTION           0xF1ABCE07  ;;< Relative address of global PATM lookup and call function.
    71 %define PATM_RETURN_FUNCTION                    0xF1ABCE08  ;;< Relative address of global PATM return function.
    72 %define PATM_LOOKUP_AND_JUMP_FUNCTION           0xF1ABCE09  ;;< Relative address of global PATM lookup and jump function.
    73 %define PATM_IRET_FUNCTION                      0xF1ABCE0A  ;;< Relative address of global PATM iret function.
    74 %define PATM_CPUID_CENTAUR_MAX                  0xF1ABCE0B
     62%define PATM_ASMFIX_NO_FIXUP                    0xF1ABCE00
     63%define PATM_ASMFIX_CPUID_STD_MAX               0xF1ABCE00
     64%define PATM_ASMFIX_CPUID_EXT_MAX               0xF1ABCE01
     65%define PATM_ASMFIX_RETURNADDR                  0xF1ABCE02
     66%define PATM_ASMFIX_PATCHNEXTBLOCK              0xF1ABCE03
     67%define PATM_ASMFIX_CALLTARGET                  0xF1ABCE04  ;;< relative call target
     68%define PATM_ASMFIX_NEXTINSTRADDR               0xF1ABCE05  ;;< absolute guest address of the next instruction
     69%define PATM_ASMFIX_CURINSTRADDR                0xF1ABCE06  ;;< absolute guest address of the current instruction
     70%define PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION    0xF1ABCE07  ;;< Relative address of global PATM lookup and call function.
     71%define PATM_ASMFIX_RETURN_FUNCTION             0xF1ABCE08  ;;< Relative address of global PATM return function.
     72%define PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION    0xF1ABCE09  ;;< Relative address of global PATM lookup and jump function.
     73%define PATM_ASMFIX_IRET_FUNCTION               0xF1ABCE0A  ;;< Relative address of global PATM iret function.
     74%define PATM_ASMFIX_CPUID_CENTAUR_MAX           0xF1ABCE0B
    7575;; @}
    7676
     
    108108%define PATM_ACTION_MAGIC                       0xABCD4321
    109109
    110 ;; @name PATM_TEMP_RESTORE_FLAGS
     110;; @name PATM_ASMFIX_TEMP_RESTORE_FLAGS
    111111;; @{
    112112%define PATM_RESTORE_EAX                        RT_BIT(0)
  • trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp

    r54763 r54764  
    109109                   || uType == FIXUP_REL_HELPER_IN_PATCH_ASM_TMPL)
    110110               && pSource == pDest
    111                && PATM_IS_FIXUP_TYPE(pSource))
     111               && PATM_IS_ASMFIX(pSource))
    112112           || ((uType == FIXUP_REL_JMPTOPATCH || uType == FIXUP_REL_JMPTOGUEST) && pSource && pDest));
    113113
     
    172172
    173173#ifdef VBOX_STRICT
    174                 if (pAsmRecord->aRelocs[i].uType == PATM_FIXUP)
     174                if (pAsmRecord->aRelocs[i].uType == PATM_ASMFIX_FIXUP)
    175175                    Assert(pAsmRecord->aRelocs[i].uInfo != 0);
    176176                else
     
    188188                     * PATMGCSTATE member fixups.
    189189                     */
    190                     case PATM_VMFLAGS:
     190                    case PATM_ASMFIX_VMFLAGS:
    191191                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uVMFlags);
    192192                        break;
    193                     case PATM_PENDINGACTION:
     193                    case PATM_ASMFIX_PENDINGACTION:
    194194                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uPendingAction);
    195195                        break;
    196                     case PATM_STACKPTR:
     196                    case PATM_ASMFIX_STACKPTR:
    197197                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Psp);
    198198                        break;
    199                     case PATM_INTERRUPTFLAG:
     199                    case PATM_ASMFIX_INTERRUPTFLAG:
    200200                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, fPIF);
    201201                        break;
    202                     case PATM_INHIBITIRQADDR:
     202                    case PATM_ASMFIX_INHIBITIRQADDR:
    203203                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, GCPtrInhibitInterrupts);
    204204                        break;
    205                     case PATM_TEMP_EAX:
     205                    case PATM_ASMFIX_TEMP_EAX:
    206206                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.uEAX);
    207207                        break;
    208                     case PATM_TEMP_ECX:
     208                    case PATM_ASMFIX_TEMP_ECX:
    209209                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.uECX);
    210210                        break;
    211                     case PATM_TEMP_EDI:
     211                    case PATM_ASMFIX_TEMP_EDI:
    212212                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.uEDI);
    213213                        break;
    214                     case PATM_TEMP_EFLAGS:
     214                    case PATM_ASMFIX_TEMP_EFLAGS:
    215215                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.eFlags);
    216216                        break;
    217                     case PATM_TEMP_RESTORE_FLAGS:
     217                    case PATM_ASMFIX_TEMP_RESTORE_FLAGS:
    218218                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.uFlags);
    219219                        break;
    220                     case PATM_CALL_PATCH_TARGET_ADDR:
     220                    case PATM_ASMFIX_CALL_PATCH_TARGET_ADDR:
    221221                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, GCCallPatchTargetAddr);
    222222                        break;
    223                     case PATM_CALL_RETURN_ADDR:
     223                    case PATM_ASMFIX_CALL_RETURN_ADDR:
    224224                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, GCCallReturnAddr);
    225225                        break;
    226226#ifdef VBOX_WITH_STATISTICS
    227                     case PATM_ALLPATCHCALLS:
     227                    case PATM_ASMFIX_ALLPATCHCALLS:
    228228                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uPatchCalls);
    229229                        break;
    230                     case PATM_IRETEFLAGS:
     230                    case PATM_ASMFIX_IRETEFLAGS:
    231231                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uIretEFlags);
    232232                        break;
    233                     case PATM_IRETCS:
     233                    case PATM_ASMFIX_IRETCS:
    234234                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uIretCS);
    235235                        break;
    236                     case PATM_IRETEIP:
     236                    case PATM_ASMFIX_IRETEIP:
    237237                        dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uIretEIP);
    238238                        break;
     
    240240
    241241
    242                     case PATM_FIXUP:
     242                    case PATM_ASMFIX_FIXUP:
    243243                        /* Offset in aRelocs[i].uInfo is from the base of the function. */
    244244                        dest = (RTGCUINTPTR32)pVM->patm.s.pPatchMemGC + pAsmRecord->aRelocs[i].uInfo
     
    247247
    248248#ifdef VBOX_WITH_STATISTICS
    249                     case PATM_PERPATCHCALLS:
     249                    case PATM_ASMFIX_PERPATCHCALLS:
    250250                        dest = patmPatchQueryStatAddress(pVM, pPatch);
    251251                        break;
     
    255255                     * part to store the original return addresses.
    256256                     */
    257                     case PATM_STACKBASE:
     257                    case PATM_ASMFIX_STACKBASE:
    258258                        dest = pVM->patm.s.pGCStackGC;
    259259                        break;
    260260
    261                     case PATM_STACKBASE_GUEST:
     261                    case PATM_ASMFIX_STACKBASE_GUEST:
    262262                        dest = pVM->patm.s.pGCStackGC + PATM_STACK_SIZE;
    263263                        break;
    264264
    265                     case PATM_RETURNADDR:   /* absolute guest address; no fixup required */
    266                         Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_NO_FIXUP);
     265                    case PATM_ASMFIX_RETURNADDR:   /* absolute guest address; no fixup required */
     266                        Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ASMFIX_NO_FIXUP);
    267267                        dest = pCallInfo->pReturnGC;
    268268                        break;
    269269
    270                     case PATM_PATCHNEXTBLOCK:  /* relative address of instruction following this block */
    271                         Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_NO_FIXUP);
     270                    case PATM_ASMFIX_PATCHNEXTBLOCK:  /* relative address of instruction following this block */
     271                        Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ASMFIX_NO_FIXUP);
    272272
    273273                        /** @note hardcoded assumption that we must return to the instruction following this block */
     
    275275                        break;
    276276
    277                     case PATM_CALLTARGET:   /* relative to patch address; no fixup required */
    278                         Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_NO_FIXUP);
     277                    case PATM_ASMFIX_CALLTARGET:   /* relative to patch address; no fixup required */
     278                        Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ASMFIX_NO_FIXUP);
    279279
    280280                        /* Address must be filled in later. (see patmr3SetBranchTargets)  */
     
    283283                        break;
    284284
    285                     case PATM_PATCHBASE:    /* Patch GC base address */
     285                    case PATM_ASMFIX_PATCHBASE:    /* Patch GC base address */
    286286                        dest = pVM->patm.s.pPatchMemGC;
    287287                        break;
    288288
    289                     case PATM_NEXTINSTRADDR:
     289                    case PATM_ASMFIX_NEXTINSTRADDR:
    290290                        Assert(pCallInfo);
    291291                        /* pNextInstrGC can be 0 if several instructions, that inhibit irqs, follow each other */
     
    293293                        break;
    294294
    295                     case PATM_CURINSTRADDR:
     295                    case PATM_ASMFIX_CURINSTRADDR:
    296296                        Assert(pCallInfo);
    297297                        dest = pCallInfo->pCurInstrGC;
     
    299299
    300300                    /* Relative address of global patm lookup and call function. */
    301                     case PATM_LOOKUP_AND_CALL_FUNCTION:
     301                    case PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION:
    302302                    {
    303303                        RTRCPTR pInstrAfterCall = pVM->patm.s.pPatchMemGC
     
    311311                    }
    312312
    313                     case PATM_RETURN_FUNCTION:
     313                    case PATM_ASMFIX_RETURN_FUNCTION:
    314314                    {
    315315                        RTRCPTR pInstrAfterCall = pVM->patm.s.pPatchMemGC
     
    323323                    }
    324324
    325                     case PATM_IRET_FUNCTION:
     325                    case PATM_ASMFIX_IRET_FUNCTION:
    326326                    {
    327327                        RTRCPTR pInstrAfterCall = pVM->patm.s.pPatchMemGC
     
    335335                    }
    336336
    337                     case PATM_LOOKUP_AND_JUMP_FUNCTION:
     337                    case PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION:
    338338                    {
    339339                        RTRCPTR pInstrAfterCall = pVM->patm.s.pPatchMemGC
     
    347347                    }
    348348
    349                     case PATM_CPUID_STD_MAX: /* saved state only */
     349                    case PATM_ASMFIX_CPUID_STD_MAX: /* saved state only */
    350350                        dest = CPUMR3GetGuestCpuIdPatmStdMax(pVM);
    351351                        break;
    352                     case PATM_CPUID_EXT_MAX: /* saved state only */
     352                    case PATM_ASMFIX_CPUID_EXT_MAX: /* saved state only */
    353353                        dest = CPUMR3GetGuestCpuIdPatmExtMax(pVM);
    354354                        break;
    355                     case PATM_CPUID_CENTAUR_MAX: /* saved state only */
     355                    case PATM_ASMFIX_CPUID_CENTAUR_MAX: /* saved state only */
    356356                        dest = CPUMR3GetGuestCpuIdPatmCentaurMax(pVM);
    357357                        break;
     
    361361                     * Note! Earlier saved state versions had different hacks for detecting some of these.
    362362                     */
    363                     case PATM_VM_FORCEDACTIONS:
     363                    case PATM_ASMFIX_VM_FORCEDACTIONS:
    364364                        dest = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions);
    365365                        break;
    366366
    367                     case PATM_CPUID_DEF_PTR: /* saved state only */
     367                    case PATM_ASMFIX_CPUID_DEF_PTR: /* saved state only */
    368368                        dest = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM);
    369369                        break;
    370                     case PATM_CPUID_STD_PTR: /* saved state only */
     370                    case PATM_ASMFIX_CPUID_STD_PTR: /* saved state only */
    371371                        dest = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
    372372                        break;
    373                     case PATM_CPUID_EXT_PTR: /* saved state only */
     373                    case PATM_ASMFIX_CPUID_EXT_PTR: /* saved state only */
    374374                        dest = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM);
    375375                        break;
    376                     case PATM_CPUID_CENTAUR_PTR: /* saved state only */
     376                    case PATM_ASMFIX_CPUID_CENTAUR_PTR: /* saved state only */
    377377                        dest = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
    378378                        break;
     
    412412                *(PRTRCPTR)&pPB[j] = dest;
    413413
    414                 if (pAsmRecord->aRelocs[i].uType < PATM_NO_FIXUP)
     414                if (pAsmRecord->aRelocs[i].uType < PATM_ASMFIX_NO_FIXUP)
    415415                {
    416416                    patmPatchAddReloc32(pVM, pPatch, &pPB[j], uRelocType,
     
    797797    PATCHGEN_EPILOG(pPatch, size);
    798798
    799     /* Need to set PATM_INTERRUPTFLAG after the patched ret returns here. */
     799    /* Need to set PATM_ASMFIX_INTERRUPTFLAG after the patched ret returns here. */
    800800    rc = patmPatchGenSetPIF(pVM, pPatch, pCurInstrGC);
    801801    if (rc == VERR_NO_MEMORY)
  • trunk/src/VBox/VMM/VMMR3/PATMSSM.cpp

    r54763 r54764  
    11111111    {
    11121112        Assert(   pRec->uType != PATM_SAVED_STATE_VERSION_NO_RAW_MEM
    1113                || (pRec->pSource == pRec->pDest && PATM_IS_FIXUP_TYPE(pRec->pSource)) );
     1113               || (pRec->pSource == pRec->pDest && PATM_IS_ASMFIX(pRec->pSource)) );
    11141114
    11151115        /* bird: What is this for exactly?  Only the MMIO fixups used to have pSource set. */
     
    12661266            LogFlow(("Changing fLocalForcedActions fixup from %RRv to %RRv\n", uFixup, pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions)));
    12671267            *pFixup = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions);
    1268             pRec->pSource = pRec->pDest = PATM_VM_FORCEDACTIONS;
     1268            pRec->pSource = pRec->pDest = PATM_ASMFIX_VM_FORCEDACTIONS;
    12691269            pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    12701270        }
     
    12791279            case 0:
    12801280                *pFixup = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM);
    1281                 pRec->pSource = pRec->pDest = PATM_CPUID_DEF_PTR;
     1281                pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_DEF_PTR;
    12821282                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    12831283                break;
    12841284            case 1:
    12851285                *pFixup = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
    1286                 pRec->pSource = pRec->pDest = PATM_CPUID_STD_PTR;
     1286                pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_STD_PTR;
    12871287                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    12881288                break;
    12891289            case 2:
    12901290                *pFixup = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM);
    1291                 pRec->pSource = pRec->pDest = PATM_CPUID_EXT_PTR;
     1291                pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_EXT_PTR;
    12921292                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    12931293                break;
    12941294            case 3:
    12951295                *pFixup = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
    1296                 pRec->pSource = pRec->pDest = PATM_CPUID_CENTAUR_PTR;
     1296                pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_CENTAUR_PTR;
    12971297                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    12981298                break;
     
    13131313            case PATM_FIXUP_CPU_FF_ACTION:
    13141314                *pFixup = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions);
    1315                 pRec->pSource = pRec->pDest = PATM_VM_FORCEDACTIONS;
     1315                pRec->pSource = pRec->pDest = PATM_ASMFIX_VM_FORCEDACTIONS;
    13161316                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    13171317                LogFlow(("Changing cpu ff action fixup from %x to %x\n", uFixup, *pFixup));
     
    13191319            case PATM_FIXUP_CPUID_DEFAULT:
    13201320                *pFixup = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM);
    1321                 pRec->pSource = pRec->pDest = PATM_CPUID_DEF_PTR;
     1321                pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_DEF_PTR;
    13221322                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    13231323                LogFlow(("Changing cpuid def fixup from %x to %x\n", uFixup, *pFixup));
     
    13251325            case PATM_FIXUP_CPUID_STANDARD:
    13261326                *pFixup = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
    1327                 pRec->pSource = pRec->pDest = PATM_CPUID_STD_PTR;
     1327                pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_STD_PTR;
    13281328                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    13291329                LogFlow(("Changing cpuid std fixup from %x to %x\n", uFixup, *pFixup));
     
    13311331            case PATM_FIXUP_CPUID_EXTENDED:
    13321332                *pFixup = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM);
    1333                 pRec->pSource = pRec->pDest = PATM_CPUID_EXT_PTR;
     1333                pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_EXT_PTR;
    13341334                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    13351335                LogFlow(("Changing cpuid ext fixup from %x to %x\n", uFixup, *pFixup));
     
    13371337            case PATM_FIXUP_CPUID_CENTAUR:
    13381338                *pFixup = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
    1339                 pRec->pSource = pRec->pDest = PATM_CPUID_CENTAUR_PTR;
     1339                pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_CENTAUR_PTR;
    13401340                pRec->uType   = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    13411341                LogFlow(("Changing cpuid centaur fixup from %x to %x\n", uFixup, *pFixup));
     
    13531353                 && pRec->uType == FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL)
    13541354        {
    1355             Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_FIXUP_TYPE(pRec->pSource));
     1355            Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ASMFIX(pRec->pSource));
    13561356            switch (pRec->pSource)
    13571357            {
    1358                 case PATM_VM_FORCEDACTIONS:
     1358                case PATM_ASMFIX_VM_FORCEDACTIONS:
    13591359                    *pFixup = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions);
    13601360                    break;
    1361                 case PATM_CPUID_DEF_PTR:
     1361                case PATM_ASMFIX_CPUID_DEF_PTR:
    13621362                    *pFixup = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM);
    13631363                    break;
    1364                 case PATM_CPUID_STD_PTR: /* Saved again patches only. */
     1364                case PATM_ASMFIX_CPUID_STD_PTR: /* Saved again patches only. */
    13651365                    *pFixup = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
    13661366                    break;
    1367                 case PATM_CPUID_EXT_PTR: /* Saved again patches only. */
     1367                case PATM_ASMFIX_CPUID_EXT_PTR: /* Saved again patches only. */
    13681368                    *pFixup = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM);
    13691369                    break;
    1370                 case PATM_CPUID_CENTAUR_PTR: /* Saved again patches only. */
     1370                case PATM_ASMFIX_CPUID_CENTAUR_PTR: /* Saved again patches only. */
    13711371                    *pFixup = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
    13721372                    break;
     
    13841384        {
    13851385            AssertLogRelReturn(uVersion > PATM_SAVED_STATE_VERSION_NO_RAW_MEM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
    1386             Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_FIXUP_TYPE(pRec->pSource));
     1386            Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ASMFIX(pRec->pSource));
    13871387            switch (pRec->pSource)
    13881388            {
     
    14061406        {
    14071407            AssertLogRelReturn(uVersion > PATM_SAVED_STATE_VERSION_NO_RAW_MEM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
    1408             Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_FIXUP_TYPE(pRec->pSource));
     1408            Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ASMFIX(pRec->pSource));
    14091409            int     rc;
    14101410            RTRCPTR uRCPtrDest;
  • trunk/src/VBox/VMM/include/PATMA.h

    r54763 r54764  
    2222 * @remarks These fixups types are part of the saved state.
    2323 * @{ */
    24 #define PATM_VMFLAGS                            0xF1ABCD00
     24#define PATM_ASMFIX_VMFLAGS                     0xF1ABCD00
    2525#ifdef VBOX_WITH_STATISTICS
    26 # define PATM_ALLPATCHCALLS                     0xF1ABCD01
    27 # define PATM_PERPATCHCALLS                     0xF1ABCD02
     26# define PATM_ASMFIX_ALLPATCHCALLS              0xF1ABCD01
     27# define PATM_ASMFIX_PERPATCHCALLS              0xF1ABCD02
    2828#endif
    29 #define PATM_JUMPDELTA                          0xF1ABCD03
     29#define PATM_ASMFIX_JUMPDELTA                   0xF1ABCD03
    3030#ifdef VBOX_WITH_STATISTICS
    31 # define PATM_IRETEFLAGS                        0xF1ABCD04
    32 # define PATM_IRETCS                            0xF1ABCD05
    33 # define PATM_IRETEIP                           0xF1ABCD06
     31# define PATM_ASMFIX_IRETEFLAGS                 0xF1ABCD04
     32# define PATM_ASMFIX_IRETCS                     0xF1ABCD05
     33# define PATM_ASMFIX_IRETEIP                    0xF1ABCD06
    3434#endif
    35 #define PATM_FIXUP                              0xF1ABCD07
    36 #define PATM_PENDINGACTION                      0xF1ABCD08
    37 #define PATM_CPUID_STD_PTR                      0xF1ABCD09  /**< Legacy, saved state only. */
    38 #define PATM_CPUID_EXT_PTR                      0xF1ABCD0a  /**< Legacy, saved state only. */
    39 #define PATM_CPUID_DEF_PTR                      0xF1ABCD0b  /**< Legacy, saved state only. */
    40 #define PATM_STACKBASE                          0xF1ABCD0c  /**< Stack to store our private patch return addresses */
    41 #define PATM_STACKBASE_GUEST                    0xF1ABCD0d  /**< Stack to store guest return addresses */
    42 #define PATM_STACKPTR                           0xF1ABCD0e
    43 #define PATM_PATCHBASE                          0xF1ABCD0f
    44 #define PATM_INTERRUPTFLAG                      0xF1ABCD10
    45 #define PATM_INHIBITIRQADDR                     0xF1ABCD11
    46 #define PATM_VM_FORCEDACTIONS                   0xF1ABCD12
    47 #define PATM_TEMP_EAX                           0xF1ABCD13  /**< Location for original EAX register */
    48 #define PATM_TEMP_ECX                           0xF1ABCD14  /**< Location for original ECX register */
    49 #define PATM_TEMP_EDI                           0xF1ABCD15  /**< Location for original EDI register */
    50 #define PATM_TEMP_EFLAGS                        0xF1ABCD16  /**< Location for original eflags */
    51 #define PATM_TEMP_RESTORE_FLAGS                 0xF1ABCD17  /**< Which registers to restore */
    52 #define PATM_CALL_PATCH_TARGET_ADDR             0xF1ABCD18
    53 #define PATM_CALL_RETURN_ADDR                   0xF1ABCD19
    54 #define PATM_CPUID_CENTAUR_PTR                  0xF1ABCD1a  /**< Legacy, saved state only. */
     35#define PATM_ASMFIX_FIXUP                       0xF1ABCD07
     36#define PATM_ASMFIX_PENDINGACTION               0xF1ABCD08
     37#define PATM_ASMFIX_CPUID_STD_PTR               0xF1ABCD09  /**< Legacy, saved state only. */
     38#define PATM_ASMFIX_CPUID_EXT_PTR               0xF1ABCD0a  /**< Legacy, saved state only. */
     39#define PATM_ASMFIX_CPUID_DEF_PTR               0xF1ABCD0b  /**< Legacy, saved state only. */
     40#define PATM_ASMFIX_STACKBASE                   0xF1ABCD0c  /**< Stack to store our private patch return addresses */
     41#define PATM_ASMFIX_STACKBASE_GUEST             0xF1ABCD0d  /**< Stack to store guest return addresses */
     42#define PATM_ASMFIX_STACKPTR                    0xF1ABCD0e
     43#define PATM_ASMFIX_PATCHBASE                   0xF1ABCD0f
     44#define PATM_ASMFIX_INTERRUPTFLAG               0xF1ABCD10
     45#define PATM_ASMFIX_INHIBITIRQADDR              0xF1ABCD11
     46#define PATM_ASMFIX_VM_FORCEDACTIONS            0xF1ABCD12
     47#define PATM_ASMFIX_TEMP_EAX                    0xF1ABCD13  /**< Location for original EAX register */
     48#define PATM_ASMFIX_TEMP_ECX                    0xF1ABCD14  /**< Location for original ECX register */
     49#define PATM_ASMFIX_TEMP_EDI                    0xF1ABCD15  /**< Location for original EDI register */
     50#define PATM_ASMFIX_TEMP_EFLAGS                 0xF1ABCD16  /**< Location for original eflags */
     51#define PATM_ASMFIX_TEMP_RESTORE_FLAGS          0xF1ABCD17  /**< Which registers to restore */
     52#define PATM_ASMFIX_CALL_PATCH_TARGET_ADDR      0xF1ABCD18
     53#define PATM_ASMFIX_CALL_RETURN_ADDR            0xF1ABCD19
     54#define PATM_ASMFIX_CPUID_CENTAUR_PTR           0xF1ABCD1a  /**< Legacy, saved state only. */
    5555#define PATM_ASMFIX_REUSE_LATER_0               0xF1ABCD1b
    5656#define PATM_ASMFIX_REUSE_LATER_1               0xF1ABCD1c
     
    6060
    6161/* Anything larger doesn't require a fixup */
    62 #define PATM_NO_FIXUP                           0xF1ABCE00
    63 #define PATM_CPUID_STD_MAX                      0xF1ABCE00
    64 #define PATM_CPUID_EXT_MAX                      0xF1ABCE01
    65 #define PATM_RETURNADDR                         0xF1ABCE02
    66 #define PATM_PATCHNEXTBLOCK                     0xF1ABCE03
    67 #define PATM_CALLTARGET                         0xF1ABCE04  /**< relative call target */
    68 #define PATM_NEXTINSTRADDR                      0xF1ABCE05  /**< absolute guest address of the next instruction */
    69 #define PATM_CURINSTRADDR                       0xF1ABCE06  /**< absolute guest address of the current instruction */
    70 #define PATM_LOOKUP_AND_CALL_FUNCTION           0xF1ABCE07  /**< Relative address of global PATM lookup and call function. */
    71 #define PATM_RETURN_FUNCTION                    0xF1ABCE08  /**< Relative address of global PATM return function. */
    72 #define PATM_LOOKUP_AND_JUMP_FUNCTION           0xF1ABCE09  /**< Relative address of global PATM lookup and jump function. */
    73 #define PATM_IRET_FUNCTION                      0xF1ABCE0A  /**< Relative address of global PATM iret function. */
    74 #define PATM_CPUID_CENTAUR_MAX                  0xF1ABCE0B
     62#define PATM_ASMFIX_NO_FIXUP                    0xF1ABCE00
     63#define PATM_ASMFIX_CPUID_STD_MAX               0xF1ABCE00
     64#define PATM_ASMFIX_CPUID_EXT_MAX               0xF1ABCE01
     65#define PATM_ASMFIX_RETURNADDR                  0xF1ABCE02
     66#define PATM_ASMFIX_PATCHNEXTBLOCK              0xF1ABCE03
     67#define PATM_ASMFIX_CALLTARGET                  0xF1ABCE04  /**< relative call target */
     68#define PATM_ASMFIX_NEXTINSTRADDR               0xF1ABCE05  /**< absolute guest address of the next instruction */
     69#define PATM_ASMFIX_CURINSTRADDR                0xF1ABCE06  /**< absolute guest address of the current instruction */
     70#define PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION    0xF1ABCE07  /**< Relative address of global PATM lookup and call function. */
     71#define PATM_ASMFIX_RETURN_FUNCTION             0xF1ABCE08  /**< Relative address of global PATM return function. */
     72#define PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION    0xF1ABCE09  /**< Relative address of global PATM lookup and jump function. */
     73#define PATM_ASMFIX_IRET_FUNCTION               0xF1ABCE0A  /**< Relative address of global PATM iret function. */
     74#define PATM_ASMFIX_CPUID_CENTAUR_MAX           0xF1ABCE0B
    7575
    7676/** Identifies an patch fixup type value (with reasonable accuracy). */
    77 #define PATM_IS_FIXUP_TYPE(a_uValue) \
     77#define PATM_IS_ASMFIX(a_uValue) \
    7878    ( ((a_uValue) & UINT32_C(0xfffffC00)) == UINT32_C(0xF1ABCC00) && ((a_uValue) & UINT32_C(0xff)) < UINT32_C(0x30) )
    7979/** @} */
     
    113113#define PATM_ACTION_MAGIC                       0xABCD4321
    114114
    115 /** @name PATM_TEMP_RESTORE_FLAGS
     115/** @name PATM_ASMFIX_TEMP_RESTORE_FLAGS
    116116 * @{ */
    117117#define PATM_RESTORE_EAX                        RT_BIT(0)
  • trunk/src/VBox/VMM/include/PATMInternal.h

    r54763 r54764  
    7070#define PATMFL_CALLABLE_AS_FUNCTION         RT_BIT_64(25) /** cli and pushf blocks can be used as callable functions. */
    7171#define PATMFL_GLOBAL_FUNCTIONS             RT_BIT_64(26) /** fake patch for global patm functions. */
    72 #define PATMFL_TRAMPOLINE                   RT_BIT_64(27) /** trampoline patch that clears PATM_INTERRUPTFLAG and jumps to patch destination */
     72#define PATMFL_TRAMPOLINE                   RT_BIT_64(27) /** trampoline patch that clears PATM_ASMFIX_INTERRUPTFLAG and jumps to patch destination */
    7373#define PATMFL_GENERATE_SETPIF              RT_BIT_64(28) /** generate set PIF for the next instruction */
    7474#define PATMFL_INSTR_HINT                   RT_BIT_64(29) /** Generate patch, but don't activate it. */
     
    112112 *
    113113 * The source and desination addresses both set to the patch fixup type (see
    114  * PATM_IS_FIXUP_TYPE and friends in PATMA.h).  This is recent addition (CPUID
     114 * PATM_IS_ASMFIX and friends in PATMA.h).  This is recent addition (CPUID
    115115 * subleaf code), so when loading older saved states this is usally represented
    116116 * as FIXUP_ABSOLUTE. */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette