Changeset 54686 in vbox for trunk/src/VBox
- Timestamp:
- Mar 8, 2015 8:51:01 PM (10 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/PATM.cpp
r52771 r54686 308 308 #endif /* VBOX_WITH_STATISTICS */ 309 309 310 Log(("PATMCallRecord. size %d\n", PATMCallRecord.size));311 Log(("PATMCallIndirectRecord. size %d\n", PATMCallIndirectRecord.size));312 Log(("PATMRetRecord. size %d\n", PATMRetRecord.size));313 Log(("PATMJumpIndirectRecord. size %d\n", PATMJumpIndirectRecord.size));314 Log(("PATMPopf32Record. size %d\n", PATMPopf32Record.size));315 Log(("PATMIretRecord. size %d\n", PATMIretRecord.size));316 Log(("PATMStiRecord. size %d\n", PATMStiRecord.size));317 Log(("PATMCheckIFRecord. size %d\n", PATMCheckIFRecord.size));310 Log(("PATMCallRecord.cbFunction %u\n", PATMCallRecord.cbFunction)); 311 Log(("PATMCallIndirectRecord.cbFunction %u\n", PATMCallIndirectRecord.cbFunction)); 312 Log(("PATMRetRecord.cbFunction %u\n", PATMRetRecord.cbFunction)); 313 Log(("PATMJumpIndirectRecord.cbFunction %u\n", PATMJumpIndirectRecord.cbFunction)); 314 Log(("PATMPopf32Record.cbFunction %u\n", PATMPopf32Record.cbFunction)); 315 Log(("PATMIretRecord.cbFunction %u\n", PATMIretRecord.cbFunction)); 316 Log(("PATMStiRecord.cbFunction %u\n", PATMStiRecord.cbFunction)); 317 Log(("PATMCheckIFRecord.cbFunction %u\n", PATMCheckIFRecord.cbFunction)); 318 318 319 319 return rc; -
trunk/src/VBox/VMM/VMMR3/PATMA.asm
r45276 r54686 1912 1912 SECTION .data 1913 1913 ; Patch record for 'cpuid' 1914 GLOBALNAME PATMCpuidRecord 1915 RTCCPTR_DEF PATMCpuidStart 1916 DD 0 1917 DD 0 1918 DD 0 1919 DD PATMCpuidEnd- PATMCpuidStart 1920 DD 9 1921 DD PATM_INTERRUPTFLAG 1922 DD 0 1923 DD PATM_CPUID_STD_MAX 1924 DD 0 1925 DD PATM_CPUID_EXT_MAX 1926 DD 0 1927 DD PATM_CPUID_CENTAUR_MAX 1928 DD 0 1929 DD PATM_CPUID_DEF_PTR 1930 DD 0 1931 DD PATM_CPUID_STD_PTR 1932 DD 0 1933 DD PATM_CPUID_EXT_PTR 1934 DD 0 1935 DD PATM_CPUID_CENTAUR_PTR 1936 DD 0 1937 DD PATM_INTERRUPTFLAG 1938 DD 0 1939 DD 0ffffffffh 1914 GLOBALNAME PATMCpuidRecord 1915 istruc PATCHASMRECORD 1916 at PATCHASMRECORD.pbFunction, RTCCPTR_DEF PATMCpuidStart 1917 at PATCHASMRECORD.offJump, DD 0 1918 at PATCHASMRECORD.offRelJump, DD 0 1919 at PATCHASMRECORD.offSizeOverride,DD 0 1920 at PATCHASMRECORD.cbFunction, DD PATMCpuidEnd- PATMCpuidStart 1921 at PATCHASMRECORD.cRelocs, DD 9 1922 iend 1923 DD PATM_INTERRUPTFLAG, 0 ; 0 1924 DD PATM_CPUID_STD_MAX, 0 ; 1 1925 DD PATM_CPUID_EXT_MAX, 0 ; 2 1926 DD PATM_CPUID_CENTAUR_MAX, 0 ; 3 1927 DD PATM_CPUID_DEF_PTR, 0 ; 4 1928 DD PATM_CPUID_STD_PTR, 0 ; 5 1929 DD PATM_CPUID_EXT_PTR, 0 ; 6 1930 DD PATM_CPUID_CENTAUR_PTR, 0 ; 7 1931 DD PATM_INTERRUPTFLAG, 0 ; 8 1932 DD 0ffffffffh, 0ffffffffh ; 9 - for sanity checks 1940 1933 SECTION .text 1941 1934 -
trunk/src/VBox/VMM/VMMR3/PATMA.mac
r44528 r54686 1 1 ; $Id$ 2 2 ;; @file 3 ; PATM macros & definitions (identical to PATMA.h! !)3 ; PATM macros & definitions (identical to PATMA.h!). 4 4 ; 5 5 6 6 ; 7 ; Copyright (C) 2006-201 0Oracle Corporation7 ; Copyright (C) 2006-2015 Oracle Corporation 8 8 ; 9 9 ; This file is part of VirtualBox Open Source Edition (OSE), as … … 19 19 %define PATM_INT3 int3 20 20 21 %define PATM_VMFLAGS 0xF1ABCD00 21 ;; @name Patch Fixup Types 22 ; @{ 23 %define PATM_VMFLAGS 0xF1ABCD00 22 24 %ifdef VBOX_WITH_STATISTICS 23 %define PATM_ALLPATCHCALLS0xF1ABCD0124 %define PATM_PERPATCHCALLS0xF1ABCD0225 %define PATM_ALLPATCHCALLS 0xF1ABCD01 26 %define PATM_PERPATCHCALLS 0xF1ABCD02 25 27 %endif 26 %define PATM_JUMPDELTA 0xF1ABCD0328 %define PATM_JUMPDELTA 0xF1ABCD03 27 29 %ifdef VBOX_WITH_STATISTICS 28 %define PATM_IRETEFLAGS0xF1ABCD0429 %define PATM_IRETCS0xF1ABCD0530 %define PATM_IRETEIP0xF1ABCD0630 %define PATM_IRETEFLAGS 0xF1ABCD04 31 %define PATM_IRETCS 0xF1ABCD05 32 %define PATM_IRETEIP 0xF1ABCD06 31 33 %endif 32 %define PATM_FIXUP 0xF1ABCD0733 %define PATM_PENDINGACTION 0xF1ABCD0834 %define PATM_CPUID_STD_PTR 0xF1ABCD0935 %define PATM_CPUID_EXT_PTR 0xF1ABCD0a36 %define PATM_CPUID_DEF_PTR 0xF1ABCD0b37 %define PATM_STACKBASE 0xF1ABCD0c ;/** Stack to store our private patch return addresses */38 %define PATM_STACKBASE_GUEST 0xF1ABCD0d ;/** Stack to store guest return addresses */39 %define PATM_STACKPTR 0xF1ABCD0e40 %define PATM_PATCHBASE 0xF1ABCD0f41 %define PATM_INTERRUPTFLAG 0xF1ABCD1042 %define PATM_INHIBITIRQADDR 0xF1ABCD1143 %define PATM_VM_FORCEDACTIONS 0xF1ABCD1244 %define PATM_TEMP_EAX 0xF1ABCD13 ;/** Location for original EAX register */45 %define PATM_TEMP_ECX 0xF1ABCD14 ;/** Location for original ECX register */46 %define PATM_TEMP_EDI 0xF1ABCD15 ;/** Location for original EDI register */47 %define PATM_TEMP_EFLAGS 0xF1ABCD16 ;/** Location for original eflags */48 %define PATM_TEMP_RESTORE_FLAGS 0xF1ABCD17 ;/** Which registers to restore */34 %define PATM_FIXUP 0xF1ABCD07 35 %define PATM_PENDINGACTION 0xF1ABCD08 36 %define PATM_CPUID_STD_PTR 0xF1ABCD09 37 %define PATM_CPUID_EXT_PTR 0xF1ABCD0a 38 %define PATM_CPUID_DEF_PTR 0xF1ABCD0b 39 %define PATM_STACKBASE 0xF1ABCD0c ;;< Stack to store our private patch return addresses 40 %define PATM_STACKBASE_GUEST 0xF1ABCD0d ;;< Stack to store guest return addresses 41 %define PATM_STACKPTR 0xF1ABCD0e 42 %define PATM_PATCHBASE 0xF1ABCD0f 43 %define PATM_INTERRUPTFLAG 0xF1ABCD10 44 %define PATM_INHIBITIRQADDR 0xF1ABCD11 45 %define PATM_VM_FORCEDACTIONS 0xF1ABCD12 46 %define PATM_TEMP_EAX 0xF1ABCD13 ;;< Location for original EAX register 47 %define PATM_TEMP_ECX 0xF1ABCD14 ;;< Location for original ECX register 48 %define PATM_TEMP_EDI 0xF1ABCD15 ;;< Location for original EDI register 49 %define PATM_TEMP_EFLAGS 0xF1ABCD16 ;;< Location for original eflags 50 %define PATM_TEMP_RESTORE_FLAGS 0xF1ABCD17 ;;< Which registers to restore 49 51 %define PATM_CALL_PATCH_TARGET_ADDR 0xF1ABCD18 50 52 %define PATM_CALL_RETURN_ADDR 0xF1ABCD19 51 %define PATM_CPUID_CENTAUR_PTR 0xF1ABCD1 A53 %define PATM_CPUID_CENTAUR_PTR 0xF1ABCD1a 52 54 53 55 ;/* Anything larger doesn't require a fixup */ 54 %define PATM_NO_FIXUP 0xF1ABCE0055 %define PATM_CPUID_STD_MAX 0xF1ABCE0056 %define PATM_CPUID_EXT_MAX 0xF1ABCE0157 %define PATM_RETURNADDR 0xF1ABCE0258 %define PATM_PATCHNEXTBLOCK 0xF1ABCE0359 %define PATM_CALLTARGET 0xF1ABCE04 ; /* relative */60 %define PATM_NEXTINSTRADDR 0xF1ABCE05 ; /* absolute guest address of the next instruction */61 %define PATM_CURINSTRADDR 0xF1ABCE06 ; /* absolute guest address of the current instruction */62 %define PATM_LOOKUP_AND_CALL_FUNCTION 0xF1ABCE07 ; /** Relative address of global PATM lookup and call function. */63 %define PATM_RETURN_FUNCTION 0xF1ABCE08 ; /** Relative address of global PATM return function. */64 %define PATM_LOOKUP_AND_JUMP_FUNCTION 0xF1ABCE09 ; /** Relative address of global PATM lookup and jump function. */65 %define PATM_IRET_FUNCTION 0xF1ABCE0A ; /** Relative address of global PATM iret function. */56 %define PATM_NO_FIXUP 0xF1ABCE00 57 %define PATM_CPUID_STD_MAX 0xF1ABCE00 58 %define PATM_CPUID_EXT_MAX 0xF1ABCE01 59 %define PATM_RETURNADDR 0xF1ABCE02 60 %define PATM_PATCHNEXTBLOCK 0xF1ABCE03 61 %define PATM_CALLTARGET 0xF1ABCE04 ;;< relative call target 62 %define PATM_NEXTINSTRADDR 0xF1ABCE05 ;;< absolute guest address of the next instruction 63 %define PATM_CURINSTRADDR 0xF1ABCE06 ;;< absolute guest address of the current instruction 64 %define PATM_LOOKUP_AND_CALL_FUNCTION 0xF1ABCE07 ;;< Relative address of global PATM lookup and call function. 65 %define PATM_RETURN_FUNCTION 0xF1ABCE08 ;;< Relative address of global PATM return function. 66 %define PATM_LOOKUP_AND_JUMP_FUNCTION 0xF1ABCE09 ;;< Relative address of global PATM lookup and jump function. 67 %define PATM_IRET_FUNCTION 0xF1ABCE0A ;;< Relative address of global PATM iret function. 66 68 %define PATM_CPUID_CENTAUR_MAX 0xF1ABCE0B 69 ;; @} 67 70 68 71 69 ; everything except IOPL, NT, IF, VM, VIF, VIP and RF72 ;; Everything except IOPL, NT, IF, VM, VIF, VIP and RF 70 73 %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) 71 74 … … 73 76 %define PATM_VIRTUAL_FLAGS_MASK (X86_EFL_IF|X86_EFL_IOPL) 74 77 75 ; PATM stack size (identical in PATMA. mac!!)78 ; PATM stack size (identical in PATMA.h!!) 76 79 %define PATM_STACK_SIZE (4096) 77 %define PATM_STACK_TOTAL_SIZE (2*PATM_STACK_SIZE) 80 %define PATM_STACK_TOTAL_SIZE (2 * PATM_STACK_SIZE) 81 %define PATM_MAX_STACK (PATM_STACK_SIZE / RTRCPTR_CB) 78 82 79 ;/* Patch Manager pending actions (in GCSTATE). */ 83 ;; @name Patch Manager pending actions (in GCSTATE). 84 ;; @{ 80 85 %define PATM_ACTION_LOOKUP_ADDRESS 1 81 86 %define PATM_ACTION_DISPATCH_PENDING_IRQ 2 … … 92 97 %define PATM_ACTION_LOG_CALL 13 93 98 %define PATM_ACTION_LOG_GATE_ENTRY 14 99 ;; @} 94 100 95 ; /* Magic dword found in ecx for patm pending actions. */96 %define PATM_ACTION_MAGIC 0xABCD4321101 ;; Magic dword found in ecx for patm pending actions. 102 %define PATM_ACTION_MAGIC 0xABCD4321 97 103 104 ;; @name PATM_TEMP_RESTORE_FLAGS 105 ;; @{ 98 106 %define PATM_RESTORE_EAX RT_BIT(0) 99 107 %define PATM_RESTORE_ECX RT_BIT(1) 100 108 %define PATM_RESTORE_EDI RT_BIT(2) 109 ;; @} 101 110 111 112 ;; 113 ; Relocation entry for PATCHASMRECORD. 114 ; 115 struc PATCHASMRELOC 116 ;; The relocation type. 117 .uType resd 1 118 ;; Additional information specific to the relocation type. 119 .uCode resd 1 120 endstruc 121 122 ;; 123 ; Assembly patch descriptor record. 124 ; 125 struc PATCHASMRECORD 126 ;; Pointer to the patch code. 127 .pbFunction RTCCPTR_RES 1 128 ;; Offset of the jump table? 129 .offJump resd 1 130 ;; Used only by loop/loopz/loopnz. 131 .offRelJump resd 1 132 ;; Size override byte position. 133 .offSizeOverride resd 1 134 ;; The size of the patch function. 135 .cbFunction resd 1 136 ;; The number of relocations in aRelocs. 137 .cRelocs resd 1 138 ;; Variable sized relocation table. (put after the iend, so no included) 139 ;.aRelocs resb PATCHASMRELOC_size 140 endstruc 102 141 103 142 ;/* For indirect calls/jump (identical in PATMA.h & PATMA.mac!) */ -
trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp
r54674 r54686 117 117 118 118 119 static uint32_t patmPatchGenCode(PVM pVM, PPATCHINFO pPatch, uint8_t *pPB, PPATCHASMRECORD pAsmRecord, RCPTRTYPE(uint8_t *) pReturnAddrGC, bool fGenJump, 119 static uint32_t patmPatchGenCode(PVM pVM, PPATCHINFO pPatch, uint8_t *pPB, PCPATCHASMRECORD pAsmRecord, 120 RCPTRTYPE(uint8_t *) pReturnAddrGC, bool fGenJump, 120 121 PPATMCALLINFO pCallInfo = 0) 121 122 { 122 uint32_t i, j;123 124 123 Assert(fGenJump == false || pReturnAddrGC); 125 124 Assert(fGenJump == false || pAsmRecord->offJump); 126 Assert(pAsmRecord && pAsmRecord->size > sizeof(pAsmRecord->uReloc[0])); 125 Assert(pAsmRecord); 126 Assert(pAsmRecord->cbFunction > sizeof(pAsmRecord->aRelocs[0].uType) * pAsmRecord->cRelocs); 127 127 128 128 // Copy the code block 129 memcpy(pPB, pAsmRecord->p Function, pAsmRecord->size);129 memcpy(pPB, pAsmRecord->pbFunction, pAsmRecord->cbFunction); 130 130 131 131 // Process all fixups 132 for (j=0,i=0;i<pAsmRecord->nrRelocs*2; i+=2) 133 { 134 for (;j<pAsmRecord->size;j++) 132 uint32_t i, j; 133 for (j = 0, i = 0; i < pAsmRecord->cRelocs; i++) 134 { 135 for (; j < pAsmRecord->cbFunction; j++) 135 136 { 136 if (*(uint32_t*)&pPB[j] == pAsmRecord-> uReloc[i])137 if (*(uint32_t*)&pPB[j] == pAsmRecord->aRelocs[i].uType) 137 138 { 138 139 RCPTRTYPE(uint32_t *) dest; 139 140 140 141 #ifdef VBOX_STRICT 141 if (pAsmRecord-> uReloc[i]== PATM_FIXUP)142 Assert(pAsmRecord-> uReloc[i+1]!= 0);142 if (pAsmRecord->aRelocs[i].uType == PATM_FIXUP) 143 Assert(pAsmRecord->aRelocs[i].uInfo != 0); 143 144 else 144 Assert(pAsmRecord-> uReloc[i+1]== 0);145 Assert(pAsmRecord->aRelocs[i].uInfo == 0); 145 146 #endif 146 147 … … 149 150 * A DIFFERENT HYPERVISOR LAYOUT. 150 151 */ 151 switch (pAsmRecord-> uReloc[i])152 switch (pAsmRecord->aRelocs[i].uType) 152 153 { 153 154 case PATM_VMFLAGS: … … 160 161 161 162 case PATM_FIXUP: 162 /* Offset in uReloc[i+1] is from the base of the function. */ 163 dest = (RTGCUINTPTR32)pVM->patm.s.pPatchMemGC + pAsmRecord->uReloc[i+1] + (RTGCUINTPTR32)(pPB - pVM->patm.s.pPatchMemHC); 163 /* Offset in aRelocs[i].uInfo is from the base of the function. */ 164 dest = (RTGCUINTPTR32)pVM->patm.s.pPatchMemGC + pAsmRecord->aRelocs[i].uInfo 165 + (RTGCUINTPTR32)(pPB - pVM->patm.s.pPatchMemHC); 164 166 break; 165 167 #ifdef VBOX_WITH_STATISTICS … … 200 202 201 203 case PATM_RETURNADDR: /* absolute guest address; no fixup required */ 202 Assert(pCallInfo && pAsmRecord-> uReloc[i]>= PATM_NO_FIXUP);204 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_NO_FIXUP); 203 205 dest = pCallInfo->pReturnGC; 204 206 break; 205 207 206 208 case PATM_PATCHNEXTBLOCK: /* relative address of instruction following this block */ 207 Assert(pCallInfo && pAsmRecord-> uReloc[i]>= PATM_NO_FIXUP);209 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_NO_FIXUP); 208 210 209 211 /** @note hardcoded assumption that we must return to the instruction following this block */ 210 dest = (uintptr_t)pPB - (uintptr_t)pVM->patm.s.pPatchMemHC + pAsmRecord-> size;212 dest = (uintptr_t)pPB - (uintptr_t)pVM->patm.s.pPatchMemHC + pAsmRecord->cbFunction; 211 213 break; 212 214 213 215 case PATM_CALLTARGET: /* relative to patch address; no fixup required */ 214 Assert(pCallInfo && pAsmRecord-> uReloc[i]>= PATM_NO_FIXUP);216 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_NO_FIXUP); 215 217 216 218 /* Address must be filled in later. (see patmr3SetBranchTargets) */ … … 224 226 225 227 case PATM_CPUID_STD_PTR: 226 /* @todo dirty hack when correcting this fixup (state restore) */228 /** @todo dirty hack when correcting this fixup (state restore) */ 227 229 dest = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM); 228 230 break; 229 231 230 232 case PATM_CPUID_EXT_PTR: 231 /* @todo dirty hack when correcting this fixup (state restore) */233 /** @todo dirty hack when correcting this fixup (state restore) */ 232 234 dest = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM); 233 235 break; 234 236 235 237 case PATM_CPUID_CENTAUR_PTR: 236 /* @todo dirty hack when correcting this fixup (state restore) */238 /** @todo dirty hack when correcting this fixup (state restore) */ 237 239 dest = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM); 238 240 break; 239 241 240 242 case PATM_CPUID_DEF_PTR: 241 /* @todo dirty hack when correcting this fixup (state restore) */243 /** @todo dirty hack when correcting this fixup (state restore) */ 242 244 dest = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM); 243 245 break; … … 353 355 354 356 *(RTRCPTR *)&pPB[j] = dest; 355 if (pAsmRecord-> uReloc[i]< PATM_NO_FIXUP)357 if (pAsmRecord->aRelocs[i].uType < PATM_NO_FIXUP) 356 358 { 357 359 patmPatchAddReloc32(pVM, pPatch, &pPB[j], FIXUP_ABSOLUTE); … … 360 362 } 361 363 } 362 Assert(j < pAsmRecord-> size);363 } 364 Assert(pAsmRecord-> uReloc[i]== 0xffffffff);364 Assert(j < pAsmRecord->cbFunction); 365 } 366 Assert(pAsmRecord->aRelocs[i].uInfo == 0xffffffff); 365 367 366 368 /* Add the jump back to guest code (if required) */ … … 381 383 // Calculate the right size of this patch block 382 384 if ((fGenJump && pAsmRecord->offJump) || (!fGenJump && !pAsmRecord->offJump)) 383 { 384 return pAsmRecord->size; 385 } 386 else { 387 // if a jump instruction is present and we don't want one, then subtract SIZEOF_NEARJUMP32 388 return pAsmRecord->size - SIZEOF_NEARJUMP32; 389 } 385 return pAsmRecord->cbFunction; 386 // if a jump instruction is present and we don't want one, then subtract SIZEOF_NEARJUMP32 387 return pAsmRecord->cbFunction - SIZEOF_NEARJUMP32; 390 388 } 391 389 … … 531 529 { 532 530 uint32_t size = 0; 533 P PATCHASMRECORD pPatchAsmRec;531 PCPATCHASMRECORD pPatchAsmRec; 534 532 535 533 PATCHGEN_PROLOG(pVM, pPatch); -
trunk/src/VBox/VMM/VMMR3/PATMR3Dbg.cpp
r46177 r54686 241 241 * Global functions and a start marker. 242 242 */ 243 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperCallGC, PATMLookupAndCallRecord. size, "PATMLookupAndCall");244 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperRetGC, PATMRetFunctionRecord. size, "PATMRetFunction");245 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperJumpGC, PATMLookupAndJumpRecord. size, "PATMLookupAndJump");246 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperIretGC, PATMIretFunctionRecord. size, "PATMIretFunction");243 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperCallGC, PATMLookupAndCallRecord.cbFunction, "PATMLookupAndCall"); 244 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperRetGC, PATMRetFunctionRecord.cbFunction, "PATMRetFunction"); 245 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperJumpGC, PATMLookupAndJumpRecord.cbFunction, "PATMLookupAndJump"); 246 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperIretGC, PATMIretFunctionRecord.cbFunction, "PATMIretFunction"); 247 247 248 248 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pPatchMemGC, 0, "PatchMemStart"); -
trunk/src/VBox/VMM/include/PATMA.h
r45276 r54686 1 1 /* $Id$ */ 2 2 /** @file 3 * PATM macros & definitions (identical to PATMA.mac! !)3 * PATM macros & definitions (identical to PATMA.mac!). 4 4 */ 5 5 6 6 /* 7 * Copyright (C) 2006-201 2Oracle Corporation7 * Copyright (C) 2006-2015 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 19 19 #define ___PATMA_H 20 20 21 21 /** @name Patch Fixup Types 22 * @{ */ 22 23 #define PATM_VMFLAGS 0xF1ABCD00 23 24 #ifdef VBOX_WITH_STATISTICS 24 # define PATM_ALLPATCHCALLS0xF1ABCD0125 # define PATM_PERPATCHCALLS0xF1ABCD0225 # define PATM_ALLPATCHCALLS 0xF1ABCD01 26 # define PATM_PERPATCHCALLS 0xF1ABCD02 26 27 #endif 27 28 #define PATM_JUMPDELTA 0xF1ABCD03 28 29 #ifdef VBOX_WITH_STATISTICS 29 # define PATM_IRETEFLAGS0xF1ABCD0430 # define PATM_IRETCS0xF1ABCD0531 # define PATM_IRETEIP0xF1ABCD0630 # define PATM_IRETEFLAGS 0xF1ABCD04 31 # define PATM_IRETCS 0xF1ABCD05 32 # define PATM_IRETEIP 0xF1ABCD06 32 33 #endif 33 34 #define PATM_FIXUP 0xF1ABCD07 … … 36 37 #define PATM_CPUID_EXT_PTR 0xF1ABCD0a 37 38 #define PATM_CPUID_DEF_PTR 0xF1ABCD0b 38 #define PATM_STACKBASE 0xF1ABCD0c /**Stack to store our private patch return addresses */39 #define PATM_STACKBASE_GUEST 0xF1ABCD0d /**Stack to store guest return addresses */39 #define PATM_STACKBASE 0xF1ABCD0c /**< Stack to store our private patch return addresses */ 40 #define PATM_STACKBASE_GUEST 0xF1ABCD0d /**< Stack to store guest return addresses */ 40 41 #define PATM_STACKPTR 0xF1ABCD0e 41 42 #define PATM_PATCHBASE 0xF1ABCD0f … … 43 44 #define PATM_INHIBITIRQADDR 0xF1ABCD11 44 45 #define PATM_VM_FORCEDACTIONS 0xF1ABCD12 45 #define PATM_TEMP_EAX 0xF1ABCD13 /**Location for original EAX register */46 #define PATM_TEMP_ECX 0xF1ABCD14 /**Location for original ECX register */47 #define PATM_TEMP_EDI 0xF1ABCD15 /**Location for original EDI register */48 #define PATM_TEMP_EFLAGS 0xF1ABCD16 /**Location for original eflags */49 #define PATM_TEMP_RESTORE_FLAGS 0xF1ABCD17 /**Which registers to restore */46 #define PATM_TEMP_EAX 0xF1ABCD13 /**< Location for original EAX register */ 47 #define PATM_TEMP_ECX 0xF1ABCD14 /**< Location for original ECX register */ 48 #define PATM_TEMP_EDI 0xF1ABCD15 /**< Location for original EDI register */ 49 #define PATM_TEMP_EFLAGS 0xF1ABCD16 /**< Location for original eflags */ 50 #define PATM_TEMP_RESTORE_FLAGS 0xF1ABCD17 /**< Which registers to restore */ 50 51 #define PATM_CALL_PATCH_TARGET_ADDR 0xF1ABCD18 51 52 #define PATM_CALL_RETURN_ADDR 0xF1ABCD19 … … 58 59 #define PATM_RETURNADDR 0xF1ABCE02 59 60 #define PATM_PATCHNEXTBLOCK 0xF1ABCE03 60 #define PATM_CALLTARGET 0xF1ABCE04 /**relative call target */61 #define PATM_NEXTINSTRADDR 0xF1ABCE05 /**absolute guest address of the next instruction */62 #define PATM_CURINSTRADDR 0xF1ABCE06 /**absolute guest address of the current instruction */63 #define PATM_LOOKUP_AND_CALL_FUNCTION 0xF1ABCE07 /**Relative address of global PATM lookup and call function. */64 #define PATM_RETURN_FUNCTION 0xF1ABCE08 /**Relative address of global PATM return function. */65 #define PATM_LOOKUP_AND_JUMP_FUNCTION 0xF1ABCE09 /**Relative address of global PATM lookup and jump function. */66 #define PATM_IRET_FUNCTION 0xF1ABCE0A /**Relative address of global PATM iret function. */61 #define PATM_CALLTARGET 0xF1ABCE04 /**< relative call target */ 62 #define PATM_NEXTINSTRADDR 0xF1ABCE05 /**< absolute guest address of the next instruction */ 63 #define PATM_CURINSTRADDR 0xF1ABCE06 /**< absolute guest address of the current instruction */ 64 #define PATM_LOOKUP_AND_CALL_FUNCTION 0xF1ABCE07 /**< Relative address of global PATM lookup and call function. */ 65 #define PATM_RETURN_FUNCTION 0xF1ABCE08 /**< Relative address of global PATM return function. */ 66 #define PATM_LOOKUP_AND_JUMP_FUNCTION 0xF1ABCE09 /**< Relative address of global PATM lookup and jump function. */ 67 #define PATM_IRET_FUNCTION 0xF1ABCE0A /**< Relative address of global PATM iret function. */ 67 68 #define PATM_CPUID_CENTAUR_MAX 0xF1ABCE0B 68 69 // everything except IOPL, NT, IF, VM, VIF, VIP and RF 70 #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) 71 72 // currently only IF & IOPL 73 #define PATM_VIRTUAL_FLAGS_MASK (X86_EFL_IF|X86_EFL_IOPL) 69 /** @} */ 70 71 72 /** Everything except IOPL, NT, IF, VM, VIF, VIP and RF */ 73 #define PATM_FLAGS_MASK ( X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF \ 74 | X86_EFL_TF | X86_EFL_DF | X86_EFL_OF | X86_EFL_AC | X86_EFL_ID) 75 76 /** Flags that PATM virtualizes. Currently only IF & IOPL. */ 77 #define PATM_VIRTUAL_FLAGS_MASK (X86_EFL_IF | X86_EFL_IOPL) 74 78 75 79 /* PATM stack size (identical in PATMA.mac!!) */ 76 #define PATM_STACK_SIZE ( PAGE_SIZE)77 #define PATM_STACK_TOTAL_SIZE (2 *PATM_STACK_SIZE)80 #define PATM_STACK_SIZE (4096) 81 #define PATM_STACK_TOTAL_SIZE (2 * PATM_STACK_SIZE) 78 82 #define PATM_MAX_STACK (PATM_STACK_SIZE/sizeof(RTRCPTR)) 79 83 80 /* Patch Manager pending actions (in GCSTATE). */ 84 /** @name Patch Manager pending actions (in GCSTATE). 85 * @{ */ 81 86 #define PATM_ACTION_LOOKUP_ADDRESS 1 82 87 #define PATM_ACTION_DISPATCH_PENDING_IRQ 2 … … 93 98 #define PATM_ACTION_LOG_CALL 13 94 99 #define PATM_ACTION_LOG_GATE_ENTRY 14 95 96 /* Magic dword found in ecx for patm pending actions. */ 100 /** @} */ 101 102 /** Magic dword found in ecx for patm pending actions. */ 97 103 #define PATM_ACTION_MAGIC 0xABCD4321 98 104 99 /** PATM_TEMP_RESTORE_FLAGS */ 105 /** @name PATM_TEMP_RESTORE_FLAGS 106 * @{ */ 100 107 #define PATM_RESTORE_EAX RT_BIT(0) 101 108 #define PATM_RESTORE_ECX RT_BIT(1) 102 109 #define PATM_RESTORE_EDI RT_BIT(2) 103 110 /** @} */ 111 112 /** Relocation entry for PATCHASMRECORD. */ 113 typedef struct PATCHASMRELOC 114 { 115 /** The relocation type. */ 116 uint32_t uType; 117 /** Additional information specific to the relocation type. */ 118 uint32_t uInfo; 119 } PATCHASMRELOC; 120 typedef PATCHASMRELOC const *PCPATCHASMRELOC; 121 122 /** 123 * Assembly patch descriptor record. 124 */ 104 125 typedef struct 105 126 { 106 uint8_t *pFunction; 107 uint32_t offJump; 108 uint32_t offRelJump; //used only by loop/loopz/loopnz 109 uint32_t offSizeOverride; //size override byte position 110 uint32_t size; 111 uint32_t nrRelocs; 112 uint32_t uReloc[1]; 113 } PATCHASMRECORD, *PPATCHASMRECORD; 127 /** Pointer to the patch code. */ 128 uint8_t *pbFunction; 129 /** Offset of the jump table? */ 130 uint32_t offJump; 131 /** Used only by loop/loopz/loopnz. */ 132 uint32_t offRelJump; 133 /** Size override byte position. */ 134 uint32_t offSizeOverride; 135 /** The size of the patch function. */ 136 uint32_t cbFunction; 137 /** The number of relocations in aRelocs. */ 138 uint32_t cRelocs; 139 /** Variable sized relocation table. */ 140 PATCHASMRELOC aRelocs[1]; 141 } PATCHASMRECORD; 142 /** Pointer to a const patch descriptor record. */ 143 typedef PATCHASMRECORD const *PCPATCHASMRECORD; 144 114 145 115 146 /* For indirect calls/jump (identical in PATMA.h & PATMA.mac!) */ … … 137 168 RT_C_DECLS_BEGIN 138 169 170 /** @name Patch Descriptor Records (in PATMA.asm) 171 * @{ */ 139 172 extern PATCHASMRECORD PATMCliRecord; 140 173 extern PATCHASMRECORD PATMStiRecord; … … 181 214 182 215 extern PATCHASMRECORD PATMMovFromSSRecord; 216 /** @} */ 183 217 184 218 extern const uint32_t PATMInterruptFlag;
Note:
See TracChangeset
for help on using the changeset viewer.