VirtualBox

source: vbox/trunk/src/VBox/VMM/include/PATMA.h@ 55909

Last change on this file since 55909 was 54764, checked in by vboxsync, 10 years ago

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

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 9.7 KB
Line 
1/* $Id: PATMA.h 54764 2015-03-15 03:25:11Z vboxsync $ */
2/** @file
3 * PATM macros & definitions (identical to PATMA.mac!).
4 */
5
6/*
7 * Copyright (C) 2006-2015 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#ifndef ___PATMA_H
19#define ___PATMA_H
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 /**< 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. */
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_HELPER_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/** Identifies an patch fixup type value (with reasonable accuracy). */
77#define PATM_IS_ASMFIX(a_uValue) \
78 ( ((a_uValue) & UINT32_C(0xfffffC00)) == UINT32_C(0xF1ABCC00) && ((a_uValue) & UINT32_C(0xff)) < UINT32_C(0x30) )
79/** @} */
80
81
82/** Everything except IOPL, NT, IF, VM, VIF, VIP and RF */
83#define PATM_FLAGS_MASK ( X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF \
84 | X86_EFL_TF | X86_EFL_DF | X86_EFL_OF | X86_EFL_AC | X86_EFL_ID)
85
86/** Flags that PATM virtualizes. Currently only IF & IOPL. */
87#define PATM_VIRTUAL_FLAGS_MASK (X86_EFL_IF | X86_EFL_IOPL)
88
89/* PATM stack size (identical in PATMA.mac!!) */
90#define PATM_STACK_SIZE (4096)
91#define PATM_STACK_TOTAL_SIZE (2 * PATM_STACK_SIZE)
92#define PATM_MAX_STACK (PATM_STACK_SIZE/sizeof(RTRCPTR))
93
94/** @name Patch Manager pending actions (in GCSTATE).
95 * @{ */
96#define PATM_ACTION_LOOKUP_ADDRESS 1
97#define PATM_ACTION_DISPATCH_PENDING_IRQ 2
98#define PATM_ACTION_PENDING_IRQ_AFTER_IRET 3
99#define PATM_ACTION_DO_V86_IRET 4
100#define PATM_ACTION_LOG_IF1 5
101#define PATM_ACTION_LOG_CLI 6
102#define PATM_ACTION_LOG_STI 7
103#define PATM_ACTION_LOG_POPF_IF1 8
104#define PATM_ACTION_LOG_POPF_IF0 9
105#define PATM_ACTION_LOG_PUSHF 10
106#define PATM_ACTION_LOG_IRET 11
107#define PATM_ACTION_LOG_RET 12
108#define PATM_ACTION_LOG_CALL 13
109#define PATM_ACTION_LOG_GATE_ENTRY 14
110/** @} */
111
112/** Magic dword found in ecx for patm pending actions. */
113#define PATM_ACTION_MAGIC 0xABCD4321
114
115/** @name PATM_ASMFIX_TEMP_RESTORE_FLAGS
116 * @{ */
117#define PATM_RESTORE_EAX RT_BIT(0)
118#define PATM_RESTORE_ECX RT_BIT(1)
119#define PATM_RESTORE_EDI RT_BIT(2)
120/** @} */
121
122/** Relocation entry for PATCHASMRECORD. */
123typedef struct PATCHASMRELOC
124{
125 /** The relocation type. */
126 uint32_t uType;
127 /** Additional information specific to the relocation type. */
128 uint32_t uInfo;
129} PATCHASMRELOC;
130typedef PATCHASMRELOC const *PCPATCHASMRELOC;
131
132/**
133 * Assembly patch descriptor record.
134 */
135typedef struct
136{
137 /** Pointer to the patch code. */
138 uint8_t *pbFunction;
139 /** Offset of the jump table? */
140 uint32_t offJump;
141 /** Used only by loop/loopz/loopnz. */
142 uint32_t offRelJump;
143 /** Size override byte position. */
144 uint32_t offSizeOverride;
145 /** The size of the patch function. */
146 uint32_t cbFunction;
147 /** The number of relocations in aRelocs. */
148 uint32_t cRelocs;
149 /** Variable sized relocation table. */
150 PATCHASMRELOC aRelocs[1];
151} PATCHASMRECORD;
152/** Pointer to a const patch descriptor record. */
153typedef PATCHASMRECORD const *PCPATCHASMRECORD;
154
155
156/* For indirect calls/jump (identical in PATMA.h & PATMA.mac!) */
157/** @note MUST BE A POWER OF TWO! */
158/** @note direct calls have only one lookup slot (PATCHDIRECTJUMPTABLE_SIZE) */
159/** @note Some statistics reveal that:
160 * - call: Windows XP boot -> max 16, 127 replacements
161 * - call: Knoppix 3.7 boot -> max 9
162 * - ret: Knoppix 5.0.1 boot -> max 16, 80000 replacements (3+ million hits)
163 */
164#define PATM_MAX_JUMPTABLE_ENTRIES 16
165typedef struct
166{
167 uint16_t nrSlots;
168 uint16_t ulInsertPos;
169 uint32_t cAddresses;
170 struct
171 {
172 RTRCPTR pInstrGC;
173 RTRCUINTPTR pRelPatchGC; /* relative to patch base */
174 } Slot[1];
175} PATCHJUMPTABLE, *PPATCHJUMPTABLE;
176
177
178RT_C_DECLS_BEGIN
179
180/** @name Patch Descriptor Records (in PATMA.asm)
181 * @{ */
182extern PATCHASMRECORD g_patmCliRecord;
183extern PATCHASMRECORD g_patmStiRecord;
184extern PATCHASMRECORD g_patmPopf32Record;
185extern PATCHASMRECORD g_patmPopf16Record;
186extern PATCHASMRECORD g_patmPopf16Record_NoExit;
187extern PATCHASMRECORD g_patmPopf32Record_NoExit;
188extern PATCHASMRECORD g_patmPushf32Record;
189extern PATCHASMRECORD g_patmPushf16Record;
190extern PATCHASMRECORD g_patmIretRecord;
191extern PATCHASMRECORD g_patmIretRing1Record;
192extern PATCHASMRECORD g_patmCpuidRecord;
193extern PATCHASMRECORD g_patmLoopRecord;
194extern PATCHASMRECORD g_patmLoopZRecord;
195extern PATCHASMRECORD g_patmLoopNZRecord;
196extern PATCHASMRECORD g_patmJEcxRecord;
197extern PATCHASMRECORD g_patmIntEntryRecord;
198extern PATCHASMRECORD g_patmIntEntryRecordErrorCode;
199extern PATCHASMRECORD g_patmTrapEntryRecord;
200extern PATCHASMRECORD g_patmTrapEntryRecordErrorCode;
201extern PATCHASMRECORD g_patmPushCSRecord;
202
203extern PATCHASMRECORD g_patmCheckIFRecord;
204extern PATCHASMRECORD PATMJumpToGuest_IF1Record;
205
206extern PATCHASMRECORD g_patmCallRecord;
207extern PATCHASMRECORD g_patmCallIndirectRecord;
208extern PATCHASMRECORD g_patmRetRecord;
209extern PATCHASMRECORD g_patmJumpIndirectRecord;
210
211extern PATCHASMRECORD g_patmLookupAndCallRecord;
212extern PATCHASMRECORD g_patmRetFunctionRecord;
213extern PATCHASMRECORD g_patmLookupAndJumpRecord;
214extern PATCHASMRECORD g_patmIretFunctionRecord;
215
216extern PATCHASMRECORD g_patmStatsRecord;
217
218extern PATCHASMRECORD g_patmSetPIFRecord;
219extern PATCHASMRECORD g_patmClearPIFRecord;
220
221extern PATCHASMRECORD g_patmSetInhibitIRQRecord;
222extern PATCHASMRECORD g_patmClearInhibitIRQFaultIF0Record;
223extern PATCHASMRECORD g_patmClearInhibitIRQContIF0Record;
224
225extern PATCHASMRECORD g_patmMovFromSSRecord;
226/** @} */
227
228extern const uint32_t g_fPatmInterruptFlag;
229
230RT_C_DECLS_END
231
232#endif
Note: See TracBrowser for help on using the repository browser.

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