[19] | 1 | ; $Id: PATMA.mac 76553 2019-01-01 01:45:53Z vboxsync $
|
---|
[1] | 2 | ;; @file
|
---|
[54686] | 3 | ; PATM macros & definitions (identical to PATMA.h!).
|
---|
[1] | 4 | ;
|
---|
| 5 |
|
---|
[19] | 6 | ;
|
---|
[76553] | 7 | ; Copyright (C) 2006-2019 Oracle Corporation
|
---|
[5285] | 8 | ;
|
---|
[5999] | 9 | ; This file is part of VirtualBox Open Source Edition (OSE), as
|
---|
| 10 | ; available from http://www.virtualbox.org. This file is free software;
|
---|
| 11 | ; you can redistribute it and/or modify it under the terms of the GNU
|
---|
| 12 | ; General Public License (GPL) as published by the Free Software
|
---|
| 13 | ; Foundation, in version 2 as it comes in the "COPYING" file of the
|
---|
| 14 | ; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
---|
| 15 | ; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
---|
| 16 | ;
|
---|
[1] | 17 |
|
---|
| 18 | ; hardcoded dependency on single byte int 3
|
---|
| 19 | %define PATM_INT3 int3
|
---|
| 20 |
|
---|
[54686] | 21 | ;; @name Patch Fixup Types
|
---|
[54714] | 22 | ; @remarks These fixups types are part of the saved state.
|
---|
[54686] | 23 | ; @{
|
---|
[54764] | 24 | %define PATM_ASMFIX_VMFLAGS 0xF1ABCD00
|
---|
[1] | 25 | %ifdef VBOX_WITH_STATISTICS
|
---|
[54764] | 26 | %define PATM_ASMFIX_ALLPATCHCALLS 0xF1ABCD01
|
---|
| 27 | %define PATM_ASMFIX_PERPATCHCALLS 0xF1ABCD02
|
---|
[1] | 28 | %endif
|
---|
[54764] | 29 | %define PATM_ASMFIX_JUMPDELTA 0xF1ABCD03
|
---|
[1] | 30 | %ifdef VBOX_WITH_STATISTICS
|
---|
[54764] | 31 | %define PATM_ASMFIX_IRETEFLAGS 0xF1ABCD04
|
---|
| 32 | %define PATM_ASMFIX_IRETCS 0xF1ABCD05
|
---|
| 33 | %define PATM_ASMFIX_IRETEIP 0xF1ABCD06
|
---|
[1] | 34 | %endif
|
---|
[54764] | 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
|
---|
[54763] | 55 | %define PATM_ASMFIX_REUSE_LATER_0 0xF1ABCD1b
|
---|
| 56 | %define PATM_ASMFIX_REUSE_LATER_1 0xF1ABCD1c
|
---|
| 57 | %define PATM_ASMFIX_REUSE_LATER_2 0xF1ABCD1d
|
---|
| 58 | %define PATM_ASMFIX_REUSE_LATER_3 0xF1ABCD1e
|
---|
| 59 | %define PATM_ASMFIX_PATCH_HLP_CPUM_CPUID 0xF1ABCD1f
|
---|
[1] | 60 |
|
---|
| 61 | ;/* Anything larger doesn't require a fixup */
|
---|
[54764] | 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
|
---|
[54686] | 75 | ;; @}
|
---|
[1] | 76 |
|
---|
| 77 |
|
---|
[66104] | 78 | ;; Everything except IOPL, NT, IF, VM, VIF, VIP and RF
|
---|
[1] | 79 | %define PATM_FLAGS_MASK (X86_EFL_CF|X86_EFL_PF|X86_EFL_AF|X86_EFL_ZF|X86_EFL_SF|X86_EFL_TF|X86_EFL_DF|X86_EFL_OF|X86_EFL_AC|X86_EFL_ID)
|
---|
| 80 |
|
---|
| 81 | ; currently only IF & IOPL
|
---|
| 82 | %define PATM_VIRTUAL_FLAGS_MASK (X86_EFL_IF|X86_EFL_IOPL)
|
---|
| 83 |
|
---|
[54686] | 84 | ; PATM stack size (identical in PATMA.h!!)
|
---|
[1] | 85 | %define PATM_STACK_SIZE (4096)
|
---|
[54686] | 86 | %define PATM_STACK_TOTAL_SIZE (2 * PATM_STACK_SIZE)
|
---|
| 87 | %define PATM_MAX_STACK (PATM_STACK_SIZE / RTRCPTR_CB)
|
---|
[1] | 88 |
|
---|
[54686] | 89 | ;; @name Patch Manager pending actions (in GCSTATE).
|
---|
| 90 | ;; @{
|
---|
[267] | 91 | %define PATM_ACTION_LOOKUP_ADDRESS 1
|
---|
[1] | 92 | %define PATM_ACTION_DISPATCH_PENDING_IRQ 2
|
---|
[267] | 93 | %define PATM_ACTION_PENDING_IRQ_AFTER_IRET 3
|
---|
[1125] | 94 | %define PATM_ACTION_DO_V86_IRET 4
|
---|
| 95 | %define PATM_ACTION_LOG_IF1 5
|
---|
| 96 | %define PATM_ACTION_LOG_CLI 6
|
---|
| 97 | %define PATM_ACTION_LOG_STI 7
|
---|
| 98 | %define PATM_ACTION_LOG_POPF_IF1 8
|
---|
| 99 | %define PATM_ACTION_LOG_POPF_IF0 9
|
---|
| 100 | %define PATM_ACTION_LOG_PUSHF 10
|
---|
| 101 | %define PATM_ACTION_LOG_IRET 11
|
---|
| 102 | %define PATM_ACTION_LOG_RET 12
|
---|
| 103 | %define PATM_ACTION_LOG_CALL 13
|
---|
[1437] | 104 | %define PATM_ACTION_LOG_GATE_ENTRY 14
|
---|
[54686] | 105 | ;; @}
|
---|
[1] | 106 |
|
---|
[54686] | 107 | ;; Magic dword found in ecx for patm pending actions.
|
---|
| 108 | %define PATM_ACTION_MAGIC 0xABCD4321
|
---|
[1] | 109 |
|
---|
[54764] | 110 | ;; @name PATM_ASMFIX_TEMP_RESTORE_FLAGS
|
---|
[54686] | 111 | ;; @{
|
---|
[5605] | 112 | %define PATM_RESTORE_EAX RT_BIT(0)
|
---|
| 113 | %define PATM_RESTORE_ECX RT_BIT(1)
|
---|
| 114 | %define PATM_RESTORE_EDI RT_BIT(2)
|
---|
[54686] | 115 | ;; @}
|
---|
[1] | 116 |
|
---|
| 117 |
|
---|
[54686] | 118 | ;;
|
---|
| 119 | ; Relocation entry for PATCHASMRECORD.
|
---|
| 120 | ;
|
---|
| 121 | struc PATCHASMRELOC
|
---|
| 122 | ;; The relocation type.
|
---|
| 123 | .uType resd 1
|
---|
| 124 | ;; Additional information specific to the relocation type.
|
---|
| 125 | .uCode resd 1
|
---|
| 126 | endstruc
|
---|
| 127 |
|
---|
| 128 | ;;
|
---|
| 129 | ; Assembly patch descriptor record.
|
---|
| 130 | ;
|
---|
| 131 | struc PATCHASMRECORD
|
---|
| 132 | ;; Pointer to the patch code.
|
---|
| 133 | .pbFunction RTCCPTR_RES 1
|
---|
| 134 | ;; Offset of the jump table?
|
---|
| 135 | .offJump resd 1
|
---|
[66104] | 136 | ;; Used only by loop/loopz/loopnz.
|
---|
| 137 | .offRelJump resd 1
|
---|
[54686] | 138 | ;; Size override byte position.
|
---|
[66104] | 139 | .offSizeOverride resd 1
|
---|
[54686] | 140 | ;; The size of the patch function.
|
---|
| 141 | .cbFunction resd 1
|
---|
| 142 | ;; The number of relocations in aRelocs.
|
---|
| 143 | .cRelocs resd 1
|
---|
| 144 | ;; Variable sized relocation table. (put after the iend, so no included)
|
---|
| 145 | ;.aRelocs resb PATCHASMRELOC_size
|
---|
| 146 | endstruc
|
---|
| 147 |
|
---|
[1] | 148 | ;/* For indirect calls/jump (identical in PATMA.h & PATMA.mac!) */
|
---|
| 149 | %define PATM_MAX_JUMPTABLE_ENTRIES 16
|
---|
| 150 |
|
---|
| 151 | struc PATCHJUMPTABLE
|
---|
| 152 | .nrSlots resw 1
|
---|
| 153 | .ulInsertPos resw 1
|
---|
| 154 | .cAddresses resd 1
|
---|
| 155 | ; array of pInstrGC and pRelPatchGC pairs (nrSlot times)
|
---|
| 156 | .Slot_pInstrGC resd 1
|
---|
| 157 | .Slot_pRelPatchGC resd 1
|
---|
| 158 | endstruc
|
---|
| 159 |
|
---|
| 160 | ;/* Must match structure size!!
|
---|
| 161 | %define PATCHJUMPTABLE_SIZE (PATM_MAX_JUMPTABLE_ENTRIES*2*4)
|
---|
| 162 | ;/* Direct calls need only one lookup slot */
|
---|
| 163 | %define PATCHDIRECTJUMPTABLE_SIZE (2*4)
|
---|
| 164 |
|
---|