VirtualBox

Changeset 54689 in vbox


Ignore:
Timestamp:
Mar 9, 2015 7:31:39 AM (10 years ago)
Author:
vboxsync
Message:

PATM: Doing some more cleanups while trying to understand stuff again.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/PATMA.asm

    r54688 r54689  
    7474    at PATCHASMRECORD.cbFunction,     DD          NAME(%1 %+ _EndProc) - NAME(%1)
    7575    at PATCHASMRECORD.cRelocs,        DD          %3
     76iend                                                         
     77%endmacro
     78
     79;;
     80; Simple PATCHASMRECORD initializer
     81; @param %1     The patch function name.
     82; @param %2     Jump lable (or nothing).
     83; @param %3     Relative jump label (or nothing).
     84; @param %4     Size override label (or nothing).
     85; @param %5     The number of fixups.
     86;
     87%macro PATCHASMRECORD_INIT_EX 5
     88istruc PATCHASMRECORD
     89    at PATCHASMRECORD.pbFunction,     RTCCPTR_DEF NAME(%1)
     90%ifid %2
     91    at PATCHASMRECORD.offJump,        DD          %2 - NAME(%1)
     92%else
     93    at PATCHASMRECORD.offJump,        DD          0
     94%endif
     95%ifid %3
     96    at PATCHASMRECORD.offRelJump,     DD          %3 - NAME(%1)
     97%else
     98    at PATCHASMRECORD.offRelJump,     DD          0
     99%endif
     100%ifid %4
     101    at PATCHASMRECORD.offSizeOverride,DD          %4 - NAME(%1)
     102%else
     103    at PATCHASMRECORD.offSizeOverride,DD          0
     104%endif
     105    at PATCHASMRECORD.cbFunction,     DD          NAME(%1 %+ _EndProc) - NAME(%1)
     106    at PATCHASMRECORD.cRelocs,        DD          %5
    76107iend                                                         
    77108%endmacro
     
    318349BEGIN_PATCH_CODE_SECTION
    319350BEGINPROC   PATMStiReplacement
    320 PATMStiStart:
    321351    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    322352    mov     dword [ss:PATM_INHIBITIRQADDR], PATM_NEXTINSTRADDR
     
    335365    popf
    336366    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    337 PATMStiEnd:
    338367ENDPROC     PATMStiReplacement
    339368
     
    341370BEGIN_PATCH_RODATA_SECTION
    342371GLOBALNAME g_patmStiRecord
    343     RTCCPTR_DEF PATMStiStart
    344     DD      0
    345     DD      0
    346     DD      0
    347     DD      PATMStiEnd - PATMStiStart
    348372%ifdef PATM_LOG_PATCHINSTR
    349     DD      6
     373    PATCHASMRECORD_INIT PATMStiReplacement, 6
    350374%else
    351     DD      5
    352 %endif
    353     DD      PATM_INTERRUPTFLAG
    354     DD      0
    355     DD      PATM_INHIBITIRQADDR
    356     DD      0
    357     DD      PATM_NEXTINSTRADDR
    358     DD      0
     375    PATCHASMRECORD_INIT PATMStiReplacement, 5
     376%endif
     377    DD      PATM_INTERRUPTFLAG,  0
     378    DD      PATM_INHIBITIRQADDR, 0
     379    DD      PATM_NEXTINSTRADDR,  0
    359380%ifdef PATM_LOG_PATCHINSTR
    360     DD      PATM_PENDINGACTION
    361     DD      0
    362 %endif
    363     DD      PATM_VMFLAGS
    364     DD      0
    365     DD      PATM_INTERRUPTFLAG
    366     DD      0
    367     DD      0ffffffffh
     381    DD      PATM_PENDINGACTION,  0
     382%endif
     383    DD      PATM_VMFLAGS,        0
     384    DD      PATM_INTERRUPTFLAG,  0
     385    DD      0ffffffffh, 0ffffffffh
    368386
    369387
     
    383401BEGIN_PATCH_CODE_SECTION
    384402BEGINPROC   PATMTrapEntry
    385 PATMTrapEntryStart:
    386403    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    387404    pushf
     
    425442PATMTrapEntryJump:
    426443    DD      PATM_JUMPDELTA
    427 PATMTrapEntryEnd:
    428444ENDPROC     PATMTrapEntry
    429445
     
    431447BEGIN_PATCH_RODATA_SECTION
    432448GLOBALNAME g_patmTrapEntryRecord
    433     RTCCPTR_DEF PATMTrapEntryStart
    434     DD      PATMTrapEntryJump - PATMTrapEntryStart
    435     DD      0
    436     DD      0
    437     DD      PATMTrapEntryEnd - PATMTrapEntryStart
    438449%ifdef PATM_LOG_PATCHIRET
    439     DD      4
     450    PATCHASMRECORD_INIT_JUMP PATMTrapEntry, PATMTrapEntryJump, 4
    440451%else
    441     DD      3
    442 %endif
    443     DD      PATM_INTERRUPTFLAG
    444     DD      0
     452    PATCHASMRECORD_INIT_JUMP PATMTrapEntry, PATMTrapEntryJump, 3
     453%endif
     454    DD      PATM_INTERRUPTFLAG, 0
    445455%ifdef PATM_LOG_PATCHIRET
    446     DD      PATM_PENDINGACTION
    447     DD      0
    448 %endif
    449     DD      PATM_VMFLAGS
    450     DD      0
    451     DD      PATM_INTERRUPTFLAG
    452     DD      0
    453     DD      0ffffffffh
     456    DD      PATM_PENDINGACTION, 0
     457%endif
     458    DD      PATM_VMFLAGS,       0
     459    DD      PATM_INTERRUPTFLAG, 0
     460    DD      0ffffffffh, 0ffffffffh
    454461
    455462
     
    512519PATMTrapErrorCodeEntryJump:
    513520    DD      PATM_JUMPDELTA
    514 PATMTrapErrorCodeEntryEnd:
    515521ENDPROC     PATMTrapEntryErrorCode
    516522
     
    518524BEGIN_PATCH_RODATA_SECTION
    519525GLOBALNAME g_patmTrapEntryRecordErrorCode
    520     RTCCPTR_DEF PATMTrapErrorCodeEntryStart
    521     DD      PATMTrapErrorCodeEntryJump - PATMTrapErrorCodeEntryStart
    522     DD      0
    523     DD      0
    524     DD      PATMTrapErrorCodeEntryEnd - PATMTrapErrorCodeEntryStart
    525526%ifdef PATM_LOG_PATCHIRET
    526     DD      4
     527    PATCHASMRECORD_INIT_JUMP PATMTrapEntryErrorCode, PATMTrapErrorCodeEntryJump, 4
    527528%else
    528     DD      3
    529 %endif
    530     DD      PATM_INTERRUPTFLAG
    531     DD      0
     529    PATCHASMRECORD_INIT_JUMP PATMTrapEntryErrorCode, PATMTrapErrorCodeEntryJump, 3
     530%endif
     531    DD      PATM_INTERRUPTFLAG, 0
    532532%ifdef PATM_LOG_PATCHIRET
    533     DD      PATM_PENDINGACTION
    534     DD      0
    535 %endif
    536     DD      PATM_VMFLAGS
    537     DD      0
    538     DD      PATM_INTERRUPTFLAG
    539     DD      0
    540     DD      0ffffffffh
     533    DD      PATM_PENDINGACTION, 0
     534%endif
     535    DD      PATM_VMFLAGS,       0
     536    DD      PATM_INTERRUPTFLAG, 0
     537    DD      0ffffffffh, 0ffffffffh
    541538
    542539
     
    556553BEGIN_PATCH_CODE_SECTION
    557554BEGINPROC   PATMIntEntry
    558 PATMIntEntryStart:
    559555    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    560556    pushf
     
    595591    popf
    596592    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    597 PATMIntEntryEnd:
    598593ENDPROC     PATMIntEntry
    599594
     
    601596BEGIN_PATCH_RODATA_SECTION
    602597GLOBALNAME g_patmIntEntryRecord
    603     RTCCPTR_DEF PATMIntEntryStart
    604     DD      0
    605     DD      0
    606     DD      0
    607     DD      PATMIntEntryEnd - PATMIntEntryStart
    608598%ifdef PATM_LOG_PATCHIRET
    609     DD      4
     599    PATCHASMRECORD_INIT PATMIntEntry, 4
    610600%else
    611     DD      3
    612 %endif
    613     DD      PATM_INTERRUPTFLAG
    614     DD      0
     601    PATCHASMRECORD_INIT PATMIntEntry, 3
     602%endif
     603    DD      PATM_INTERRUPTFLAG, 0
    615604%ifdef PATM_LOG_PATCHIRET
    616     DD      PATM_PENDINGACTION
    617     DD      0
    618 %endif
    619     DD      PATM_VMFLAGS
    620     DD      0
    621     DD      PATM_INTERRUPTFLAG
    622     DD      0
    623     DD      0ffffffffh
     605    DD      PATM_PENDINGACTION, 0
     606%endif
     607    DD      PATM_VMFLAGS,       0
     608    DD      PATM_INTERRUPTFLAG, 0
     609    DD      0ffffffffh, 0ffffffffh
    624610
    625611
     
    640626BEGIN_PATCH_CODE_SECTION
    641627BEGINPROC   PATMIntEntryErrorCode
    642 PATMIntEntryErrorCodeStart:
    643628    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    644629    pushf
     
    679664    popf
    680665    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    681 PATMIntEntryErrorCodeEnd:
    682666ENDPROC     PATMIntEntryErrorCode
    683667
     
    685669BEGIN_PATCH_RODATA_SECTION
    686670GLOBALNAME g_patmIntEntryRecordErrorCode
    687     RTCCPTR_DEF PATMIntEntryErrorCodeStart
    688     DD      0
    689     DD      0
    690     DD      0
    691     DD      PATMIntEntryErrorCodeEnd - PATMIntEntryErrorCodeStart
    692671%ifdef PATM_LOG_PATCHIRET
    693     DD      4
     672    PATCHASMRECORD_INIT PATMIntEntryErrorCode, 4
    694673%else
    695     DD      3
    696 %endif
    697     DD      PATM_INTERRUPTFLAG
    698     DD      0
     674    PATCHASMRECORD_INIT PATMIntEntryErrorCode, 3
     675%endif
     676    DD      PATM_INTERRUPTFLAG, 0
    699677%ifdef PATM_LOG_PATCHIRET
    700     DD      PATM_PENDINGACTION
    701     DD      0
    702 %endif
    703     DD      PATM_VMFLAGS
    704     DD      0
    705     DD      PATM_INTERRUPTFLAG
    706     DD      0
    707     DD      0ffffffffh
     678    DD      PATM_PENDINGACTION, 0
     679%endif
     680    DD      PATM_VMFLAGS,       0
     681    DD      PATM_INTERRUPTFLAG, 0
     682    DD      0ffffffffh, 0ffffffffh
    708683
    709684
     
    713688BEGIN_PATCH_CODE_SECTION
    714689BEGINPROC   PATMPopf32Replacement
    715 PATMPopf32Start:
    716690    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    717691%ifdef PATM_LOG_PATCHINSTR
     
    766740PATMPopf32Jump:
    767741    DD      PATM_JUMPDELTA
    768 PATMPopf32End:
    769742ENDPROC     PATMPopf32Replacement
    770743
     
    772745BEGIN_PATCH_RODATA_SECTION
    773746GLOBALNAME g_patmPopf32Record
    774     RTCCPTR_DEF PATMPopf32Start
    775     DD      PATMPopf32Jump - PATMPopf32Start
    776     DD      0
    777     DD      0
    778     DD      PATMPopf32End - PATMPopf32Start
    779747%ifdef PATM_LOG_PATCHINSTR
    780     DD      12
     748    PATCHASMRECORD_INIT_JUMP PATMPopf32Replacement, PATMPopf32Jump, 12
    781749%else
    782     DD      11
    783 %endif
    784     DD      PATM_INTERRUPTFLAG
    785     DD      0
     750    PATCHASMRECORD_INIT_JUMP PATMPopf32Replacement, PATMPopf32Jump, 11
     751%endif
     752    DD      PATM_INTERRUPTFLAG,      0
    786753%ifdef PATM_LOG_PATCHINSTR
    787     DD      PATM_PENDINGACTION
    788     DD      0
    789 %endif
    790     DD      PATM_INTERRUPTFLAG
    791     DD      0
    792     DD      PATM_VMFLAGS
    793     DD      0
    794     DD      PATM_VM_FORCEDACTIONS
    795     DD      0
    796     DD      PATM_TEMP_EAX
    797     DD      0
    798     DD      PATM_TEMP_ECX
    799     DD      0
    800     DD      PATM_TEMP_EDI
    801     DD      0
    802     DD      PATM_TEMP_RESTORE_FLAGS
    803     DD      0
    804     DD      PATM_PENDINGACTION
    805     DD      0
    806     DD      PATM_NEXTINSTRADDR
    807     DD      0
    808     DD      PATM_INTERRUPTFLAG
    809     DD      0
    810     DD      0ffffffffh
     754    DD      PATM_PENDINGACTION,      0
     755%endif
     756    DD      PATM_INTERRUPTFLAG,      0
     757    DD      PATM_VMFLAGS,            0
     758    DD      PATM_VM_FORCEDACTIONS,   0
     759    DD      PATM_TEMP_EAX,           0
     760    DD      PATM_TEMP_ECX,           0
     761    DD      PATM_TEMP_EDI,           0
     762    DD      PATM_TEMP_RESTORE_FLAGS, 0
     763    DD      PATM_PENDINGACTION,      0
     764    DD      PATM_NEXTINSTRADDR,      0
     765    DD      PATM_INTERRUPTFLAG,      0
     766    DD      0ffffffffh, 0ffffffffh
    811767
    812768
     
    816772BEGIN_PATCH_CODE_SECTION
    817773BEGINPROC   PATMPopf32Replacement_NoExit
    818 PATMPopf32_NoExitStart:
    819774    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    820775%ifdef PATM_LOG_PATCHINSTR
     
    862817    popfd
    863818    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    864 PATMPopf32_NoExitEnd:
    865819ENDPROC     PATMPopf32Replacement_NoExit
    866820
     
    868822BEGIN_PATCH_RODATA_SECTION
    869823GLOBALNAME g_patmPopf32Record_NoExit
    870     RTCCPTR_DEF PATMPopf32_NoExitStart
    871     DD      0
    872     DD      0
    873     DD      0
    874     DD      PATMPopf32_NoExitEnd - PATMPopf32_NoExitStart
    875824%ifdef PATM_LOG_PATCHINSTR
    876     DD      14
     825    PATCHASMRECORD_INIT PATMPopf32Replacement_NoExit, 14
    877826%else
    878     DD      13
    879 %endif
    880     DD      PATM_INTERRUPTFLAG
    881     DD      0
     827    PATCHASMRECORD_INIT PATMPopf32Replacement_NoExit, 13
     828%endif
     829    DD      PATM_INTERRUPTFLAG,      0
    882830%ifdef PATM_LOG_PATCHINSTR
    883     DD      PATM_PENDINGACTION
    884     DD      0
    885 %endif
    886     DD      PATM_VM_FORCEDACTIONS
    887     DD      0
    888     DD      PATM_TEMP_EAX
    889     DD      0
    890     DD      PATM_TEMP_ECX
    891     DD      0
    892     DD      PATM_TEMP_EDI
    893     DD      0
    894     DD      PATM_TEMP_RESTORE_FLAGS
    895     DD      0
    896     DD      PATM_PENDINGACTION
    897     DD      0
    898     DD      PATM_NEXTINSTRADDR
    899     DD      0
    900     DD      PATM_VMFLAGS
    901     DD      0
    902     DD      PATM_VMFLAGS
    903     DD      0
    904     DD      PATM_VMFLAGS
    905     DD      0
    906     DD      PATM_VMFLAGS
    907     DD      0
    908     DD      PATM_INTERRUPTFLAG
    909     DD      0
    910     DD      0ffffffffh
     831    DD      PATM_PENDINGACTION,      0
     832%endif
     833    DD      PATM_VM_FORCEDACTIONS,   0
     834    DD      PATM_TEMP_EAX,           0
     835    DD      PATM_TEMP_ECX,           0
     836    DD      PATM_TEMP_EDI,           0
     837    DD      PATM_TEMP_RESTORE_FLAGS, 0
     838    DD      PATM_PENDINGACTION,      0
     839    DD      PATM_NEXTINSTRADDR,      0
     840    DD      PATM_VMFLAGS,            0
     841    DD      PATM_VMFLAGS,            0
     842    DD      PATM_VMFLAGS,            0
     843    DD      PATM_VMFLAGS,            0
     844    DD      PATM_INTERRUPTFLAG,      0
     845    DD      0ffffffffh, 0ffffffffh
    911846
    912847
     
    916851BEGIN_PATCH_CODE_SECTION
    917852BEGINPROC   PATMPopf16Replacement
    918 PATMPopf16Start:
    919853    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    920854    test    word [esp], X86_EFL_IF
     
    945879PATMPopf16Jump:
    946880    DD      PATM_JUMPDELTA
    947 PATMPopf16End:
    948881ENDPROC     PATMPopf16Replacement
    949882
     
    951884BEGIN_PATCH_RODATA_SECTION
    952885GLOBALNAME g_patmPopf16Record
    953     RTCCPTR_DEF PATMPopf16Start
    954     DD      PATMPopf16Jump - PATMPopf16Start
    955     DD      0
    956     DD      0
    957     DD      PATMPopf16End - PATMPopf16Start
    958     DD      9
    959     DD      PATM_INTERRUPTFLAG
    960     DD      0
    961     DD      PATM_INTERRUPTFLAG
    962     DD      0
    963     DD      PATM_VM_FORCEDACTIONS
    964     DD      0
    965     DD      PATM_INTERRUPTFLAG
    966     DD      0
    967     DD      PATM_VMFLAGS
    968     DD      0
    969     DD      PATM_VMFLAGS
    970     DD      0
    971     DD      PATM_VMFLAGS
    972     DD      0
    973     DD      PATM_VMFLAGS
    974     DD      0
    975     DD      PATM_INTERRUPTFLAG
    976     DD      0
    977     DD      0ffffffffh
     886    PATCHASMRECORD_INIT_JUMP PATMPopf16Replacement, PATMPopf16Jump, 9
     887    DD      PATM_INTERRUPTFLAG,    0
     888    DD      PATM_INTERRUPTFLAG,    0
     889    DD      PATM_VM_FORCEDACTIONS, 0
     890    DD      PATM_INTERRUPTFLAG,    0
     891    DD      PATM_VMFLAGS,          0
     892    DD      PATM_VMFLAGS,          0
     893    DD      PATM_VMFLAGS,          0
     894    DD      PATM_VMFLAGS,          0
     895    DD      PATM_INTERRUPTFLAG,    0
     896    DD      0ffffffffh, 0ffffffffh
    978897
    979898
     
    984903BEGIN_PATCH_CODE_SECTION
    985904BEGINPROC   PATMPopf16Replacement_NoExit
    986 PATMPopf16Start_NoExit:
    987905    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    988906    test    word [esp], X86_EFL_IF
     
    1009927    popf    ;after the and and or operations!! (flags must be preserved)
    1010928    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    1011 PATMPopf16End_NoExit:
    1012929ENDPROC     PATMPopf16Replacement_NoExit
    1013930
     
    1015932BEGIN_PATCH_RODATA_SECTION
    1016933GLOBALNAME g_patmPopf16Record_NoExit
    1017     RTCCPTR_DEF PATMPopf16Start_NoExit
    1018     DD      0
    1019     DD      0
    1020     DD      0
    1021     DD      PATMPopf16End_NoExit - PATMPopf16Start_NoExit
    1022     DD      9
    1023     DD      PATM_INTERRUPTFLAG
    1024     DD      0
    1025     DD      PATM_INTERRUPTFLAG
    1026     DD      0
    1027     DD      PATM_VM_FORCEDACTIONS
    1028     DD      0
    1029     DD      PATM_INTERRUPTFLAG
    1030     DD      0
    1031     DD      PATM_VMFLAGS
    1032     DD      0
    1033     DD      PATM_VMFLAGS
    1034     DD      0
    1035     DD      PATM_VMFLAGS
    1036     DD      0
    1037     DD      PATM_VMFLAGS
    1038     DD      0
    1039     DD      PATM_INTERRUPTFLAG
    1040     DD      0
    1041     DD      0ffffffffh
     934    PATCHASMRECORD_INIT PATMPopf16Replacement_NoExit, 9
     935    DD      PATM_INTERRUPTFLAG,    0
     936    DD      PATM_INTERRUPTFLAG,    0
     937    DD      PATM_VM_FORCEDACTIONS, 0
     938    DD      PATM_INTERRUPTFLAG,    0
     939    DD      PATM_VMFLAGS,          0
     940    DD      PATM_VMFLAGS,          0
     941    DD      PATM_VMFLAGS,          0
     942    DD      PATM_VMFLAGS,          0
     943    DD      PATM_INTERRUPTFLAG,    0
     944    DD      0ffffffffh, 0ffffffffh
    1042945
    1043946
     
    1047950BEGIN_PATCH_CODE_SECTION
    1048951BEGINPROC   PATMPushf32Replacement
    1049 PATMPushf32Start:
    1050952    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    1051953    pushfd
     
    1070972    popfd
    1071973    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    1072 PATMPushf32End:
    1073974ENDPROC     PATMPushf32Replacement
    1074975
     
    1076977BEGIN_PATCH_RODATA_SECTION
    1077978GLOBALNAME g_patmPushf32Record
    1078     RTCCPTR_DEF PATMPushf32Start
    1079     DD      0
    1080     DD      0
    1081     DD      0
    1082     DD      PATMPushf32End - PATMPushf32Start
    1083979%ifdef PATM_LOG_PATCHINSTR
    1084     DD      4
     980    PATCHASMRECORD_INIT PATMPushf32Replacement, 4
    1085981%else
    1086     DD      3
    1087 %endif
    1088     DD      PATM_INTERRUPTFLAG
    1089     DD      0
     982    PATCHASMRECORD_INIT PATMPushf32Replacement, 3
     983%endif
     984    DD      PATM_INTERRUPTFLAG, 0
    1090985%ifdef PATM_LOG_PATCHINSTR
    1091     DD      PATM_PENDINGACTION
    1092     DD      0
    1093 %endif
    1094     DD      PATM_VMFLAGS
    1095     DD      0
    1096     DD      PATM_INTERRUPTFLAG
    1097     DD      0
    1098     DD      0ffffffffh
     986    DD      PATM_PENDINGACTION, 0
     987%endif
     988    DD      PATM_VMFLAGS,       0
     989    DD      PATM_INTERRUPTFLAG, 0
     990    DD      0ffffffffh, 0ffffffffh
    1099991
    1100992
     
    1104996BEGIN_PATCH_CODE_SECTION
    1105997BEGINPROC   PATMPushf16Replacement
    1106 PATMPushf16Start:
    1107998    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    1108999    DB      0x66    ; size override
     
    11211012    popf
    11221013    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    1123 PATMPushf16End:
    11241014ENDPROC     PATMPushf16Replacement
    11251015
     
    11271017BEGIN_PATCH_RODATA_SECTION
    11281018GLOBALNAME g_patmPushf16Record
    1129     RTCCPTR_DEF PATMPushf16Start
    1130     DD      0
    1131     DD      0
    1132     DD      0
    1133     DD      PATMPushf16End - PATMPushf16Start
    1134     DD      3
    1135     DD      PATM_INTERRUPTFLAG
    1136     DD      0
    1137     DD      PATM_VMFLAGS
    1138     DD      0
    1139     DD      PATM_INTERRUPTFLAG
    1140     DD      0
    1141     DD      0ffffffffh
     1019    PATCHASMRECORD_INIT PATMPushf16Replacement, 3
     1020    DD      PATM_INTERRUPTFLAG, 0
     1021    DD      PATM_VMFLAGS,       0
     1022    DD      PATM_INTERRUPTFLAG, 0
     1023    DD      0ffffffffh, 0ffffffffh
    11421024
    11431025
     
    11471029BEGIN_PATCH_CODE_SECTION
    11481030BEGINPROC   PATMPushCSReplacement
    1149 PATMPushCSStart:
    11501031    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    11511032    push    cs
     
    11651046PATMPushCSJump:
    11661047    DD      PATM_JUMPDELTA
    1167 PATMPushCSEnd:
    11681048ENDPROC     PATMPushCSReplacement
    11691049
     
    11711051BEGIN_PATCH_RODATA_SECTION
    11721052GLOBALNAME g_patmPushCSRecord
    1173     RTCCPTR_DEF PATMPushCSStart
    1174     DD      PATMPushCSJump - PATMPushCSStart
    1175     DD      0
    1176     DD      0
    1177     DD      PATMPushCSEnd - PATMPushCSStart
    1178     DD      2
    1179     DD      PATM_INTERRUPTFLAG
    1180     DD      0
    1181     DD      PATM_INTERRUPTFLAG
    1182     DD      0
    1183     DD      0ffffffffh
    1184 
    1185 
    1186 ;;****************************************************
    1187 ;; Abstract:
    1188 ;;
    1189 ;; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0
    1190 ;; then
    1191 ;;     if return to ring 0 (iretstack.new_cs & 3 == 0)
    1192 ;;     then
    1193 ;;          if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0
    1194 ;;          then
    1195 ;;              iretstack.new_cs |= 1
    1196 ;;          else
    1197 ;;              int 3
    1198 ;;     endif
    1199 ;;     uVMFlags &= ~X86_EFL_IF
    1200 ;;     iret
    1201 ;; else
    1202 ;;     int 3
    1203 ;;****************************************************
    1204 ;;
     1053    PATCHASMRECORD_INIT_JUMP PATMPushCSReplacement, PATMPushCSJump, 2
     1054    DD      PATM_INTERRUPTFLAG, 0
     1055    DD      PATM_INTERRUPTFLAG, 0
     1056    DD      0ffffffffh, 0ffffffffh
     1057
     1058
     1059;
     1060;
     1061;****************************************************
     1062; Abstract:
     1063;
     1064; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0
     1065; then
     1066;     if return to ring 0 (iretstack.new_cs & 3 == 0)
     1067;     then
     1068;          if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0
     1069;          then
     1070;              iretstack.new_cs |= 1
     1071;          else
     1072;              int 3
     1073;     endif
     1074;     uVMFlags &= ~X86_EFL_IF
     1075;     iret
     1076; else
     1077;     int 3
     1078;****************************************************
     1079;
    12051080; Stack:
    12061081;
     
    12171092BEGIN_PATCH_CODE_SECTION
    12181093BEGINPROC   PATMIretReplacement
    1219 PATMIretStart:
    12201094    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    12211095    pushfd
     
    13801254    TIMES PATCHJUMPTABLE_SIZE DB 0              ; lookup slots
    13811255
    1382 PATMIretEnd:
    13831256ENDPROC     PATMIretReplacement
    13841257
     
    13861259BEGIN_PATCH_RODATA_SECTION
    13871260GLOBALNAME g_patmIretRecord
    1388     RTCCPTR_DEF PATMIretStart
    1389     DD      0
    1390     DD      0
    1391     DD      0
    1392     DD      PATMIretEnd- PATMIretStart
    13931261%ifdef PATM_LOG_PATCHIRET
    1394     DD      26
     1262    PATCHASMRECORD_INIT PATMIretReplacement, 26
    13951263%else
    1396     DD      25
    1397 %endif
    1398     DD      PATM_INTERRUPTFLAG
    1399     DD      0
     1264    PATCHASMRECORD_INIT PATMIretReplacement, 25
     1265%endif
     1266    DD      PATM_INTERRUPTFLAG,      0
    14001267%ifdef PATM_LOG_PATCHIRET
    1401     DD      PATM_PENDINGACTION
    1402     DD      0
    1403 %endif
    1404     DD      PATM_VM_FORCEDACTIONS
    1405     DD      0
    1406     DD      PATM_TEMP_EAX
    1407     DD      0
    1408     DD      PATM_TEMP_ECX
    1409     DD      0
    1410     DD      PATM_TEMP_EDI
    1411     DD      0
    1412     DD      PATM_TEMP_RESTORE_FLAGS
    1413     DD      0
    1414     DD      PATM_PENDINGACTION
    1415     DD      0
    1416     DD      PATM_CURINSTRADDR
    1417     DD      0
    1418     DD      PATM_VMFLAGS
    1419     DD      0
    1420     DD      PATM_VMFLAGS
    1421     DD      0
    1422     DD      PATM_VMFLAGS
    1423     DD      0
    1424     DD      PATM_INHIBITIRQADDR
    1425     DD      0
    1426     DD      PATM_CURINSTRADDR
    1427     DD      0
    1428     DD      PATM_INTERRUPTFLAG
    1429     DD      0
    1430     DD      PATM_INTERRUPTFLAG
    1431     DD      0
    1432     DD      PATM_INTERRUPTFLAG
    1433     DD      0
    1434     DD      PATM_FIXUP
    1435     DD      PATMIretTable - PATMIretStart
    1436     DD      PATM_IRET_FUNCTION
    1437     DD      0
    1438     DD      PATM_VMFLAGS
    1439     DD      0
    1440     DD      PATM_VMFLAGS
    1441     DD      0
    1442     DD      PATM_VMFLAGS
    1443     DD      0
    1444     DD      PATM_TEMP_EAX
    1445     DD      0
    1446     DD      PATM_TEMP_ECX
    1447     DD      0
    1448     DD      PATM_TEMP_RESTORE_FLAGS
    1449     DD      0
    1450     DD      PATM_PENDINGACTION
    1451     DD      0
    1452     DD      0ffffffffh
    1453 
    1454 
    1455 ;;****************************************************
    1456 ;; Abstract:
    1457 ;;
    1458 ;; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0
    1459 ;; then
    1460 ;;     if return to ring 0 (iretstack.new_cs & 3 == 0)
    1461 ;;     then
    1462 ;;          if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0
    1463 ;;          then
    1464 ;;              iretstack.new_cs |= 1
    1465 ;;          else
    1466 ;;              int 3
    1467 ;;     endif
    1468 ;;     uVMFlags &= ~X86_EFL_IF
    1469 ;;     iret
    1470 ;; else
    1471 ;;     int 3
    1472 ;;****************************************************
    1473 ;;
     1268    DD      PATM_PENDINGACTION,      0
     1269%endif
     1270    DD      PATM_VM_FORCEDACTIONS,   0
     1271    DD      PATM_TEMP_EAX,           0
     1272    DD      PATM_TEMP_ECX,           0
     1273    DD      PATM_TEMP_EDI,           0
     1274    DD      PATM_TEMP_RESTORE_FLAGS, 0
     1275    DD      PATM_PENDINGACTION,      0
     1276    DD      PATM_CURINSTRADDR,       0
     1277    DD      PATM_VMFLAGS,            0
     1278    DD      PATM_VMFLAGS,            0
     1279    DD      PATM_VMFLAGS,            0
     1280    DD      PATM_INHIBITIRQADDR,     0
     1281    DD      PATM_CURINSTRADDR,       0
     1282    DD      PATM_INTERRUPTFLAG,      0
     1283    DD      PATM_INTERRUPTFLAG,      0
     1284    DD      PATM_INTERRUPTFLAG,      0
     1285    DD      PATM_FIXUP,              PATMIretTable - NAME(PATMIretReplacement)
     1286    DD      PATM_IRET_FUNCTION,      0
     1287    DD      PATM_VMFLAGS,            0
     1288    DD      PATM_VMFLAGS,            0
     1289    DD      PATM_VMFLAGS,            0
     1290    DD      PATM_TEMP_EAX,           0
     1291    DD      PATM_TEMP_ECX,           0
     1292    DD      PATM_TEMP_RESTORE_FLAGS, 0
     1293    DD      PATM_PENDINGACTION,      0
     1294    DD      0ffffffffh,              0ffffffffh
     1295
     1296
     1297;
     1298;
     1299;****************************************************
     1300; Abstract:
     1301;
     1302; if eflags.NT==0 && iretstack.eflags.VM==0 && iretstack.eflags.IOPL==0
     1303; then
     1304;     if return to ring 0 (iretstack.new_cs & 3 == 0)
     1305;     then
     1306;          if iretstack.new_eflags.IF == 1 && iretstack.new_eflags.IOPL == 0
     1307;          then
     1308;              iretstack.new_cs |= 1
     1309;          else
     1310;              int 3
     1311;     endif
     1312;     uVMFlags &= ~X86_EFL_IF
     1313;     iret
     1314; else
     1315;     int 3
     1316;****************************************************
     1317;
    14741318; Stack:
    14751319;
     
    14831327; esp + 4  - CS
    14841328; esp      - EIP
    1485 ;;
     1329;
    14861330BEGIN_PATCH_CODE_SECTION
    14871331BEGINPROC   PATMIretRing1Replacement
    1488 PATMIretRing1Start:
    14891332    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    14901333    pushfd
     
    16791522    TIMES PATCHJUMPTABLE_SIZE DB 0              ; lookup slots
    16801523
    1681 PATMIretRing1End:
    16821524ENDPROC     PATMIretRing1Replacement
    16831525
     
    16851527BEGIN_PATCH_RODATA_SECTION
    16861528GLOBALNAME g_patmIretRing1Record
    1687     RTCCPTR_DEF PATMIretRing1Start
    1688     DD      0
    1689     DD      0
    1690     DD      0
    1691     DD      PATMIretRing1End- PATMIretRing1Start
    16921529%ifdef PATM_LOG_PATCHIRET
    1693     DD      26
     1530    PATCHASMRECORD_INIT PATMIretRing1Replacement, 26
    16941531%else
    1695     DD      25
    1696 %endif
    1697     DD      PATM_INTERRUPTFLAG
    1698     DD      0
    1699 %ifdef PATM_LOG_PATCHIRET
    1700     DD      PATM_PENDINGACTION
    1701     DD      0
    1702 %endif
    1703     DD      PATM_VM_FORCEDACTIONS
    1704     DD      0
    1705     DD      PATM_TEMP_EAX
    1706     DD      0
    1707     DD      PATM_TEMP_ECX
    1708     DD      0
    1709     DD      PATM_TEMP_EDI
    1710     DD      0
    1711     DD      PATM_TEMP_RESTORE_FLAGS
    1712     DD      0
    1713     DD      PATM_PENDINGACTION
    1714     DD      0
    1715     DD      PATM_CURINSTRADDR
    1716     DD      0
    1717     DD      PATM_VMFLAGS
    1718     DD      0
    1719     DD      PATM_VMFLAGS
    1720     DD      0
    1721     DD      PATM_VMFLAGS
    1722     DD      0
    1723     DD      PATM_INHIBITIRQADDR
    1724     DD      0
    1725     DD      PATM_CURINSTRADDR
    1726     DD      0
    1727     DD      PATM_INTERRUPTFLAG
    1728     DD      0
    1729     DD      PATM_INTERRUPTFLAG
    1730     DD      0
    1731     DD      PATM_INTERRUPTFLAG
    1732     DD      0
    1733     DD      PATM_FIXUP
    1734     DD      PATMIretRing1Table - PATMIretRing1Start
    1735     DD      PATM_IRET_FUNCTION
    1736     DD      0
    1737     DD      PATM_VMFLAGS
    1738     DD      0
    1739     DD      PATM_VMFLAGS
    1740     DD      0
    1741     DD      PATM_VMFLAGS
    1742     DD      0
    1743     DD      PATM_TEMP_EAX
    1744     DD      0
    1745     DD      PATM_TEMP_ECX
    1746     DD      0
    1747     DD      PATM_TEMP_RESTORE_FLAGS
    1748     DD      0
    1749     DD      PATM_PENDINGACTION
    1750     DD      0
    1751     DD      0ffffffffh
     1532    PATCHASMRECORD_INIT PATMIretRing1Replacement, 25
     1533%endif
     1534    DD      PATM_INTERRUPTFLAG,      0
     1535%ifdef PATM_LOG_PATCHIRET           
     1536    DD      PATM_PENDINGACTION,      0
     1537%endif                               
     1538    DD      PATM_VM_FORCEDACTIONS,   0
     1539    DD      PATM_TEMP_EAX,           0
     1540    DD      PATM_TEMP_ECX,           0
     1541    DD      PATM_TEMP_EDI,           0
     1542    DD      PATM_TEMP_RESTORE_FLAGS, 0
     1543    DD      PATM_PENDINGACTION,      0
     1544    DD      PATM_CURINSTRADDR,       0
     1545    DD      PATM_VMFLAGS,            0
     1546    DD      PATM_VMFLAGS,            0
     1547    DD      PATM_VMFLAGS,            0
     1548    DD      PATM_INHIBITIRQADDR,     0
     1549    DD      PATM_CURINSTRADDR,       0
     1550    DD      PATM_INTERRUPTFLAG,      0
     1551    DD      PATM_INTERRUPTFLAG,      0
     1552    DD      PATM_INTERRUPTFLAG,      0
     1553    DD      PATM_FIXUP,              PATMIretRing1Table - NAME(PATMIretRing1Replacement)
     1554    DD      PATM_IRET_FUNCTION,      0
     1555    DD      PATM_VMFLAGS,            0
     1556    DD      PATM_VMFLAGS,            0
     1557    DD      PATM_VMFLAGS,            0
     1558    DD      PATM_TEMP_EAX,           0
     1559    DD      PATM_TEMP_ECX,           0
     1560    DD      PATM_TEMP_RESTORE_FLAGS, 0
     1561    DD      PATM_PENDINGACTION,      0
     1562    DD      0ffffffffh,              0ffffffffh
    17521563
    17531564
     
    17711582BEGIN_PATCH_CODE_SECTION
    17721583BEGINPROC   PATMIretFunction
    1773 PATMIretFunction_Start:
    17741584    push    ecx
    17751585    push    edx
     
    18291639    pop     ecx
    18301640    ret
    1831 
    1832 PATMIretFunction_End:
    18331641ENDPROC     PATMIretFunction
    18341642
    18351643BEGIN_PATCH_RODATA_SECTION
    18361644GLOBALNAME g_patmIretFunctionRecord
    1837     RTCCPTR_DEF PATMIretFunction_Start
    1838     DD      0
    1839     DD      0
    1840     DD      0
    1841     DD      PATMIretFunction_End - PATMIretFunction_Start
    1842     DD      2
    1843     DD      PATM_PENDINGACTION
    1844     DD      0
    1845     DD      PATM_PATCHBASE
    1846     DD      0
    1847     DD      0ffffffffh
     1645    PATCHASMRECORD_INIT PATMIretFunction, 2
     1646    DD      PATM_PENDINGACTION, 0
     1647    DD      PATM_PATCHBASE,     0
     1648    DD      0ffffffffh, 0ffffffffh
    18481649
    18491650
     
    18531654BEGIN_PATCH_CODE_SECTION
    18541655BEGINPROC   PATMCpuidReplacement
    1855 PATMCpuidStart:
    18561656    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    18571657    pushf
     
    18991699    popf
    19001700    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    1901 
    1902 PATMCpuidEnd:
    19031701ENDPROC PATMCpuidReplacement
    19041702
     
    19061704BEGIN_PATCH_RODATA_SECTION
    19071705GLOBALNAME g_patmCpuidRecord
    1908     istruc PATCHASMRECORD
    1909     at PATCHASMRECORD.pbFunction,     RTCCPTR_DEF PATMCpuidStart
    1910     at PATCHASMRECORD.offJump,        DD          0
    1911     at PATCHASMRECORD.offRelJump,     DD          0
    1912     at PATCHASMRECORD.offSizeOverride,DD          0
    1913     at PATCHASMRECORD.cbFunction,     DD          PATMCpuidEnd- PATMCpuidStart
    1914     at PATCHASMRECORD.cRelocs,        DD          9
    1915     iend
     1706    PATCHASMRECORD_INIT PATMCpuidReplacement, 9
    19161707    DD      PATM_INTERRUPTFLAG,     0       ; 0
    19171708    DD      PATM_CPUID_STD_MAX,     0       ; 1
     
    19311722BEGIN_PATCH_CODE_SECTION
    19321723BEGINPROC   PATMJEcxReplacement
    1933 PATMJEcxStart:
    19341724    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    19351725    pushfd
     
    19481738    popfd
    19491739    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    1950 PATMJEcxEnd:
    19511740ENDPROC PATMJEcxReplacement
    19521741
    19531742; Patch record for 'JEcx'
    19541743BEGIN_PATCH_RODATA_SECTION
    1955 GLOBALNAME g_patmJEcxRecord
    1956     RTCCPTR_DEF PATMJEcxStart
    1957     DD      0
    1958     DD      PATMJEcxJump - PATMJEcxStart
    1959     DD      PATMJEcxSizeOverride - PATMJEcxStart
    1960     DD      PATMJEcxEnd- PATMJEcxStart
    1961     DD      3
    1962     DD      PATM_INTERRUPTFLAG
    1963     DD      0
    1964     DD      PATM_INTERRUPTFLAG
    1965     DD      0
    1966     DD      PATM_INTERRUPTFLAG
    1967     DD      0
     1744GLOBALNAME g_patmJEcxRecord
     1745    PATCHASMRECORD_INIT_EX PATMJEcxReplacement, , PATMJEcxJump, PATMJEcxSizeOverride, 3
     1746    DD      PATM_INTERRUPTFLAG, 0
     1747    DD      PATM_INTERRUPTFLAG, 0
     1748    DD      PATM_INTERRUPTFLAG, 0
    19681749    DD      0ffffffffh, 0ffffffffh
    19691750
     
    19741755BEGIN_PATCH_CODE_SECTION
    19751756BEGINPROC   PATMLoopReplacement
    1976 PATMLoopStart:
    19771757    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    19781758    pushfd
     
    19911771    popfd
    19921772    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    1993 PATMLoopEnd:
    19941773ENDPROC PATMLoopReplacement
    19951774
     
    19971776BEGIN_PATCH_RODATA_SECTION
    19981777GLOBALNAME g_patmLoopRecord
    1999     RTCCPTR_DEF PATMLoopStart
    2000     DD      0
    2001     DD      PATMLoopJump - PATMLoopStart
    2002     DD      PATMLoopSizeOverride - PATMLoopStart
    2003     DD      PATMLoopEnd- PATMLoopStart
    2004     DD      3
    2005     DD      PATM_INTERRUPTFLAG
    2006     DD      0
    2007     DD      PATM_INTERRUPTFLAG
    2008     DD      0
    2009     DD      PATM_INTERRUPTFLAG
    2010     DD      0
    2011     DD      0ffffffffh, 0ffffffffh
    2012 
    2013 
    2014 ;
    2015 ;
     1778    PATCHASMRECORD_INIT_EX PATMLoopReplacement, , PATMLoopJump, PATMLoopSizeOverride, 3
     1779    DD      PATM_INTERRUPTFLAG, 0
     1780    DD      PATM_INTERRUPTFLAG, 0
     1781    DD      PATM_INTERRUPTFLAG, 0
     1782    DD      0ffffffffh, 0ffffffffh
     1783
     1784
     1785;
     1786; jump if ZF=1 AND (E)CX != 0
    20161787;
    20171788BEGIN_PATCH_CODE_SECTION
    20181789BEGINPROC   PATMLoopZReplacement
    2019 PATMLoopZStart:
    2020     ; jump if ZF=1 AND (E)CX != 0
    2021 
    2022     mov     dword [ss:PATM_INTERRUPTFLAG], 0
    2023     jnz     PATMLoopZEnd
     1790    mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1791    jnz     NAME(PATMLoopZReplacement_EndProc)
    20241792    pushfd
    20251793PATMLoopZSizeOverride:
     
    20371805    popfd
    20381806    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    2039 PATMLoopZEnd:
    20401807ENDPROC PATMLoopZReplacement
    20411808
     
    20431810BEGIN_PATCH_RODATA_SECTION
    20441811GLOBALNAME g_patmLoopZRecord
    2045     RTCCPTR_DEF PATMLoopZStart
    2046     DD      0
    2047     DD      PATMLoopZJump - PATMLoopZStart
    2048     DD      PATMLoopZSizeOverride - PATMLoopZStart
    2049     DD      PATMLoopZEnd- PATMLoopZStart
    2050     DD      3
    2051     DD      PATM_INTERRUPTFLAG
    2052     DD      0
    2053     DD      PATM_INTERRUPTFLAG
    2054     DD      0
    2055     DD      PATM_INTERRUPTFLAG
    2056     DD      0
    2057     DD      0ffffffffh, 0ffffffffh
    2058 
    2059 
    2060 ;
    2061 ;
     1812    PATCHASMRECORD_INIT_EX PATMLoopZReplacement, , PATMLoopZJump, PATMLoopZSizeOverride, 3
     1813    DD      PATM_INTERRUPTFLAG, 0
     1814    DD      PATM_INTERRUPTFLAG, 0
     1815    DD      PATM_INTERRUPTFLAG, 0
     1816    DD      0ffffffffh, 0ffffffffh
     1817
     1818
     1819;
     1820; jump if ZF=0 AND (E)CX != 0
    20621821;
    20631822BEGIN_PATCH_CODE_SECTION
    20641823BEGINPROC   PATMLoopNZReplacement
    2065 PATMLoopNZStart:
    2066     ; jump if ZF=0 AND (E)CX != 0
    2067 
    2068     mov     dword [ss:PATM_INTERRUPTFLAG], 0
    2069     jz      PATMLoopNZEnd
     1824    mov     dword [ss:PATM_INTERRUPTFLAG], 0
     1825    jz      NAME(PATMLoopNZReplacement_EndProc)
    20701826    pushfd
    20711827PATMLoopNZSizeOverride:
     
    20831839    popfd
    20841840    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    2085 PATMLoopNZEnd:
    20861841ENDPROC PATMLoopNZReplacement
    20871842
     
    20891844BEGIN_PATCH_RODATA_SECTION
    20901845GLOBALNAME g_patmLoopNZRecord
    2091     RTCCPTR_DEF PATMLoopNZStart
    2092     DD      0
    2093     DD      PATMLoopNZJump - PATMLoopNZStart
    2094     DD      PATMLoopNZSizeOverride - PATMLoopNZStart
    2095     DD      PATMLoopNZEnd- PATMLoopNZStart
    2096     DD      3
    2097     DD      PATM_INTERRUPTFLAG
    2098     DD      0
    2099     DD      PATM_INTERRUPTFLAG
    2100     DD      0
    2101     DD      PATM_INTERRUPTFLAG
    2102     DD      0
     1846    PATCHASMRECORD_INIT_EX PATMLoopNZReplacement, , PATMLoopNZJump, PATMLoopNZSizeOverride, 3
     1847    DD      PATM_INTERRUPTFLAG, 0
     1848    DD      PATM_INTERRUPTFLAG, 0
     1849    DD      PATM_INTERRUPTFLAG, 0
    21031850    DD      0ffffffffh, 0ffffffffh
    21041851
     
    21151862;
    21161863; @note NEVER change this without bumping the SSM version
     1864;
    21171865BEGIN_PATCH_CODE_SECTION
    21181866BEGINPROC PATMLookupAndCall
    2119 PATMLookupAndCallStart:
    21201867    push    eax
    21211868    push    edx
     
    22171964    ; the called function will set PATM_INTERRUPTFLAG (!!)
    22181965    jmp     dword [ss:PATM_CALL_PATCH_TARGET_ADDR]
    2219 
    2220 PATMLookupAndCallEnd:
    2221 ; returning here -> do not add code here or after the jmp!!!!!
     1966    ; returning here -> do not add code here or after the jmp!!!!!
    22221967ENDPROC PATMLookupAndCall
    22231968
     
    22251970BEGIN_PATCH_RODATA_SECTION
    22261971GLOBALNAME g_patmLookupAndCallRecord
    2227     RTCCPTR_DEF PATMLookupAndCallStart
    2228     DD      0
    2229     DD      0
    2230     DD      0
    2231     DD      PATMLookupAndCallEnd - PATMLookupAndCallStart
    22321972%ifdef PATM_LOG_PATCHINSTR
    2233     DD      10
     1973    PATCHASMRECORD_INIT PATMLookupAndCall, 10
    22341974%else
    2235     DD      9
    2236 %endif
    2237     DD      PATM_CALL_RETURN_ADDR
    2238     DD      0
    2239     DD      PATM_PENDINGACTION
    2240     DD      0
    2241     DD      PATM_PATCHBASE
    2242     DD      0
    2243     DD      PATM_STACKPTR
    2244     DD      0
    2245     DD      PATM_STACKBASE
    2246     DD      0
    2247     DD      PATM_STACKBASE_GUEST
    2248     DD      0
    2249     DD      PATM_CALL_PATCH_TARGET_ADDR
    2250     DD      0
    2251 %ifdef PATM_LOG_PATCHINSTR
    2252     DD      PATM_PENDINGACTION
    2253     DD      0
    2254 %endif
    2255     DD      PATM_CALL_RETURN_ADDR
    2256     DD      0
    2257     DD      PATM_CALL_PATCH_TARGET_ADDR
    2258     DD      0
     1975    PATCHASMRECORD_INIT PATMLookupAndCall, 9
     1976%endif
     1977    DD      PATM_CALL_RETURN_ADDR,       0
     1978    DD      PATM_PENDINGACTION,          0
     1979    DD      PATM_PATCHBASE,              0
     1980    DD      PATM_STACKPTR,               0
     1981    DD      PATM_STACKBASE,              0
     1982    DD      PATM_STACKBASE_GUEST,        0
     1983    DD      PATM_CALL_PATCH_TARGET_ADDR, 0
     1984%ifdef PATM_LOG_PATCHINSTR               
     1985    DD      PATM_PENDINGACTION,          0
     1986%endif                                   
     1987    DD      PATM_CALL_RETURN_ADDR,       0
     1988    DD      PATM_CALL_PATCH_TARGET_ADDR, 0
    22591989    DD      0ffffffffh, 0ffffffffh
    22601990
     
    22691999;
    22702000; @note NEVER change this without bumping the SSM version
     2001;
    22712002BEGIN_PATCH_CODE_SECTION
    22722003BEGINPROC PATMLookupAndJump
    2273 PATMLookupAndJumpStart:
    22742004    push    eax
    22752005    push    edx
     
    23372067    ; the jump destination will set PATM_INTERRUPTFLAG (!!)
    23382068    jmp     dword [ss:PATM_TEMP_EAX]                      ; call duplicated patch destination address
    2339 
    2340 PATMLookupAndJumpEnd:
    23412069ENDPROC PATMLookupAndJump
    23422070
     
    23442072BEGIN_PATCH_RODATA_SECTION
    23452073GLOBALNAME g_patmLookupAndJumpRecord
    2346     RTCCPTR_DEF PATMLookupAndJumpStart
    2347     DD      0
    2348     DD      0
    2349     DD      0
    2350     DD      PATMLookupAndJumpEnd - PATMLookupAndJumpStart
    2351     DD      5
    2352     DD      PATM_PENDINGACTION
    2353     DD      0
    2354     DD      PATM_PATCHBASE
    2355     DD      0
    2356     DD      PATM_TEMP_EAX
    2357     DD      0
    2358     DD      PATM_TEMP_EFLAGS
    2359     DD      0
    2360     DD      PATM_TEMP_EAX
    2361     DD      0
     2074    PATCHASMRECORD_INIT PATMLookupAndJump, 5
     2075    DD      PATM_PENDINGACTION, 0
     2076    DD      PATM_PATCHBASE,     0
     2077    DD      PATM_TEMP_EAX,      0
     2078    DD      PATM_TEMP_EFLAGS,   0
     2079    DD      PATM_TEMP_EAX,      0
    23622080    DD      0ffffffffh, 0ffffffffh
    23632081
     
    23702088BEGIN_PATCH_CODE_SECTION
    23712089BEGINPROC PATMCall
    2372 PATMCallStart:
    23732090    pushfd
    23742091    push    PATM_FIXUP              ; fixup for jump table below
     
    23852102%ifdef DEBUG
    23862103    ; for disassembly
    2387     jmp     PATMCallEnd
     2104    jmp     NAME(PATMCall_EndProc)
    23882105%endif
    23892106
     
    23952112    TIMES PATCHDIRECTJUMPTABLE_SIZE DB 0        ; only one lookup slot
    23962113
    2397 PATMCallEnd:
    2398 ; returning here -> do not add code here or after the jmp!!!!!
     2114    ; returning here -> do not add code here or after the jmp!!!!!
    23992115ENDPROC PATMCall
    24002116
     
    24022118BEGIN_PATCH_RODATA_SECTION
    24032119GLOBALNAME g_patmCallRecord
    2404     RTCCPTR_DEF PATMCallStart
    2405     DD      0
    2406     DD      0
    2407     DD      0
    2408     DD      PATMCallEnd - PATMCallStart
    2409     DD      5
    2410     DD      PATM_FIXUP
    2411     DD      PATMCallTable - PATMCallStart
    2412     DD      PATM_PATCHNEXTBLOCK
    2413     DD      0
    2414     DD      PATM_RETURNADDR
    2415     DD      0
    2416     DD      PATM_LOOKUP_AND_CALL_FUNCTION
    2417     DD      0
    2418     DD      PATM_INTERRUPTFLAG
    2419     DD      0
     2120    PATCHASMRECORD_INIT PATMCall, 5
     2121    DD      PATM_FIXUP,                     PATMCallTable - NAME(PATMCall)
     2122    DD      PATM_PATCHNEXTBLOCK,            0
     2123    DD      PATM_RETURNADDR,                0
     2124    DD      PATM_LOOKUP_AND_CALL_FUNCTION,  0
     2125    DD      PATM_INTERRUPTFLAG,             0
    24202126    DD      0ffffffffh, 0ffffffffh
    24212127
     
    24272133BEGIN_PATCH_CODE_SECTION
    24282134BEGINPROC PATMCallIndirect
    2429 PATMCallIndirectStart:
    24302135    pushfd
    24312136    push    PATM_FIXUP              ; fixup for jump table below
     
    24422147%ifdef DEBUG
    24432148    ; for disassembly
    2444     jmp     PATMCallIndirectEnd
     2149    jmp     NAME(PATMCallIndirect_EndProc)
    24452150%endif
    24462151
     
    24522157    TIMES PATCHJUMPTABLE_SIZE DB 0              ; lookup slots
    24532158
    2454 PATMCallIndirectEnd:
    2455 ; returning here -> do not add code here or after the jmp!!!!!
     2159    ; returning here -> do not add code here or after the jmp!!!!!
    24562160ENDPROC PATMCallIndirect
    24572161
     
    24592163BEGIN_PATCH_RODATA_SECTION
    24602164GLOBALNAME g_patmCallIndirectRecord
    2461     RTCCPTR_DEF PATMCallIndirectStart
    2462     DD      0
    2463     DD      0
    2464     DD      0
    2465     DD      PATMCallIndirectEnd - PATMCallIndirectStart
    2466     DD      5
    2467     DD      PATM_FIXUP
    2468     DD      PATMCallIndirectTable - PATMCallIndirectStart
    2469     DD      PATM_PATCHNEXTBLOCK
    2470     DD      0
    2471     DD      PATM_RETURNADDR
    2472     DD      0
    2473     DD      PATM_LOOKUP_AND_CALL_FUNCTION
    2474     DD      0
    2475     DD      PATM_INTERRUPTFLAG
    2476     DD      0
     2165    PATCHASMRECORD_INIT PATMCallIndirect, 5
     2166    DD      PATM_FIXUP,                     PATMCallIndirectTable - NAME(PATMCallIndirect)
     2167    DD      PATM_PATCHNEXTBLOCK,            0
     2168    DD      PATM_RETURNADDR,                0
     2169    DD      PATM_LOOKUP_AND_CALL_FUNCTION,  0
     2170    DD      PATM_INTERRUPTFLAG,             0
    24772171    DD      0ffffffffh, 0ffffffffh
    24782172
     
    24852179BEGIN_PATCH_CODE_SECTION
    24862180BEGINPROC PATMJumpIndirect
    2487 PATMJumpIndirectStart:
    24882181    ; save flags (just to be sure)
    24892182    pushfd
     
    25052198%ifdef DEBUG
    25062199    ; for disassembly
    2507     jmp     PATMJumpIndirectEnd
     2200    jmp     NAME(PATMJumpIndirect_EndProc)
    25082201%endif
    25092202
     
    25152208    TIMES PATCHJUMPTABLE_SIZE DB 0              ; lookup slots
    25162209
    2517 PATMJumpIndirectEnd:
    2518 ; returning here -> do not add code here or after the jmp!!!!!
     2210    ; returning here -> do not add code here or after the jmp!!!!!
    25192211ENDPROC PATMJumpIndirect
    25202212
     
    25222214BEGIN_PATCH_RODATA_SECTION
    25232215GLOBALNAME g_patmJumpIndirectRecord
    2524     RTCCPTR_DEF PATMJumpIndirectStart
    2525     DD      0
    2526     DD      0
    2527     DD      0
    2528     DD      PATMJumpIndirectEnd - PATMJumpIndirectStart
    2529     DD      5
    2530     DD      PATM_TEMP_EFLAGS
    2531     DD      0
    2532     DD      PATM_FIXUP
    2533     DD      PATMJumpIndirectTable - PATMJumpIndirectStart
    2534     DD      PATM_LOOKUP_AND_JUMP_FUNCTION
    2535     DD      0
    2536     DD      PATM_TEMP_EFLAGS
    2537     DD      0
    2538     DD      PATM_INTERRUPTFLAG
    2539     DD      0
     2216    PATCHASMRECORD_INIT PATMJumpIndirect, 5
     2217    DD      PATM_TEMP_EFLAGS,               0
     2218    DD      PATM_FIXUP,                     PATMJumpIndirectTable - NAME(PATMJumpIndirect)
     2219    DD      PATM_LOOKUP_AND_JUMP_FUNCTION,  0
     2220    DD      PATM_TEMP_EFLAGS,               0
     2221    DD      PATM_INTERRUPTFLAG,             0
    25402222    DD      0ffffffffh, 0ffffffffh
    25412223
     
    25462228BEGIN_PATCH_CODE_SECTION
    25472229BEGINPROC   PATMRet
    2548 PATMRet_Start:
    25492230    ; probe stack here as we can't recover from page faults later on
    25502231    not     dword [esp-32]
     
    25832264                                                ; caller will duplicate the ret or ret n instruction
    25842265                                                ; the patched call will set PATM_INTERRUPTFLAG after the return!
    2585 PATMRet_End:
    25862266ENDPROC     PATMRet
    25872267
    25882268BEGIN_PATCH_RODATA_SECTION
    25892269GLOBALNAME g_patmRetRecord
    2590     RTCCPTR_DEF PATMRet_Start
    2591     DD      0
    2592     DD      0
    2593     DD      0
    2594     DD      PATMRet_End - PATMRet_Start
    2595     DD      4
    2596     DD      PATM_INTERRUPTFLAG
    2597     DD      0
    2598     DD      PATM_FIXUP
    2599     DD      PATMRetTable - PATMRet_Start
    2600     DD      PATM_RETURN_FUNCTION
    2601     DD      0
    2602     DD      PATM_INTERRUPTFLAG
    2603     DD      0
     2270    PATCHASMRECORD_INIT PATMRet, 4
     2271    DD      PATM_INTERRUPTFLAG,   0
     2272    DD      PATM_FIXUP,           PATMRetTable - NAME(PATMRet)
     2273    DD      PATM_RETURN_FUNCTION, 0
     2274    DD      PATM_INTERRUPTFLAG,   0
    26042275    DD      0ffffffffh, 0ffffffffh
    26052276
     
    26222293;
    26232294; @note NEVER change this without bumping the SSM version
     2295;
    26242296BEGIN_PATCH_CODE_SECTION
    26252297BEGINPROC   PATMRetFunction
    2626 PATMRetFunction_Start:
    26272298    push    ecx
    26282299    push    edx
     
    27492420    pop     ecx
    27502421    ret
    2751 
    2752 PATMRetFunction_End:
    27532422ENDPROC     PATMRetFunction
    27542423
    27552424BEGIN_PATCH_RODATA_SECTION
    27562425GLOBALNAME g_patmRetFunctionRecord
    2757     RTCCPTR_DEF PATMRetFunction_Start
    2758     DD      0
    2759     DD      0
    2760     DD      0
    2761     DD      PATMRetFunction_End - PATMRetFunction_Start
    27622426%ifdef PATM_LOG_PATCHINSTR
    2763     DD      9
     2427    PATCHASMRECORD_INIT PATMRetFunction, 9
    27642428%else
    2765     DD      7
    2766 %endif
    2767     DD      PATM_STACKPTR
    2768     DD      0
    2769     DD      PATM_STACKPTR
    2770     DD      0
    2771     DD      PATM_STACKBASE_GUEST
    2772     DD      0
    2773     DD      PATM_STACKBASE
    2774     DD      0
    2775     DD      PATM_PATCHBASE
    2776     DD      0
    2777 %ifdef PATM_LOG_PATCHINSTR
    2778     DD      PATM_PENDINGACTION
    2779     DD      0
    2780 %endif
    2781     DD      PATM_PENDINGACTION
    2782     DD      0
    2783     DD      PATM_PATCHBASE
    2784     DD      0
    2785 %ifdef PATM_LOG_PATCHINSTR
    2786     DD      PATM_PENDINGACTION
    2787     DD      0
     2429    PATCHASMRECORD_INIT PATMRetFunction, 7
     2430%endif
     2431    DD      PATM_STACKPTR,        0
     2432    DD      PATM_STACKPTR,        0
     2433    DD      PATM_STACKBASE_GUEST, 0
     2434    DD      PATM_STACKBASE,       0
     2435    DD      PATM_PATCHBASE,       0
     2436%ifdef PATM_LOG_PATCHINSTR       
     2437    DD      PATM_PENDINGACTION,   0
     2438%endif                           
     2439    DD      PATM_PENDINGACTION,   0
     2440    DD      PATM_PATCHBASE,       0
     2441%ifdef PATM_LOG_PATCHINSTR       
     2442    DD      PATM_PENDINGACTION,   0
    27882443%endif
    27892444    DD      0ffffffffh, 0ffffffffh
     
    27952450BEGIN_PATCH_CODE_SECTION
    27962451BEGINPROC   PATMCheckIF
    2797 PATMCheckIF_Start:
    27982452    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    27992453    pushf
     
    28052459    popf
    28062460    mov     dword [ss:PATM_INTERRUPTFLAG], 1
    2807     jmp     PATMCheckIF_End
     2461    jmp     NAME(PATMCheckIF_EndProc)
    28082462
    28092463PATMCheckIF_Safe:
     
    28272481PATMCheckIF_Jump:
    28282482    DD      PATM_JUMPDELTA
    2829 PATMCheckIF_End:
    28302483ENDPROC     PATMCheckIF
    28312484
     
    28332486BEGIN_PATCH_RODATA_SECTION
    28342487GLOBALNAME g_patmCheckIFRecord
    2835     RTCCPTR_DEF PATMCheckIF_Start
    2836     DD      PATMCheckIF_Jump - PATMCheckIF_Start
    2837     DD      0
    2838     DD      0
    2839     DD      PATMCheckIF_End - PATMCheckIF_Start
    28402488%ifdef PATM_LOG_PATCHINSTR
    2841     DD      6
     2489    PATCHASMRECORD_INIT_JUMP PATMCheckIF, PATMCheckIF_Jump, 6
    28422490%else
    2843     DD      5
    2844 %endif
    2845     DD      PATM_INTERRUPTFLAG
    2846     DD      0
    2847     DD      PATM_VMFLAGS
    2848     DD      0
    2849     DD      PATM_INTERRUPTFLAG
    2850     DD      0
    2851     DD      PATM_STACKPTR
    2852     DD      0
    2853 %ifdef PATM_LOG_PATCHINSTR
    2854     DD      PATM_PENDINGACTION
    2855     DD      0
    2856 %endif
    2857     DD      PATM_INTERRUPTFLAG
    2858     DD      0
     2491    PATCHASMRECORD_INIT_JUMP PATMCheckIF, PATMCheckIF_Jump, 5
     2492%endif
     2493    DD      PATM_INTERRUPTFLAG, 0
     2494    DD      PATM_VMFLAGS,       0
     2495    DD      PATM_INTERRUPTFLAG, 0
     2496    DD      PATM_STACKPTR,      0
     2497%ifdef PATM_LOG_PATCHINSTR     
     2498    DD      PATM_PENDINGACTION, 0
     2499%endif                         
     2500    DD      PATM_INTERRUPTFLAG, 0
    28592501    DD      0ffffffffh, 0ffffffffh
    28602502
     
    28652507BEGIN_PATCH_CODE_SECTION
    28662508BEGINPROC   PATMJumpToGuest_IF1
    2867 PATMJumpToGuest_IF1_Start:
    28682509    mov     dword [ss:PATM_INTERRUPTFLAG], 0
    28692510    pushf
     
    28842525PATMJumpToGuest_IF1_Jump:
    28852526    DD      PATM_JUMPDELTA
    2886 PATMJumpToGuest_IF1_End:
    28872527ENDPROC     PATMJumpToGuest_IF1
    28882528
     
    28902530BEGIN_PATCH_RODATA_SECTION
    28912531GLOBALNAME PATMJumpToGuest_IF1Record
    2892     RTCCPTR_DEF PATMJumpToGuest_IF1_Start
    2893     DD      PATMJumpToGuest_IF1_Jump - PATMJumpToGuest_IF1_Start
    2894     DD      0
    2895     DD      0
    2896     DD      PATMJumpToGuest_IF1_End - PATMJumpToGuest_IF1_Start
    2897     DD      4
    2898     DD      PATM_INTERRUPTFLAG
    2899     DD      0
    2900     DD      PATM_VMFLAGS
    2901     DD      0
    2902     DD      PATM_INTERRUPTFLAG
    2903     DD      0
    2904     DD      PATM_INTERRUPTFLAG
    2905     DD      0
     2532    PATCHASMRECORD_INIT_JUMP PATMJumpToGuest_IF1, PATMJumpToGuest_IF1_Jump, 4
     2533    DD      PATM_INTERRUPTFLAG, 0
     2534    DD      PATM_VMFLAGS,       0
     2535    DD      PATM_INTERRUPTFLAG, 0
     2536    DD      PATM_INTERRUPTFLAG, 0
    29062537    DD      0ffffffffh, 0ffffffffh
    29072538
     
    29122543BEGIN_PATCH_CODE_SECTION
    29132544BEGINPROC PATMMovFromSS
    2914 PATMMovFromSS_Start:
    29152545    push    eax
    29162546    pushfd
     
    29242554    popfd
    29252555    pop     eax
    2926 PATMMovFromSS_Start_End:
    29272556ENDPROC PATMMovFromSS
    29282557
    29292558BEGIN_PATCH_RODATA_SECTION
    29302559GLOBALNAME g_patmMovFromSSRecord
    2931     RTCCPTR_DEF PATMMovFromSS_Start
    2932     DD      0
    2933     DD      0
    2934     DD      0
    2935     DD      PATMMovFromSS_Start_End - PATMMovFromSS_Start
    2936     DD      0
    2937     DD      0ffffffffh, 0ffffffffh
    2938 
    2939 
    2940 
    2941 
    2942 SECTION .rodata
    2943 ; For assertion during init (to make absolutely sure the flags are in sync in vm.mac & vm.h)
     2560    PATCHASMRECORD_INIT PATMMovFromSS, 0
     2561    DD      0ffffffffh, 0ffffffffh
     2562
     2563
     2564
     2565
     2566;; For assertion during init (to make absolutely sure the flags are in sync in vm.mac & vm.h)
     2567BEGINCONST
    29442568GLOBALNAME g_fPatmInterruptFlag
    29452569    DD      VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST
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