1 | ; $Id: PATMA.mac 76553 2019-01-01 01:45:53Z vboxsync $
|
---|
2 | ;; @file
|
---|
3 | ; PATM macros & definitions (identical to PATMA.h!).
|
---|
4 | ;
|
---|
5 |
|
---|
6 | ;
|
---|
7 | ; Copyright (C) 2006-2019 Oracle Corporation
|
---|
8 | ;
|
---|
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 | ;
|
---|
17 |
|
---|
18 | ; hardcoded dependency on single byte int 3
|
---|
19 | %define PATM_INT3 int3
|
---|
20 |
|
---|
21 | ;; @name Patch Fixup Types
|
---|
22 | ; @remarks These fixups types are part of the saved state.
|
---|
23 | ; @{
|
---|
24 | %define PATM_ASMFIX_VMFLAGS 0xF1ABCD00
|
---|
25 | %ifdef VBOX_WITH_STATISTICS
|
---|
26 | %define PATM_ASMFIX_ALLPATCHCALLS 0xF1ABCD01
|
---|
27 | %define PATM_ASMFIX_PERPATCHCALLS 0xF1ABCD02
|
---|
28 | %endif
|
---|
29 | %define PATM_ASMFIX_JUMPDELTA 0xF1ABCD03
|
---|
30 | %ifdef VBOX_WITH_STATISTICS
|
---|
31 | %define PATM_ASMFIX_IRETEFLAGS 0xF1ABCD04
|
---|
32 | %define PATM_ASMFIX_IRETCS 0xF1ABCD05
|
---|
33 | %define PATM_ASMFIX_IRETEIP 0xF1ABCD06
|
---|
34 | %endif
|
---|
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
|
---|
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
|
---|
60 |
|
---|
61 | ;/* Anything larger doesn't require a fixup */
|
---|
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
|
---|
75 | ;; @}
|
---|
76 |
|
---|
77 |
|
---|
78 | ;; Everything except IOPL, NT, IF, VM, VIF, VIP and RF
|
---|
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 |
|
---|
84 | ; PATM stack size (identical in PATMA.h!!)
|
---|
85 | %define PATM_STACK_SIZE (4096)
|
---|
86 | %define PATM_STACK_TOTAL_SIZE (2 * PATM_STACK_SIZE)
|
---|
87 | %define PATM_MAX_STACK (PATM_STACK_SIZE / RTRCPTR_CB)
|
---|
88 |
|
---|
89 | ;; @name Patch Manager pending actions (in GCSTATE).
|
---|
90 | ;; @{
|
---|
91 | %define PATM_ACTION_LOOKUP_ADDRESS 1
|
---|
92 | %define PATM_ACTION_DISPATCH_PENDING_IRQ 2
|
---|
93 | %define PATM_ACTION_PENDING_IRQ_AFTER_IRET 3
|
---|
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
|
---|
104 | %define PATM_ACTION_LOG_GATE_ENTRY 14
|
---|
105 | ;; @}
|
---|
106 |
|
---|
107 | ;; Magic dword found in ecx for patm pending actions.
|
---|
108 | %define PATM_ACTION_MAGIC 0xABCD4321
|
---|
109 |
|
---|
110 | ;; @name PATM_ASMFIX_TEMP_RESTORE_FLAGS
|
---|
111 | ;; @{
|
---|
112 | %define PATM_RESTORE_EAX RT_BIT(0)
|
---|
113 | %define PATM_RESTORE_ECX RT_BIT(1)
|
---|
114 | %define PATM_RESTORE_EDI RT_BIT(2)
|
---|
115 | ;; @}
|
---|
116 |
|
---|
117 |
|
---|
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
|
---|
136 | ;; Used only by loop/loopz/loopnz.
|
---|
137 | .offRelJump resd 1
|
---|
138 | ;; Size override byte position.
|
---|
139 | .offSizeOverride resd 1
|
---|
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 |
|
---|
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 |
|
---|