Changeset 54764 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Mar 15, 2015 3:25:11 AM (10 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/PATM.cpp
r54763 r54764 784 784 { 785 785 case FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL: 786 Assert(pRec->pDest == pRec->pSource); Assert(PATM_IS_ FIXUP_TYPE(pRec->pSource));786 Assert(pRec->pDest == pRec->pSource); Assert(PATM_IS_ASMFIX(pRec->pSource)); 787 787 Log(("Absolute patch template fixup type %#x at %RHv -> %RHv at %RRv\n", pRec->pSource, *(RTRCUINTPTR *)pRec->pRelocPos, *(RTRCINTPTR*)pRec->pRelocPos + delta, pRec->pRelocPos)); 788 788 *(RTRCUINTPTR *)pRec->pRelocPos += delta; … … 942 942 /* Only applicable when loading state. */ 943 943 Assert(pRec->pDest == pRec->pSource); 944 Assert(PATM_IS_ FIXUP_TYPE(pRec->pSource));944 Assert(PATM_IS_ASMFIX(pRec->pSource)); 945 945 break; 946 946 … … 3606 3606 if (pPatchTargetGC) 3607 3607 { 3608 /* Create a trampoline that also sets PATM_ INTERRUPTFLAG. */3608 /* Create a trampoline that also sets PATM_ASMFIX_INTERRUPTFLAG. */ 3609 3609 rc = PATMR3InstallPatch(pVM, pBranchTarget, PATMFL_CODE32 | PATMFL_TRAMPOLINE); 3610 3610 } -
trunk/src/VBox/VMM/VMMR3/PATMA.asm
r54763 r54764 208 208 BEGIN_PATCH_CODE_SECTION 209 209 BEGINPROC PATMStats 210 mov dword [ss:PATM_ INTERRUPTFLAG], 0210 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 211 211 pushf 212 inc dword [ss:PATM_A LLPATCHCALLS]213 inc dword [ss:PATM_ PERPATCHCALLS]212 inc dword [ss:PATM_ASMFIX_ALLPATCHCALLS] 213 inc dword [ss:PATM_ASMFIX_PERPATCHCALLS] 214 214 popf 215 mov dword [ss:PATM_ INTERRUPTFLAG], 1215 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 216 216 ENDPROC PATMStats 217 217 … … 220 220 GLOBALNAME g_patmStatsRecord 221 221 PATCHASMRECORD_INIT PATMStats, 4 222 DD PATM_ INTERRUPTFLAG, 0223 DD PATM_A LLPATCHCALLS, 0224 DD PATM_ PERPATCHCALLS, 0225 DD PATM_ INTERRUPTFLAG, 0222 DD PATM_ASMFIX_INTERRUPTFLAG, 0 223 DD PATM_ASMFIX_ALLPATCHCALLS, 0 224 DD PATM_ASMFIX_PERPATCHCALLS, 0 225 DD PATM_ASMFIX_INTERRUPTFLAG, 0 226 226 DD 0ffffffffh, 0ffffffffh 227 227 %endif ; VBOX_WITH_STATISTICS … … 229 229 230 230 ; 231 ; Set PATM_ INTERRUPTFLAG231 ; Set PATM_ASMFIX_INTERRUPTFLAG 232 232 ; 233 233 BEGIN_PATCH_CODE_SECTION 234 234 BEGINPROC PATMSetPIF 235 mov dword [ss:PATM_ INTERRUPTFLAG], 1235 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 236 236 ENDPROC PATMSetPIF 237 237 238 ; Patch record for setting PATM_ INTERRUPTFLAG238 ; Patch record for setting PATM_ASMFIX_INTERRUPTFLAG 239 239 BEGIN_PATCH_RODATA_SECTION 240 240 GLOBALNAME g_patmSetPIFRecord 241 241 PATCHASMRECORD_INIT PATMSetPIF, 1 242 DD PATM_ INTERRUPTFLAG, 0243 DD 0ffffffffh, 0ffffffffh 244 245 ; 246 ; Clear PATM_ INTERRUPTFLAG242 DD PATM_ASMFIX_INTERRUPTFLAG, 0 243 DD 0ffffffffh, 0ffffffffh 244 245 ; 246 ; Clear PATM_ASMFIX_INTERRUPTFLAG 247 247 ; 248 248 BEGIN_PATCH_CODE_SECTION … … 251 251 not dword [esp-64] 252 252 not dword [esp-64] 253 mov dword [ss:PATM_ INTERRUPTFLAG], 0253 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 254 254 ENDPROC PATMClearPIF 255 255 256 ; Patch record for clearing PATM_ INTERRUPTFLAG256 ; Patch record for clearing PATM_ASMFIX_INTERRUPTFLAG 257 257 BEGIN_PATCH_RODATA_SECTION 258 258 GLOBALNAME g_patmClearPIFRecord 259 259 PATCHASMRECORD_INIT PATMClearPIF, 1 260 DD PATM_ INTERRUPTFLAG, 0261 DD 0ffffffffh, 0ffffffffh 262 263 ; 264 ; Clear PATM_ INHIBITIRQADDR and fault if IF=0260 DD PATM_ASMFIX_INTERRUPTFLAG, 0 261 DD 0ffffffffh, 0ffffffffh 262 263 ; 264 ; Clear PATM_ASMFIX_INHIBITIRQADDR and fault if IF=0 265 265 ; 266 266 BEGIN_PATCH_CODE_SECTION 267 267 BEGINPROC PATMClearInhibitIRQFaultIF0 268 mov dword [ss:PATM_ INTERRUPTFLAG], 0269 mov dword [ss:PATM_ INHIBITIRQADDR], 0268 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 269 mov dword [ss:PATM_ASMFIX_INHIBITIRQADDR], 0 270 270 pushf 271 271 272 test dword [ss:PATM_ VMFLAGS], X86_EFL_IF272 test dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF 273 273 jz PATMClearInhibitIRQFaultIF0_Fault 274 274 275 275 ; if interrupts are pending, then we must go back to the host context to handle them! 276 test dword [ss:PATM_ VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST276 test dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST 277 277 jz PATMClearInhibitIRQFaultIF0_Continue 278 278 279 279 ; Go to our hypervisor trap handler to dispatch the pending irq 280 mov dword [ss:PATM_ TEMP_EAX], eax281 mov dword [ss:PATM_ TEMP_ECX], ecx282 mov dword [ss:PATM_ TEMP_EDI], edi283 mov dword [ss:PATM_ TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI280 mov dword [ss:PATM_ASMFIX_TEMP_EAX], eax 281 mov dword [ss:PATM_ASMFIX_TEMP_ECX], ecx 282 mov dword [ss:PATM_ASMFIX_TEMP_EDI], edi 283 mov dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI 284 284 mov eax, PATM_ACTION_DISPATCH_PENDING_IRQ 285 lock or dword [ss:PATM_ PENDINGACTION], eax286 mov ecx, PATM_ACTION_MAGIC 287 mov edi, PATM_ NEXTINSTRADDR285 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 286 mov ecx, PATM_ACTION_MAGIC 287 mov edi, PATM_ASMFIX_NEXTINSTRADDR 288 288 popfd ; restore flags we pushed above (the or instruction changes the flags as well) 289 289 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 292 292 PATMClearInhibitIRQFaultIF0_Fault: 293 293 popf 294 mov dword [ss:PATM_ INTERRUPTFLAG], 1294 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 295 295 PATM_INT3 296 296 297 297 PATMClearInhibitIRQFaultIF0_Continue: 298 298 popf 299 mov dword [ss:PATM_ INTERRUPTFLAG], 1299 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 300 300 ENDPROC PATMClearInhibitIRQFaultIF0 301 301 302 ; Patch record for clearing PATM_ INHIBITIRQADDR302 ; Patch record for clearing PATM_ASMFIX_INHIBITIRQADDR 303 303 BEGIN_PATCH_RODATA_SECTION 304 304 GLOBALNAME g_patmClearInhibitIRQFaultIF0Record 305 305 PATCHASMRECORD_INIT PATMClearInhibitIRQFaultIF0, 12 306 DD PATM_ INTERRUPTFLAG, 0307 DD PATM_ INHIBITIRQADDR, 0308 DD PATM_ VMFLAGS, 0309 DD PATM_ VM_FORCEDACTIONS, 0310 DD PATM_ TEMP_EAX, 0311 DD PATM_ TEMP_ECX, 0312 DD PATM_ TEMP_EDI, 0313 DD PATM_ TEMP_RESTORE_FLAGS, 0314 DD PATM_ PENDINGACTION, 0315 DD PATM_ NEXTINSTRADDR, 0316 DD PATM_ INTERRUPTFLAG, 0317 DD PATM_ INTERRUPTFLAG, 0318 DD 0ffffffffh, 0ffffffffh 319 320 321 ; 322 ; Clear PATM_ INHIBITIRQADDR and continue if IF=0 (duplicated function only; never jump back to guest code afterwards!!)306 DD PATM_ASMFIX_INTERRUPTFLAG, 0 307 DD PATM_ASMFIX_INHIBITIRQADDR, 0 308 DD PATM_ASMFIX_VMFLAGS, 0 309 DD PATM_ASMFIX_VM_FORCEDACTIONS, 0 310 DD PATM_ASMFIX_TEMP_EAX, 0 311 DD PATM_ASMFIX_TEMP_ECX, 0 312 DD PATM_ASMFIX_TEMP_EDI, 0 313 DD PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0 314 DD PATM_ASMFIX_PENDINGACTION, 0 315 DD PATM_ASMFIX_NEXTINSTRADDR, 0 316 DD PATM_ASMFIX_INTERRUPTFLAG, 0 317 DD PATM_ASMFIX_INTERRUPTFLAG, 0 318 DD 0ffffffffh, 0ffffffffh 319 320 321 ; 322 ; Clear PATM_ASMFIX_INHIBITIRQADDR and continue if IF=0 (duplicated function only; never jump back to guest code afterwards!!) 323 323 ; 324 324 BEGIN_PATCH_CODE_SECTION 325 325 BEGINPROC PATMClearInhibitIRQContIF0 326 mov dword [ss:PATM_ INTERRUPTFLAG], 0327 mov dword [ss:PATM_ INHIBITIRQADDR], 0326 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 327 mov dword [ss:PATM_ASMFIX_INHIBITIRQADDR], 0 328 328 pushf 329 329 330 test dword [ss:PATM_ VMFLAGS], X86_EFL_IF330 test dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF 331 331 jz PATMClearInhibitIRQContIF0_Continue 332 332 333 333 ; if interrupts are pending, then we must go back to the host context to handle them! 334 test dword [ss:PATM_ VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST334 test dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST 335 335 jz PATMClearInhibitIRQContIF0_Continue 336 336 337 337 ; Go to our hypervisor trap handler to dispatch the pending irq 338 mov dword [ss:PATM_ TEMP_EAX], eax339 mov dword [ss:PATM_ TEMP_ECX], ecx340 mov dword [ss:PATM_ TEMP_EDI], edi341 mov dword [ss:PATM_ TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI338 mov dword [ss:PATM_ASMFIX_TEMP_EAX], eax 339 mov dword [ss:PATM_ASMFIX_TEMP_ECX], ecx 340 mov dword [ss:PATM_ASMFIX_TEMP_EDI], edi 341 mov dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI 342 342 mov eax, PATM_ACTION_DISPATCH_PENDING_IRQ 343 lock or dword [ss:PATM_ PENDINGACTION], eax344 mov ecx, PATM_ACTION_MAGIC 345 mov edi, PATM_ NEXTINSTRADDR343 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 344 mov ecx, PATM_ACTION_MAGIC 345 mov edi, PATM_ASMFIX_NEXTINSTRADDR 346 346 popfd ; restore flags we pushed above (the or instruction changes the flags as well) 347 347 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 350 350 PATMClearInhibitIRQContIF0_Continue: 351 351 popf 352 mov dword [ss:PATM_ INTERRUPTFLAG], 1352 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 353 353 ENDPROC PATMClearInhibitIRQContIF0 354 354 355 ; Patch record for clearing PATM_ INHIBITIRQADDR355 ; Patch record for clearing PATM_ASMFIX_INHIBITIRQADDR 356 356 BEGIN_PATCH_RODATA_SECTION 357 357 GLOBALNAME g_patmClearInhibitIRQContIF0Record 358 358 PATCHASMRECORD_INIT PATMClearInhibitIRQContIF0, 11 359 DD PATM_ INTERRUPTFLAG, 0360 DD PATM_ INHIBITIRQADDR, 0361 DD PATM_ VMFLAGS, 0362 DD PATM_ VM_FORCEDACTIONS, 0363 DD PATM_ TEMP_EAX, 0364 DD PATM_ TEMP_ECX, 0365 DD PATM_ TEMP_EDI, 0366 DD PATM_ TEMP_RESTORE_FLAGS, 0367 DD PATM_ PENDINGACTION, 0368 DD PATM_ NEXTINSTRADDR, 0369 DD PATM_ INTERRUPTFLAG, 0359 DD PATM_ASMFIX_INTERRUPTFLAG, 0 360 DD PATM_ASMFIX_INHIBITIRQADDR, 0 361 DD PATM_ASMFIX_VMFLAGS, 0 362 DD PATM_ASMFIX_VM_FORCEDACTIONS, 0 363 DD PATM_ASMFIX_TEMP_EAX, 0 364 DD PATM_ASMFIX_TEMP_ECX, 0 365 DD PATM_ASMFIX_TEMP_EDI, 0 366 DD PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0 367 DD PATM_ASMFIX_PENDINGACTION, 0 368 DD PATM_ASMFIX_NEXTINSTRADDR, 0 369 DD PATM_ASMFIX_INTERRUPTFLAG, 0 370 370 DD 0ffffffffh, 0ffffffffh 371 371 … … 376 376 BEGIN_PATCH_CODE_SECTION 377 377 BEGINPROC PATMCliReplacement 378 mov dword [ss:PATM_ INTERRUPTFLAG], 0378 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 379 379 pushf 380 380 %ifdef PATM_LOG_PATCHINSTR … … 382 382 push ecx 383 383 mov eax, PATM_ACTION_LOG_CLI 384 lock or dword [ss:PATM_ PENDINGACTION], eax384 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 385 385 mov ecx, PATM_ACTION_MAGIC 386 386 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 389 389 %endif 390 390 391 and dword [ss:PATM_ VMFLAGS], ~X86_EFL_IF391 and dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IF 392 392 popf 393 393 394 mov dword [ss:PATM_ INTERRUPTFLAG], 1394 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 395 395 DB 0xE9 396 396 PATMCliJump: 397 DD PATM_ JUMPDELTA397 DD PATM_ASMFIX_JUMPDELTA 398 398 ENDPROC PATMCliReplacement 399 399 … … 406 406 PATCHASMRECORD_INIT_JUMP PATMCliReplacement, PATMCliJump, 3 407 407 %endif 408 DD PATM_ INTERRUPTFLAG, 0408 DD PATM_ASMFIX_INTERRUPTFLAG, 0 409 409 %ifdef PATM_LOG_PATCHINSTR 410 DD PATM_ PENDINGACTION, 0411 %endif 412 DD PATM_ VMFLAGS, 0413 DD PATM_ INTERRUPTFLAG, 0410 DD PATM_ASMFIX_PENDINGACTION, 0 411 %endif 412 DD PATM_ASMFIX_VMFLAGS, 0 413 DD PATM_ASMFIX_INTERRUPTFLAG, 0 414 414 DD 0ffffffffh, 0ffffffffh 415 415 … … 420 420 BEGIN_PATCH_CODE_SECTION 421 421 BEGINPROC PATMStiReplacement 422 mov dword [ss:PATM_ INTERRUPTFLAG], 0423 mov dword [ss:PATM_ INHIBITIRQADDR], PATM_NEXTINSTRADDR422 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 423 mov dword [ss:PATM_ASMFIX_INHIBITIRQADDR], PATM_ASMFIX_NEXTINSTRADDR 424 424 pushf 425 425 %ifdef PATM_LOG_PATCHINSTR … … 427 427 push ecx 428 428 mov eax, PATM_ACTION_LOG_STI 429 lock or dword [ss:PATM_ PENDINGACTION], eax429 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 430 430 mov ecx, PATM_ACTION_MAGIC 431 431 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 433 433 pop eax 434 434 %endif 435 or dword [ss:PATM_ VMFLAGS], X86_EFL_IF435 or dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF 436 436 popf 437 mov dword [ss:PATM_ INTERRUPTFLAG], 1437 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 438 438 ENDPROC PATMStiReplacement 439 439 … … 446 446 PATCHASMRECORD_INIT PATMStiReplacement, 5 447 447 %endif 448 DD PATM_ INTERRUPTFLAG, 0449 DD PATM_ INHIBITIRQADDR, 0450 DD PATM_ NEXTINSTRADDR, 0448 DD PATM_ASMFIX_INTERRUPTFLAG, 0 449 DD PATM_ASMFIX_INHIBITIRQADDR, 0 450 DD PATM_ASMFIX_NEXTINSTRADDR, 0 451 451 %ifdef PATM_LOG_PATCHINSTR 452 DD PATM_ PENDINGACTION, 0453 %endif 454 DD PATM_ VMFLAGS, 0455 DD PATM_ INTERRUPTFLAG, 0452 DD PATM_ASMFIX_PENDINGACTION, 0 453 %endif 454 DD PATM_ASMFIX_VMFLAGS, 0 455 DD PATM_ASMFIX_INTERRUPTFLAG, 0 456 456 DD 0ffffffffh, 0ffffffffh 457 457 … … 472 472 BEGIN_PATCH_CODE_SECTION 473 473 BEGINPROC PATMTrapEntry 474 mov dword [ss:PATM_ INTERRUPTFLAG], 0474 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 475 475 pushf 476 476 … … 481 481 lea edx, dword [ss:esp+12+4] ;3 dwords + pushed flags -> iret eip 482 482 mov eax, PATM_ACTION_LOG_GATE_ENTRY 483 lock or dword [ss:PATM_ PENDINGACTION], eax483 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 484 484 mov ecx, PATM_ACTION_MAGIC 485 485 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 502 502 ; correct EFLAGS on the stack to include the current IOPL 503 503 push eax 504 mov eax, dword [ss:PATM_ VMFLAGS]504 mov eax, dword [ss:PATM_ASMFIX_VMFLAGS] 505 505 and eax, X86_EFL_IOPL 506 506 and dword [esp+16], ~X86_EFL_IOPL ; esp+16 = eflags = esp+8+4(efl)+4(eax) … … 509 509 510 510 popf 511 mov dword [ss:PATM_ INTERRUPTFLAG], 1511 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 512 512 DB 0xE9 513 513 PATMTrapEntryJump: 514 DD PATM_ JUMPDELTA514 DD PATM_ASMFIX_JUMPDELTA 515 515 ENDPROC PATMTrapEntry 516 516 … … 523 523 PATCHASMRECORD_INIT_JUMP PATMTrapEntry, PATMTrapEntryJump, 3 524 524 %endif 525 DD PATM_ INTERRUPTFLAG, 0525 DD PATM_ASMFIX_INTERRUPTFLAG, 0 526 526 %ifdef PATM_LOG_PATCHIRET 527 DD PATM_ PENDINGACTION, 0528 %endif 529 DD PATM_ VMFLAGS, 0530 DD PATM_ INTERRUPTFLAG, 0527 DD PATM_ASMFIX_PENDINGACTION, 0 528 %endif 529 DD PATM_ASMFIX_VMFLAGS, 0 530 DD PATM_ASMFIX_INTERRUPTFLAG, 0 531 531 DD 0ffffffffh, 0ffffffffh 532 532 … … 549 549 BEGINPROC PATMTrapEntryErrorCode 550 550 PATMTrapErrorCodeEntryStart: 551 mov dword [ss:PATM_ INTERRUPTFLAG], 0551 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 552 552 pushf 553 553 … … 558 558 lea edx, dword [ss:esp+12+4+4] ;3 dwords + pushed flags + error code -> iret eip 559 559 mov eax, PATM_ACTION_LOG_GATE_ENTRY 560 lock or dword [ss:PATM_ PENDINGACTION], eax560 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 561 561 mov ecx, PATM_ACTION_MAGIC 562 562 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 579 579 ; correct EFLAGS on the stack to include the current IOPL 580 580 push eax 581 mov eax, dword [ss:PATM_ VMFLAGS]581 mov eax, dword [ss:PATM_ASMFIX_VMFLAGS] 582 582 and eax, X86_EFL_IOPL 583 583 and dword [esp+20], ~X86_EFL_IOPL ; esp+20 = eflags = esp+8+4(efl)+4(error code)+4(eax) … … 586 586 587 587 popf 588 mov dword [ss:PATM_ INTERRUPTFLAG], 1588 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 589 589 DB 0xE9 590 590 PATMTrapErrorCodeEntryJump: 591 DD PATM_ JUMPDELTA591 DD PATM_ASMFIX_JUMPDELTA 592 592 ENDPROC PATMTrapEntryErrorCode 593 593 … … 600 600 PATCHASMRECORD_INIT_JUMP PATMTrapEntryErrorCode, PATMTrapErrorCodeEntryJump, 3 601 601 %endif 602 DD PATM_ INTERRUPTFLAG, 0602 DD PATM_ASMFIX_INTERRUPTFLAG, 0 603 603 %ifdef PATM_LOG_PATCHIRET 604 DD PATM_ PENDINGACTION, 0605 %endif 606 DD PATM_ VMFLAGS, 0607 DD PATM_ INTERRUPTFLAG, 0604 DD PATM_ASMFIX_PENDINGACTION, 0 605 %endif 606 DD PATM_ASMFIX_VMFLAGS, 0 607 DD PATM_ASMFIX_INTERRUPTFLAG, 0 608 608 DD 0ffffffffh, 0ffffffffh 609 609 … … 624 624 BEGIN_PATCH_CODE_SECTION 625 625 BEGINPROC PATMIntEntry 626 mov dword [ss:PATM_ INTERRUPTFLAG], 0626 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 627 627 pushf 628 628 … … 633 633 lea edx, dword [ss:esp+12+4] ;3 dwords + pushed flags -> iret eip 634 634 mov eax, PATM_ACTION_LOG_GATE_ENTRY 635 lock or dword [ss:PATM_ PENDINGACTION], eax635 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 636 636 mov ecx, PATM_ACTION_MAGIC 637 637 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 654 654 ; correct EFLAGS on the stack to include the current IOPL 655 655 push eax 656 mov eax, dword [ss:PATM_ VMFLAGS]656 mov eax, dword [ss:PATM_ASMFIX_VMFLAGS] 657 657 and eax, X86_EFL_IOPL 658 658 and dword [esp+16], ~X86_EFL_IOPL ; esp+16 = eflags = esp+8+4(efl)+4(eax) … … 661 661 662 662 popf 663 mov dword [ss:PATM_ INTERRUPTFLAG], 1663 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 664 664 ENDPROC PATMIntEntry 665 665 … … 672 672 PATCHASMRECORD_INIT PATMIntEntry, 3 673 673 %endif 674 DD PATM_ INTERRUPTFLAG, 0674 DD PATM_ASMFIX_INTERRUPTFLAG, 0 675 675 %ifdef PATM_LOG_PATCHIRET 676 DD PATM_ PENDINGACTION, 0677 %endif 678 DD PATM_ VMFLAGS, 0679 DD PATM_ INTERRUPTFLAG, 0676 DD PATM_ASMFIX_PENDINGACTION, 0 677 %endif 678 DD PATM_ASMFIX_VMFLAGS, 0 679 DD PATM_ASMFIX_INTERRUPTFLAG, 0 680 680 DD 0ffffffffh, 0ffffffffh 681 681 … … 697 697 BEGIN_PATCH_CODE_SECTION 698 698 BEGINPROC PATMIntEntryErrorCode 699 mov dword [ss:PATM_ INTERRUPTFLAG], 0699 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 700 700 pushf 701 701 … … 706 706 lea edx, dword [ss:esp+12+4+4] ;3 dwords + pushed flags + error code -> iret eip 707 707 mov eax, PATM_ACTION_LOG_GATE_ENTRY 708 lock or dword [ss:PATM_ PENDINGACTION], eax708 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 709 709 mov ecx, PATM_ACTION_MAGIC 710 710 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 727 727 ; correct EFLAGS on the stack to include the current IOPL 728 728 push eax 729 mov eax, dword [ss:PATM_ VMFLAGS]729 mov eax, dword [ss:PATM_ASMFIX_VMFLAGS] 730 730 and eax, X86_EFL_IOPL 731 731 and dword [esp+20], ~X86_EFL_IOPL ; esp+20 = eflags = esp+8+4(efl)+4(eax)+4(error code) … … 734 734 735 735 popf 736 mov dword [ss:PATM_ INTERRUPTFLAG], 1736 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 737 737 ENDPROC PATMIntEntryErrorCode 738 738 … … 745 745 PATCHASMRECORD_INIT PATMIntEntryErrorCode, 3 746 746 %endif 747 DD PATM_ INTERRUPTFLAG, 0747 DD PATM_ASMFIX_INTERRUPTFLAG, 0 748 748 %ifdef PATM_LOG_PATCHIRET 749 DD PATM_ PENDINGACTION, 0750 %endif 751 DD PATM_ VMFLAGS, 0752 DD PATM_ INTERRUPTFLAG, 0749 DD PATM_ASMFIX_PENDINGACTION, 0 750 %endif 751 DD PATM_ASMFIX_VMFLAGS, 0 752 DD PATM_ASMFIX_INTERRUPTFLAG, 0 753 753 DD 0ffffffffh, 0ffffffffh 754 754 … … 759 759 BEGIN_PATCH_CODE_SECTION 760 760 BEGINPROC PATMPopf32Replacement 761 mov dword [ss:PATM_ INTERRUPTFLAG], 0761 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 762 762 %ifdef PATM_LOG_PATCHINSTR 763 763 push eax … … 769 769 770 770 PATMPopf32_Log: 771 lock or dword [ss:PATM_ PENDINGACTION], eax771 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 772 772 mov ecx, PATM_ACTION_MAGIC 773 773 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 778 778 test dword [esp], X86_EFL_IF 779 779 jnz PATMPopf32_Ok 780 mov dword [ss:PATM_ INTERRUPTFLAG], 1780 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 781 781 PATM_INT3 782 782 … … 785 785 ; In this particular patch it's rather unlikely the pushf was included, so we have no way to check if the flags on the stack were correctly synced 786 786 ; PATMPopf32Replacement_NoExit is different, because it's only used in IDT and function patches 787 or dword [ss:PATM_ VMFLAGS], X86_EFL_IF787 or dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF 788 788 789 789 ; if interrupts are pending, then we must go back to the host context to handle them! 790 test dword [ss:PATM_ VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST790 test dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST 791 791 jz PATMPopf32_Continue 792 792 793 793 ; Go to our hypervisor trap handler to dispatch the pending irq 794 mov dword [ss:PATM_ TEMP_EAX], eax795 mov dword [ss:PATM_ TEMP_ECX], ecx796 mov dword [ss:PATM_ TEMP_EDI], edi797 mov dword [ss:PATM_ TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI794 mov dword [ss:PATM_ASMFIX_TEMP_EAX], eax 795 mov dword [ss:PATM_ASMFIX_TEMP_ECX], ecx 796 mov dword [ss:PATM_ASMFIX_TEMP_EDI], edi 797 mov dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI 798 798 mov eax, PATM_ACTION_DISPATCH_PENDING_IRQ 799 lock or dword [ss:PATM_ PENDINGACTION], eax800 mov ecx, PATM_ACTION_MAGIC 801 mov edi, PATM_ NEXTINSTRADDR799 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 800 mov ecx, PATM_ACTION_MAGIC 801 mov edi, PATM_ASMFIX_NEXTINSTRADDR 802 802 803 803 popfd ; restore flags we pushed above (the or instruction changes the flags as well) … … 807 807 PATMPopf32_Continue: 808 808 popfd ; restore flags we pushed above 809 mov dword [ss:PATM_ INTERRUPTFLAG], 1809 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 810 810 DB 0xE9 811 811 PATMPopf32Jump: 812 DD PATM_ JUMPDELTA812 DD PATM_ASMFIX_JUMPDELTA 813 813 ENDPROC PATMPopf32Replacement 814 814 … … 821 821 PATCHASMRECORD_INIT_JUMP PATMPopf32Replacement, PATMPopf32Jump, 11 822 822 %endif 823 DD PATM_ INTERRUPTFLAG, 0823 DD PATM_ASMFIX_INTERRUPTFLAG, 0 824 824 %ifdef PATM_LOG_PATCHINSTR 825 DD PATM_ PENDINGACTION, 0826 %endif 827 DD PATM_ INTERRUPTFLAG, 0828 DD PATM_ VMFLAGS, 0829 DD PATM_ VM_FORCEDACTIONS, 0830 DD PATM_ TEMP_EAX, 0831 DD PATM_ TEMP_ECX, 0832 DD PATM_ TEMP_EDI, 0833 DD PATM_ TEMP_RESTORE_FLAGS, 0834 DD PATM_ PENDINGACTION, 0835 DD PATM_ NEXTINSTRADDR, 0836 DD PATM_ INTERRUPTFLAG, 0825 DD PATM_ASMFIX_PENDINGACTION, 0 826 %endif 827 DD PATM_ASMFIX_INTERRUPTFLAG, 0 828 DD PATM_ASMFIX_VMFLAGS, 0 829 DD PATM_ASMFIX_VM_FORCEDACTIONS, 0 830 DD PATM_ASMFIX_TEMP_EAX, 0 831 DD PATM_ASMFIX_TEMP_ECX, 0 832 DD PATM_ASMFIX_TEMP_EDI, 0 833 DD PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0 834 DD PATM_ASMFIX_PENDINGACTION, 0 835 DD PATM_ASMFIX_NEXTINSTRADDR, 0 836 DD PATM_ASMFIX_INTERRUPTFLAG, 0 837 837 DD 0ffffffffh, 0ffffffffh 838 838 … … 843 843 BEGIN_PATCH_CODE_SECTION 844 844 BEGINPROC PATMPopf32Replacement_NoExit 845 mov dword [ss:PATM_ INTERRUPTFLAG], 0845 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 846 846 %ifdef PATM_LOG_PATCHINSTR 847 847 push eax … … 853 853 854 854 PATMPopf32_NoExitLog: 855 lock or dword [ss:PATM_ PENDINGACTION], eax855 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 856 856 mov ecx, PATM_ACTION_MAGIC 857 857 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 863 863 864 864 ; if interrupts are pending, then we must go back to the host context to handle them! 865 test dword [ss:PATM_ VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST865 test dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST 866 866 jz PATMPopf32_NoExit_Continue 867 867 868 868 ; Go to our hypervisor trap handler to dispatch the pending irq 869 mov dword [ss:PATM_ TEMP_EAX], eax870 mov dword [ss:PATM_ TEMP_ECX], ecx871 mov dword [ss:PATM_ TEMP_EDI], edi872 mov dword [ss:PATM_ TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI869 mov dword [ss:PATM_ASMFIX_TEMP_EAX], eax 870 mov dword [ss:PATM_ASMFIX_TEMP_ECX], ecx 871 mov dword [ss:PATM_ASMFIX_TEMP_EDI], edi 872 mov dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI 873 873 mov eax, PATM_ACTION_DISPATCH_PENDING_IRQ 874 lock or dword [ss:PATM_ PENDINGACTION], eax875 mov ecx, PATM_ACTION_MAGIC 876 mov edi, PATM_ NEXTINSTRADDR877 878 pop dword [ss:PATM_ VMFLAGS] ; restore flags now (the or instruction changes the flags as well)879 push dword [ss:PATM_ VMFLAGS]874 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 875 mov ecx, PATM_ACTION_MAGIC 876 mov edi, PATM_ASMFIX_NEXTINSTRADDR 877 878 pop dword [ss:PATM_ASMFIX_VMFLAGS] ; restore flags now (the or instruction changes the flags as well) 879 push dword [ss:PATM_ASMFIX_VMFLAGS] 880 880 popfd 881 881 … … 884 884 885 885 PATMPopf32_NoExit_Continue: 886 pop dword [ss:PATM_ VMFLAGS]887 push dword [ss:PATM_ VMFLAGS]888 popfd 889 mov dword [ss:PATM_ INTERRUPTFLAG], 1886 pop dword [ss:PATM_ASMFIX_VMFLAGS] 887 push dword [ss:PATM_ASMFIX_VMFLAGS] 888 popfd 889 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 890 890 ENDPROC PATMPopf32Replacement_NoExit 891 891 … … 898 898 PATCHASMRECORD_INIT PATMPopf32Replacement_NoExit, 13 899 899 %endif 900 DD PATM_ INTERRUPTFLAG, 0900 DD PATM_ASMFIX_INTERRUPTFLAG, 0 901 901 %ifdef PATM_LOG_PATCHINSTR 902 DD PATM_ PENDINGACTION, 0903 %endif 904 DD PATM_ VM_FORCEDACTIONS, 0905 DD PATM_ TEMP_EAX, 0906 DD PATM_ TEMP_ECX, 0907 DD PATM_ TEMP_EDI, 0908 DD PATM_ TEMP_RESTORE_FLAGS, 0909 DD PATM_ PENDINGACTION, 0910 DD PATM_ NEXTINSTRADDR, 0911 DD PATM_ VMFLAGS, 0912 DD PATM_ VMFLAGS, 0913 DD PATM_ VMFLAGS, 0914 DD PATM_ VMFLAGS, 0915 DD PATM_ INTERRUPTFLAG, 0902 DD PATM_ASMFIX_PENDINGACTION, 0 903 %endif 904 DD PATM_ASMFIX_VM_FORCEDACTIONS, 0 905 DD PATM_ASMFIX_TEMP_EAX, 0 906 DD PATM_ASMFIX_TEMP_ECX, 0 907 DD PATM_ASMFIX_TEMP_EDI, 0 908 DD PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0 909 DD PATM_ASMFIX_PENDINGACTION, 0 910 DD PATM_ASMFIX_NEXTINSTRADDR, 0 911 DD PATM_ASMFIX_VMFLAGS, 0 912 DD PATM_ASMFIX_VMFLAGS, 0 913 DD PATM_ASMFIX_VMFLAGS, 0 914 DD PATM_ASMFIX_VMFLAGS, 0 915 DD PATM_ASMFIX_INTERRUPTFLAG, 0 916 916 DD 0ffffffffh, 0ffffffffh 917 917 … … 922 922 BEGIN_PATCH_CODE_SECTION 923 923 BEGINPROC PATMPopf16Replacement 924 mov dword [ss:PATM_ INTERRUPTFLAG], 0924 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 925 925 test word [esp], X86_EFL_IF 926 926 jnz PATMPopf16_Ok 927 mov dword [ss:PATM_ INTERRUPTFLAG], 1927 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 928 928 PATM_INT3 929 929 … … 931 931 ; if interrupts are pending, then we must go back to the host context to handle them! 932 932 ; @note we destroy the flags here, but that should really not matter (PATM_INT3 case) 933 test dword [ss:PATM_ VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST933 test dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST 934 934 jz PATMPopf16_Continue 935 mov dword [ss:PATM_ INTERRUPTFLAG], 1935 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 936 936 PATM_INT3 937 937 938 938 PATMPopf16_Continue: 939 939 940 pop word [ss:PATM_ VMFLAGS]941 push word [ss:PATM_ VMFLAGS]942 and dword [ss:PATM_ VMFLAGS], PATM_VIRTUAL_FLAGS_MASK943 or dword [ss:PATM_ VMFLAGS], PATM_VIRTUAL_FLAGS_MASK940 pop word [ss:PATM_ASMFIX_VMFLAGS] 941 push word [ss:PATM_ASMFIX_VMFLAGS] 942 and dword [ss:PATM_ASMFIX_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK 943 or dword [ss:PATM_ASMFIX_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK 944 944 945 945 DB 0x66 ; size override 946 946 popf ;after the and and or operations!! (flags must be preserved) 947 mov dword [ss:PATM_ INTERRUPTFLAG], 1947 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 948 948 949 949 DB 0xE9 950 950 PATMPopf16Jump: 951 DD PATM_ JUMPDELTA951 DD PATM_ASMFIX_JUMPDELTA 952 952 ENDPROC PATMPopf16Replacement 953 953 … … 956 956 GLOBALNAME g_patmPopf16Record 957 957 PATCHASMRECORD_INIT_JUMP PATMPopf16Replacement, PATMPopf16Jump, 9 958 DD PATM_ INTERRUPTFLAG, 0959 DD PATM_ INTERRUPTFLAG, 0960 DD PATM_ VM_FORCEDACTIONS, 0961 DD PATM_ INTERRUPTFLAG, 0962 DD PATM_ VMFLAGS, 0963 DD PATM_ VMFLAGS, 0964 DD PATM_ VMFLAGS, 0965 DD PATM_ VMFLAGS, 0966 DD PATM_ INTERRUPTFLAG, 0958 DD PATM_ASMFIX_INTERRUPTFLAG, 0 959 DD PATM_ASMFIX_INTERRUPTFLAG, 0 960 DD PATM_ASMFIX_VM_FORCEDACTIONS, 0 961 DD PATM_ASMFIX_INTERRUPTFLAG, 0 962 DD PATM_ASMFIX_VMFLAGS, 0 963 DD PATM_ASMFIX_VMFLAGS, 0 964 DD PATM_ASMFIX_VMFLAGS, 0 965 DD PATM_ASMFIX_VMFLAGS, 0 966 DD PATM_ASMFIX_INTERRUPTFLAG, 0 967 967 DD 0ffffffffh, 0ffffffffh 968 968 … … 974 974 BEGIN_PATCH_CODE_SECTION 975 975 BEGINPROC PATMPopf16Replacement_NoExit 976 mov dword [ss:PATM_ INTERRUPTFLAG], 0976 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 977 977 test word [esp], X86_EFL_IF 978 978 jnz PATMPopf16_Ok_NoExit 979 mov dword [ss:PATM_ INTERRUPTFLAG], 1979 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 980 980 PATM_INT3 981 981 … … 983 983 ; if interrupts are pending, then we must go back to the host context to handle them! 984 984 ; @note we destroy the flags here, but that should really not matter (PATM_INT3 case) 985 test dword [ss:PATM_ VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST985 test dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_TIMER | VMCPU_FF_REQUEST 986 986 jz PATMPopf16_Continue_NoExit 987 mov dword [ss:PATM_ INTERRUPTFLAG], 1987 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 988 988 PATM_INT3 989 989 990 990 PATMPopf16_Continue_NoExit: 991 991 992 pop word [ss:PATM_ VMFLAGS]993 push word [ss:PATM_ VMFLAGS]994 and dword [ss:PATM_ VMFLAGS], PATM_VIRTUAL_FLAGS_MASK995 or dword [ss:PATM_ VMFLAGS], PATM_VIRTUAL_FLAGS_MASK992 pop word [ss:PATM_ASMFIX_VMFLAGS] 993 push word [ss:PATM_ASMFIX_VMFLAGS] 994 and dword [ss:PATM_ASMFIX_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK 995 or dword [ss:PATM_ASMFIX_VMFLAGS], PATM_VIRTUAL_FLAGS_MASK 996 996 997 997 DB 0x66 ; size override 998 998 popf ;after the and and or operations!! (flags must be preserved) 999 mov dword [ss:PATM_ INTERRUPTFLAG], 1999 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1000 1000 ENDPROC PATMPopf16Replacement_NoExit 1001 1001 … … 1004 1004 GLOBALNAME g_patmPopf16Record_NoExit 1005 1005 PATCHASMRECORD_INIT PATMPopf16Replacement_NoExit, 9 1006 DD PATM_ INTERRUPTFLAG, 01007 DD PATM_ INTERRUPTFLAG, 01008 DD PATM_ VM_FORCEDACTIONS, 01009 DD PATM_ INTERRUPTFLAG, 01010 DD PATM_ VMFLAGS, 01011 DD PATM_ VMFLAGS, 01012 DD PATM_ VMFLAGS, 01013 DD PATM_ VMFLAGS, 01014 DD PATM_ INTERRUPTFLAG, 01006 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1007 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1008 DD PATM_ASMFIX_VM_FORCEDACTIONS, 0 1009 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1010 DD PATM_ASMFIX_VMFLAGS, 0 1011 DD PATM_ASMFIX_VMFLAGS, 0 1012 DD PATM_ASMFIX_VMFLAGS, 0 1013 DD PATM_ASMFIX_VMFLAGS, 0 1014 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1015 1015 DD 0ffffffffh, 0ffffffffh 1016 1016 … … 1021 1021 BEGIN_PATCH_CODE_SECTION 1022 1022 BEGINPROC PATMPushf32Replacement 1023 mov dword [ss:PATM_ INTERRUPTFLAG], 01023 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1024 1024 pushfd 1025 1025 %ifdef PATM_LOG_PATCHINSTR … … 1027 1027 push ecx 1028 1028 mov eax, PATM_ACTION_LOG_PUSHF 1029 lock or dword [ss:PATM_ PENDINGACTION], eax1029 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 1030 1030 mov ecx, PATM_ACTION_MAGIC 1031 1031 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 1038 1038 mov eax, dword [esp+8] 1039 1039 and eax, PATM_FLAGS_MASK 1040 or eax, dword [ss:PATM_ VMFLAGS]1040 or eax, dword [ss:PATM_ASMFIX_VMFLAGS] 1041 1041 mov dword [esp+8], eax 1042 1042 pop eax 1043 1043 popfd 1044 mov dword [ss:PATM_ INTERRUPTFLAG], 11044 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1045 1045 ENDPROC PATMPushf32Replacement 1046 1046 … … 1053 1053 PATCHASMRECORD_INIT PATMPushf32Replacement, 3 1054 1054 %endif 1055 DD PATM_ INTERRUPTFLAG, 01055 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1056 1056 %ifdef PATM_LOG_PATCHINSTR 1057 DD PATM_ PENDINGACTION, 01058 %endif 1059 DD PATM_ VMFLAGS, 01060 DD PATM_ INTERRUPTFLAG, 01057 DD PATM_ASMFIX_PENDINGACTION, 0 1058 %endif 1059 DD PATM_ASMFIX_VMFLAGS, 0 1060 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1061 1061 DD 0ffffffffh, 0ffffffffh 1062 1062 … … 1067 1067 BEGIN_PATCH_CODE_SECTION 1068 1068 BEGINPROC PATMPushf16Replacement 1069 mov dword [ss:PATM_ INTERRUPTFLAG], 01069 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1070 1070 DB 0x66 ; size override 1071 1071 pushf … … 1076 1076 mov ax, word [esp+6] 1077 1077 and eax, PATM_FLAGS_MASK 1078 or eax, dword [ss:PATM_ VMFLAGS]1078 or eax, dword [ss:PATM_ASMFIX_VMFLAGS] 1079 1079 mov word [esp+6], ax 1080 1080 pop eax … … 1082 1082 DB 0x66 ; size override 1083 1083 popf 1084 mov dword [ss:PATM_ INTERRUPTFLAG], 11084 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1085 1085 ENDPROC PATMPushf16Replacement 1086 1086 … … 1089 1089 GLOBALNAME g_patmPushf16Record 1090 1090 PATCHASMRECORD_INIT PATMPushf16Replacement, 3 1091 DD PATM_ INTERRUPTFLAG, 01092 DD PATM_ VMFLAGS, 01093 DD PATM_ INTERRUPTFLAG, 01091 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1092 DD PATM_ASMFIX_VMFLAGS, 0 1093 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1094 1094 DD 0ffffffffh, 0ffffffffh 1095 1095 … … 1100 1100 BEGIN_PATCH_CODE_SECTION 1101 1101 BEGINPROC PATMPushCSReplacement 1102 mov dword [ss:PATM_ INTERRUPTFLAG], 01102 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1103 1103 push cs 1104 1104 pushfd … … 1113 1113 popfd 1114 1114 1115 mov dword [ss:PATM_ INTERRUPTFLAG], 11115 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1116 1116 DB 0xE9 1117 1117 PATMPushCSJump: 1118 DD PATM_ JUMPDELTA1118 DD PATM_ASMFIX_JUMPDELTA 1119 1119 ENDPROC PATMPushCSReplacement 1120 1120 … … 1123 1123 GLOBALNAME g_patmPushCSRecord 1124 1124 PATCHASMRECORD_INIT_JUMP PATMPushCSReplacement, PATMPushCSJump, 2 1125 DD PATM_ INTERRUPTFLAG, 01126 DD PATM_ INTERRUPTFLAG, 01125 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1126 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1127 1127 DD 0ffffffffh, 0ffffffffh 1128 1128 … … 1163 1163 BEGIN_PATCH_CODE_SECTION 1164 1164 BEGINPROC PATMIretReplacement 1165 mov dword [ss:PATM_ INTERRUPTFLAG], 01165 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1166 1166 pushfd 1167 1167 … … 1172 1172 lea edx, dword [ss:esp+12+4] ;3 dwords + pushed flags -> iret eip 1173 1173 mov eax, PATM_ACTION_LOG_IRET 1174 lock or dword [ss:PATM_ PENDINGACTION], eax1174 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 1175 1175 mov ecx, PATM_ACTION_MAGIC 1176 1176 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 1204 1204 ; Note: This is very important as pending pic interrupts can be overridden by apic interrupts if we don't check early enough (Fedora 5 boot) 1205 1205 ; @@todo fix this properly, so we can dispatch pending interrupts in GC 1206 test dword [ss:PATM_ VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC1206 test dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC 1207 1207 jz iret_continue 1208 1208 1209 1209 ; Go to our hypervisor trap handler to dispatch the pending irq 1210 mov dword [ss:PATM_ TEMP_EAX], eax1211 mov dword [ss:PATM_ TEMP_ECX], ecx1212 mov dword [ss:PATM_ TEMP_EDI], edi1213 mov dword [ss:PATM_ TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI1210 mov dword [ss:PATM_ASMFIX_TEMP_EAX], eax 1211 mov dword [ss:PATM_ASMFIX_TEMP_ECX], ecx 1212 mov dword [ss:PATM_ASMFIX_TEMP_EDI], edi 1213 mov dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI 1214 1214 mov eax, PATM_ACTION_PENDING_IRQ_AFTER_IRET 1215 lock or dword [ss:PATM_ PENDINGACTION], eax1216 mov ecx, PATM_ACTION_MAGIC 1217 mov edi, PATM_ CURINSTRADDR1215 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 1216 mov ecx, PATM_ACTION_MAGIC 1217 mov edi, PATM_ASMFIX_CURINSTRADDR 1218 1218 1219 1219 popfd … … 1229 1229 mov eax, dword [esp+16] 1230 1230 and eax, X86_EFL_IOPL 1231 and dword [ss:PATM_ VMFLAGS], ~X86_EFL_IOPL1232 or dword [ss:PATM_ VMFLAGS], eax1231 and dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IOPL 1232 or dword [ss:PATM_ASMFIX_VMFLAGS], eax 1233 1233 pop eax 1234 1234 and dword [esp+12], ~X86_EFL_IOPL 1235 1235 1236 1236 ; Set IF again; below we make sure this won't cause problems. 1237 or dword [ss:PATM_ VMFLAGS], X86_EFL_IF1237 or dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF 1238 1238 1239 1239 ; make sure iret is executed fully (including the iret below; cli ... iret can otherwise be interrupted) 1240 mov dword [ss:PATM_ INHIBITIRQADDR], PATM_CURINSTRADDR1241 1242 popfd 1243 mov dword [ss:PATM_ INTERRUPTFLAG], 11240 mov dword [ss:PATM_ASMFIX_INHIBITIRQADDR], PATM_ASMFIX_CURINSTRADDR 1241 1242 popfd 1243 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1244 1244 iretd 1245 1245 PATM_INT3 … … 1247 1247 iret_fault: 1248 1248 popfd 1249 mov dword [ss:PATM_ INTERRUPTFLAG], 11249 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1250 1250 PATM_INT3 1251 1251 … … 1253 1253 nop 1254 1254 popfd 1255 mov dword [ss:PATM_ INTERRUPTFLAG], 11255 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1256 1256 PATM_INT3 1257 1257 … … 1260 1260 pushfd 1261 1261 push eax 1262 push PATM_ FIXUP1262 push PATM_ASMFIX_FIXUP 1263 1263 DB 0E8h ; call 1264 DD PATM_ IRET_FUNCTION1264 DD PATM_ASMFIX_IRET_FUNCTION 1265 1265 add esp, 4 ; pushed address of jump table 1266 1266 … … 1282 1282 mov eax, dword [esp+16] 1283 1283 and eax, X86_EFL_IOPL 1284 and dword [ss:PATM_ VMFLAGS], ~X86_EFL_IOPL1285 or dword [ss:PATM_ VMFLAGS], eax1284 and dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IOPL 1285 or dword [ss:PATM_ASMFIX_VMFLAGS], eax 1286 1286 pop eax 1287 1287 and dword [esp+12], ~X86_EFL_IOPL 1288 1288 1289 1289 ; Clear IF 1290 and dword [ss:PATM_ VMFLAGS], ~X86_EFL_IF1291 popfd 1292 1293 ; the patched destination code will set PATM_ INTERRUPTFLAG after the return!1290 and dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IF 1291 popfd 1292 1293 ; the patched destination code will set PATM_ASMFIX_INTERRUPTFLAG after the return! 1294 1294 iretd 1295 1295 … … 1299 1299 1300 1300 ; Go to our hypervisor trap handler to perform the iret to v86 code 1301 mov dword [ss:PATM_ TEMP_EAX], eax1302 mov dword [ss:PATM_ TEMP_ECX], ecx1303 mov dword [ss:PATM_ TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX1301 mov dword [ss:PATM_ASMFIX_TEMP_EAX], eax 1302 mov dword [ss:PATM_ASMFIX_TEMP_ECX], ecx 1303 mov dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX 1304 1304 mov eax, PATM_ACTION_DO_V86_IRET 1305 lock or dword [ss:PATM_ PENDINGACTION], eax1305 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 1306 1306 mov ecx, PATM_ACTION_MAGIC 1307 1307 … … 1335 1335 PATCHASMRECORD_INIT PATMIretReplacement, 25 1336 1336 %endif 1337 DD PATM_ INTERRUPTFLAG, 01337 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1338 1338 %ifdef PATM_LOG_PATCHIRET 1339 DD PATM_ PENDINGACTION, 01340 %endif 1341 DD PATM_ VM_FORCEDACTIONS, 01342 DD PATM_ TEMP_EAX, 01343 DD PATM_ TEMP_ECX, 01344 DD PATM_ TEMP_EDI, 01345 DD PATM_ TEMP_RESTORE_FLAGS, 01346 DD PATM_ PENDINGACTION, 01347 DD PATM_ CURINSTRADDR, 01348 DD PATM_ VMFLAGS, 01349 DD PATM_ VMFLAGS, 01350 DD PATM_ VMFLAGS, 01351 DD PATM_ INHIBITIRQADDR, 01352 DD PATM_ CURINSTRADDR, 01353 DD PATM_ INTERRUPTFLAG, 01354 DD PATM_ INTERRUPTFLAG, 01355 DD PATM_ INTERRUPTFLAG, 01356 DD PATM_ FIXUP, PATMIretTable - NAME(PATMIretReplacement)1357 DD PATM_ IRET_FUNCTION, 01358 DD PATM_ VMFLAGS, 01359 DD PATM_ VMFLAGS, 01360 DD PATM_ VMFLAGS, 01361 DD PATM_ TEMP_EAX, 01362 DD PATM_ TEMP_ECX, 01363 DD PATM_ TEMP_RESTORE_FLAGS, 01364 DD PATM_ PENDINGACTION, 01339 DD PATM_ASMFIX_PENDINGACTION, 0 1340 %endif 1341 DD PATM_ASMFIX_VM_FORCEDACTIONS, 0 1342 DD PATM_ASMFIX_TEMP_EAX, 0 1343 DD PATM_ASMFIX_TEMP_ECX, 0 1344 DD PATM_ASMFIX_TEMP_EDI, 0 1345 DD PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0 1346 DD PATM_ASMFIX_PENDINGACTION, 0 1347 DD PATM_ASMFIX_CURINSTRADDR, 0 1348 DD PATM_ASMFIX_VMFLAGS, 0 1349 DD PATM_ASMFIX_VMFLAGS, 0 1350 DD PATM_ASMFIX_VMFLAGS, 0 1351 DD PATM_ASMFIX_INHIBITIRQADDR, 0 1352 DD PATM_ASMFIX_CURINSTRADDR, 0 1353 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1354 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1355 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1356 DD PATM_ASMFIX_FIXUP, PATMIretTable - NAME(PATMIretReplacement) 1357 DD PATM_ASMFIX_IRET_FUNCTION, 0 1358 DD PATM_ASMFIX_VMFLAGS, 0 1359 DD PATM_ASMFIX_VMFLAGS, 0 1360 DD PATM_ASMFIX_VMFLAGS, 0 1361 DD PATM_ASMFIX_TEMP_EAX, 0 1362 DD PATM_ASMFIX_TEMP_ECX, 0 1363 DD PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0 1364 DD PATM_ASMFIX_PENDINGACTION, 0 1365 1365 DD 0ffffffffh, 0ffffffffh 1366 1366 … … 1401 1401 BEGIN_PATCH_CODE_SECTION 1402 1402 BEGINPROC PATMIretRing1Replacement 1403 mov dword [ss:PATM_ INTERRUPTFLAG], 01403 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1404 1404 pushfd 1405 1405 … … 1410 1410 lea edx, dword [ss:esp+12+4] ;3 dwords + pushed flags -> iret eip 1411 1411 mov eax, PATM_ACTION_LOG_IRET 1412 lock or dword [ss:PATM_ PENDINGACTION], eax1412 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 1413 1413 mov ecx, PATM_ACTION_MAGIC 1414 1414 db 0fh, 0bh ; illegal instr (hardcoded assumption in PATMHandleIllegalInstrTrap) … … 1440 1440 ; Note: This is very important as pending pic interrupts can be overridden by apic interrupts if we don't check early enough (Fedora 5 boot) 1441 1441 ; @@todo fix this properly, so we can dispatch pending interrupts in GC 1442 test dword [ss:PATM_ VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC1442 test dword [ss:PATM_ASMFIX_VM_FORCEDACTIONS], VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC 1443 1443 jz iretring1_continue 1444 1444 1445 1445 ; Go to our hypervisor trap handler to dispatch the pending irq 1446 mov dword [ss:PATM_ TEMP_EAX], eax1447 mov dword [ss:PATM_ TEMP_ECX], ecx1448 mov dword [ss:PATM_ TEMP_EDI], edi1449 mov dword [ss:PATM_ TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI1446 mov dword [ss:PATM_ASMFIX_TEMP_EAX], eax 1447 mov dword [ss:PATM_ASMFIX_TEMP_ECX], ecx 1448 mov dword [ss:PATM_ASMFIX_TEMP_EDI], edi 1449 mov dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX | PATM_RESTORE_EDI 1450 1450 mov eax, PATM_ACTION_PENDING_IRQ_AFTER_IRET 1451 lock or dword [ss:PATM_ PENDINGACTION], eax1452 mov ecx, PATM_ACTION_MAGIC 1453 mov edi, PATM_ CURINSTRADDR1451 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 1452 mov ecx, PATM_ACTION_MAGIC 1453 mov edi, PATM_ASMFIX_CURINSTRADDR 1454 1454 1455 1455 popfd … … 1485 1485 mov eax, dword [esp+16] 1486 1486 and eax, X86_EFL_IOPL 1487 and dword [ss:PATM_ VMFLAGS], ~X86_EFL_IOPL1488 or dword [ss:PATM_ VMFLAGS], eax1487 and dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IOPL 1488 or dword [ss:PATM_ASMFIX_VMFLAGS], eax 1489 1489 pop eax 1490 1490 and dword [esp+12], ~X86_EFL_IOPL 1491 1491 1492 1492 ; Set IF again; below we make sure this won't cause problems. 1493 or dword [ss:PATM_ VMFLAGS], X86_EFL_IF1493 or dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF 1494 1494 1495 1495 ; make sure iret is executed fully (including the iret below; cli ... iret can otherwise be interrupted) 1496 mov dword [ss:PATM_ INHIBITIRQADDR], PATM_CURINSTRADDR1497 1498 popfd 1499 mov dword [ss:PATM_ INTERRUPTFLAG], 11496 mov dword [ss:PATM_ASMFIX_INHIBITIRQADDR], PATM_ASMFIX_CURINSTRADDR 1497 1498 popfd 1499 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1500 1500 iretd 1501 1501 PATM_INT3 … … 1503 1503 iretring1_fault: 1504 1504 popfd 1505 mov dword [ss:PATM_ INTERRUPTFLAG], 11505 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1506 1506 PATM_INT3 1507 1507 … … 1509 1509 nop 1510 1510 popfd 1511 mov dword [ss:PATM_ INTERRUPTFLAG], 11511 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1512 1512 PATM_INT3 1513 1513 … … 1516 1516 pushfd 1517 1517 push eax 1518 push PATM_ FIXUP1518 push PATM_ASMFIX_FIXUP 1519 1519 DB 0E8h ; call 1520 DD PATM_ IRET_FUNCTION1520 DD PATM_ASMFIX_IRET_FUNCTION 1521 1521 add esp, 4 ; pushed address of jump table 1522 1522 … … 1535 1535 mov eax, dword [esp+16] 1536 1536 and eax, X86_EFL_IOPL 1537 and dword [ss:PATM_ VMFLAGS], ~X86_EFL_IOPL1538 or dword [ss:PATM_ VMFLAGS], eax1537 and dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IOPL 1538 or dword [ss:PATM_ASMFIX_VMFLAGS], eax 1539 1539 pop eax 1540 1540 and dword [esp+12], ~X86_EFL_IOPL 1541 1541 1542 1542 ; Clear IF 1543 and dword [ss:PATM_ VMFLAGS], ~X86_EFL_IF1543 and dword [ss:PATM_ASMFIX_VMFLAGS], ~X86_EFL_IF 1544 1544 popfd 1545 1545 … … 1553 1553 and dword [esp+20], ~1 ; SS 1554 1554 or dword [esp+20], 2 1555 ; the patched destination code will set PATM_ INTERRUPTFLAG after the return!1555 ; the patched destination code will set PATM_ASMFIX_INTERRUPTFLAG after the return! 1556 1556 iretd 1557 1557 … … 1559 1559 ; force ring 1 CS RPL 1560 1560 or dword [esp+8], 1 1561 ; the patched destination code will set PATM_ INTERRUPTFLAG after the return!1561 ; the patched destination code will set PATM_ASMFIX_INTERRUPTFLAG after the return! 1562 1562 iretd 1563 1563 … … 1567 1567 1568 1568 ; Go to our hypervisor trap handler to perform the iret to v86 code 1569 mov dword [ss:PATM_ TEMP_EAX], eax1570 mov dword [ss:PATM_ TEMP_ECX], ecx1571 mov dword [ss:PATM_ TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX1569 mov dword [ss:PATM_ASMFIX_TEMP_EAX], eax 1570 mov dword [ss:PATM_ASMFIX_TEMP_ECX], ecx 1571 mov dword [ss:PATM_ASMFIX_TEMP_RESTORE_FLAGS], PATM_RESTORE_EAX | PATM_RESTORE_ECX 1572 1572 mov eax, PATM_ACTION_DO_V86_IRET 1573 lock or dword [ss:PATM_ PENDINGACTION], eax1573 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], eax 1574 1574 mov ecx, PATM_ACTION_MAGIC 1575 1575 … … 1603 1603 PATCHASMRECORD_INIT PATMIretRing1Replacement, 25 1604 1604 %endif 1605 DD PATM_ INTERRUPTFLAG, 01605 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1606 1606 %ifdef PATM_LOG_PATCHIRET 1607 DD PATM_ PENDINGACTION, 01607 DD PATM_ASMFIX_PENDINGACTION, 0 1608 1608 %endif 1609 DD PATM_ VM_FORCEDACTIONS, 01610 DD PATM_ TEMP_EAX, 01611 DD PATM_ TEMP_ECX, 01612 DD PATM_ TEMP_EDI, 01613 DD PATM_ TEMP_RESTORE_FLAGS, 01614 DD PATM_ PENDINGACTION, 01615 DD PATM_ CURINSTRADDR, 01616 DD PATM_ VMFLAGS, 01617 DD PATM_ VMFLAGS, 01618 DD PATM_ VMFLAGS, 01619 DD PATM_ INHIBITIRQADDR, 01620 DD PATM_ CURINSTRADDR, 01621 DD PATM_ INTERRUPTFLAG, 01622 DD PATM_ INTERRUPTFLAG, 01623 DD PATM_ INTERRUPTFLAG, 01624 DD PATM_ FIXUP, PATMIretRing1Table - NAME(PATMIretRing1Replacement)1625 DD PATM_ IRET_FUNCTION, 01626 DD PATM_ VMFLAGS, 01627 DD PATM_ VMFLAGS, 01628 DD PATM_ VMFLAGS, 01629 DD PATM_ TEMP_EAX, 01630 DD PATM_ TEMP_ECX, 01631 DD PATM_ TEMP_RESTORE_FLAGS, 01632 DD PATM_ PENDINGACTION, 01609 DD PATM_ASMFIX_VM_FORCEDACTIONS, 0 1610 DD PATM_ASMFIX_TEMP_EAX, 0 1611 DD PATM_ASMFIX_TEMP_ECX, 0 1612 DD PATM_ASMFIX_TEMP_EDI, 0 1613 DD PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0 1614 DD PATM_ASMFIX_PENDINGACTION, 0 1615 DD PATM_ASMFIX_CURINSTRADDR, 0 1616 DD PATM_ASMFIX_VMFLAGS, 0 1617 DD PATM_ASMFIX_VMFLAGS, 0 1618 DD PATM_ASMFIX_VMFLAGS, 0 1619 DD PATM_ASMFIX_INHIBITIRQADDR, 0 1620 DD PATM_ASMFIX_CURINSTRADDR, 0 1621 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1622 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1623 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1624 DD PATM_ASMFIX_FIXUP, PATMIretRing1Table - NAME(PATMIretRing1Replacement) 1625 DD PATM_ASMFIX_IRET_FUNCTION, 0 1626 DD PATM_ASMFIX_VMFLAGS, 0 1627 DD PATM_ASMFIX_VMFLAGS, 0 1628 DD PATM_ASMFIX_VMFLAGS, 0 1629 DD PATM_ASMFIX_TEMP_EAX, 0 1630 DD PATM_ASMFIX_TEMP_ECX, 0 1631 DD PATM_ASMFIX_TEMP_RESTORE_FLAGS, 0 1632 DD PATM_ASMFIX_PENDINGACTION, 0 1633 1633 DD 0ffffffffh, 0ffffffffh 1634 1634 … … 1644 1644 ;( + 0 return address ) 1645 1645 ; 1646 ; @note assumes PATM_ INTERRUPTFLAG is zero1646 ; @note assumes PATM_ASMFIX_INTERRUPTFLAG is zero 1647 1647 ; @note assumes it can trash eax and eflags 1648 1648 ; … … 1680 1680 ; 2) Query return patch address from the hypervisor 1681 1681 ; @todo private ugly interface, since we have nothing generic at the moment 1682 lock or dword [ss:PATM_ PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS1682 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS 1683 1683 mov eax, PATM_ACTION_LOOKUP_ADDRESS 1684 1684 mov ecx, PATM_ACTION_MAGIC … … 1696 1696 jz PATMIretFunction_Failure 1697 1697 1698 add eax, PATM_ PATCHBASE1698 add eax, PATM_ASMFIX_PATCHBASE 1699 1699 1700 1700 pop edi … … 1715 1715 GLOBALNAME g_patmIretFunctionRecord 1716 1716 PATCHASMRECORD_INIT PATMIretFunction, 2 1717 DD PATM_ PENDINGACTION, 01718 DD PATM_ PATCHBASE, 01717 DD PATM_ASMFIX_PENDINGACTION, 0 1718 DD PATM_ASMFIX_PATCHBASE, 0 1719 1719 DD 0ffffffffh, 0ffffffffh 1720 1720 … … 1732 1732 not dword [esp-32] 1733 1733 1734 mov dword [ss:PATM_ INTERRUPTFLAG], 01735 PATCH_FIXUP PATM_ INTERRUPTFLAG1734 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1735 PATCH_FIXUP PATM_ASMFIX_INTERRUPTFLAG 1736 1736 pushf 1737 1737 … … 1741 1741 1742 1742 popf 1743 mov dword [ss:PATM_ INTERRUPTFLAG], 11744 PATCH_FIXUP PATM_ INTERRUPTFLAG1743 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1744 PATCH_FIXUP PATM_ASMFIX_INTERRUPTFLAG 1745 1745 END_PATCH g_patmCpuidRecord, PATMCpuidReplacement 1746 1746 … … 1751 1751 BEGIN_PATCH_CODE_SECTION 1752 1752 BEGINPROC PATMJEcxReplacement 1753 mov dword [ss:PATM_ INTERRUPTFLAG], 01753 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1754 1754 pushfd 1755 1755 PATMJEcxSizeOverride: … … 1759 1759 1760 1760 popfd 1761 mov dword [ss:PATM_ INTERRUPTFLAG], 11761 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1762 1762 DB 0xE9 1763 1763 PATMJEcxJump: 1764 DD PATM_ JUMPDELTA1764 DD PATM_ASMFIX_JUMPDELTA 1765 1765 1766 1766 PATMJEcxContinue: 1767 1767 popfd 1768 mov dword [ss:PATM_ INTERRUPTFLAG], 11768 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1769 1769 ENDPROC PATMJEcxReplacement 1770 1770 … … 1773 1773 GLOBALNAME g_patmJEcxRecord 1774 1774 PATCHASMRECORD_INIT_EX PATMJEcxReplacement, , PATMJEcxJump, PATMJEcxSizeOverride, 3 1775 DD PATM_ INTERRUPTFLAG, 01776 DD PATM_ INTERRUPTFLAG, 01777 DD PATM_ INTERRUPTFLAG, 01775 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1776 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1777 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1778 1778 DD 0ffffffffh, 0ffffffffh 1779 1779 … … 1784 1784 BEGIN_PATCH_CODE_SECTION 1785 1785 BEGINPROC PATMLoopReplacement 1786 mov dword [ss:PATM_ INTERRUPTFLAG], 01786 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1787 1787 pushfd 1788 1788 PATMLoopSizeOverride: … … 1792 1792 1793 1793 popfd 1794 mov dword [ss:PATM_ INTERRUPTFLAG], 11794 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1795 1795 DB 0xE9 1796 1796 PATMLoopJump: 1797 DD PATM_ JUMPDELTA1797 DD PATM_ASMFIX_JUMPDELTA 1798 1798 1799 1799 PATMLoopContinue: 1800 1800 popfd 1801 mov dword [ss:PATM_ INTERRUPTFLAG], 11801 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1802 1802 ENDPROC PATMLoopReplacement 1803 1803 … … 1806 1806 GLOBALNAME g_patmLoopRecord 1807 1807 PATCHASMRECORD_INIT_EX PATMLoopReplacement, , PATMLoopJump, PATMLoopSizeOverride, 3 1808 DD PATM_ INTERRUPTFLAG, 01809 DD PATM_ INTERRUPTFLAG, 01810 DD PATM_ INTERRUPTFLAG, 01808 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1809 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1810 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1811 1811 DD 0ffffffffh, 0ffffffffh 1812 1812 … … 1817 1817 BEGIN_PATCH_CODE_SECTION 1818 1818 BEGINPROC PATMLoopZReplacement 1819 mov dword [ss:PATM_ INTERRUPTFLAG], 01819 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1820 1820 jnz NAME(PATMLoopZReplacement_EndProc) 1821 1821 pushfd … … 1826 1826 1827 1827 popfd 1828 mov dword [ss:PATM_ INTERRUPTFLAG], 11828 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1829 1829 DB 0xE9 1830 1830 PATMLoopZJump: 1831 DD PATM_ JUMPDELTA1831 DD PATM_ASMFIX_JUMPDELTA 1832 1832 1833 1833 PATMLoopZContinue: 1834 1834 popfd 1835 mov dword [ss:PATM_ INTERRUPTFLAG], 11835 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1836 1836 ENDPROC PATMLoopZReplacement 1837 1837 … … 1840 1840 GLOBALNAME g_patmLoopZRecord 1841 1841 PATCHASMRECORD_INIT_EX PATMLoopZReplacement, , PATMLoopZJump, PATMLoopZSizeOverride, 3 1842 DD PATM_ INTERRUPTFLAG, 01843 DD PATM_ INTERRUPTFLAG, 01844 DD PATM_ INTERRUPTFLAG, 01842 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1843 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1844 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1845 1845 DD 0ffffffffh, 0ffffffffh 1846 1846 … … 1851 1851 BEGIN_PATCH_CODE_SECTION 1852 1852 BEGINPROC PATMLoopNZReplacement 1853 mov dword [ss:PATM_ INTERRUPTFLAG], 01853 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 1854 1854 jz NAME(PATMLoopNZReplacement_EndProc) 1855 1855 pushfd … … 1860 1860 1861 1861 popfd 1862 mov dword [ss:PATM_ INTERRUPTFLAG], 11862 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1863 1863 DB 0xE9 1864 1864 PATMLoopNZJump: 1865 DD PATM_ JUMPDELTA1865 DD PATM_ASMFIX_JUMPDELTA 1866 1866 1867 1867 PATMLoopNZContinue: 1868 1868 popfd 1869 mov dword [ss:PATM_ INTERRUPTFLAG], 11869 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 1870 1870 ENDPROC PATMLoopNZReplacement 1871 1871 … … 1874 1874 GLOBALNAME g_patmLoopNZRecord 1875 1875 PATCHASMRECORD_INIT_EX PATMLoopNZReplacement, , PATMLoopNZJump, PATMLoopNZSizeOverride, 3 1876 DD PATM_ INTERRUPTFLAG, 01877 DD PATM_ INTERRUPTFLAG, 01878 DD PATM_ INTERRUPTFLAG, 01876 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1877 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1878 DD PATM_ASMFIX_INTERRUPTFLAG, 0 1879 1879 DD 0ffffffffh, 0ffffffffh 1880 1880 … … 1882 1882 ; 1883 1883 ; Global patch function for indirect calls 1884 ; Caller is responsible for clearing PATM_ INTERRUPTFLAG and doing:1884 ; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and doing: 1885 1885 ; + 20 push [pTargetGC] 1886 1886 ; + 16 pushfd … … 1900 1900 1901 1901 mov eax, dword [esp+16+4] ; guest return address 1902 mov dword [ss:PATM_ CALL_RETURN_ADDR], eax ; temporary storage1902 mov dword [ss:PATM_ASMFIX_CALL_RETURN_ADDR], eax ; temporary storage 1903 1903 1904 1904 mov edx, dword [esp+16+20] ; pushed target address … … 1920 1920 ; nothing found -> let our trap handler try to find it 1921 1921 ; @todo private ugly interface, since we have nothing generic at the moment 1922 lock or dword [ss:PATM_ PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS1922 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS 1923 1923 mov eax, PATM_ACTION_LOOKUP_ADDRESS 1924 1924 mov ecx, PATM_ACTION_MAGIC … … 1947 1947 1948 1948 mov ecx, eax ; ECX = target address (relative!) 1949 add ecx, PATM_ PATCHBASE ; Make it absolute1950 1951 mov edx, dword PATM_ STACKPTR1949 add ecx, PATM_ASMFIX_PATCHBASE ; Make it absolute 1950 1951 mov edx, dword PATM_ASMFIX_STACKPTR 1952 1952 cmp dword [ss:edx], PATM_STACK_SIZE 1953 1953 ja near PATMLookupAndCall_Failure ; should never happen actually!!! … … 1957 1957 ; save the patch return address on our private stack 1958 1958 sub dword [ss:edx], 4 ; sizeof(RTGCPTR) 1959 mov eax, dword PATM_ STACKBASE1959 mov eax, dword PATM_ASMFIX_STACKBASE 1960 1960 add eax, dword [ss:edx] ; stack base + stack position 1961 1961 mov edi, dword [esp+16+8] ; PATM return address … … 1963 1963 1964 1964 ; save the original return address as well (checked by ret to make sure the guest hasn't messed around with the stack) 1965 mov edi, dword PATM_ STACKBASE_GUEST1965 mov edi, dword PATM_ASMFIX_STACKBASE_GUEST 1966 1966 add edi, dword [ss:edx] ; stack base (guest) + stack position 1967 1967 mov eax, dword [esp+16+4] ; guest return address 1968 1968 mov dword [ss:edi], eax 1969 1969 1970 mov dword [ss:PATM_ CALL_PATCH_TARGET_ADDR], ecx ; temporarily store the target address1970 mov dword [ss:PATM_ASMFIX_CALL_PATCH_TARGET_ADDR], ecx ; temporarily store the target address 1971 1971 pop ecx 1972 1972 pop edi … … 1980 1980 push edx 1981 1981 lea edx, [esp + 12 - 4] ; stack address to store return address 1982 lock or dword [ss:PATM_ PENDINGACTION], PATM_ACTION_LOG_CALL1982 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOG_CALL 1983 1983 mov eax, PATM_ACTION_LOG_CALL 1984 1984 mov ecx, PATM_ACTION_MAGIC … … 1989 1989 %endif 1990 1990 1991 push dword [ss:PATM_ CALL_RETURN_ADDR] ; push original guest return address1992 1993 ; the called function will set PATM_ INTERRUPTFLAG (!!)1994 jmp dword [ss:PATM_ CALL_PATCH_TARGET_ADDR]1991 push dword [ss:PATM_ASMFIX_CALL_RETURN_ADDR] ; push original guest return address 1992 1993 ; the called function will set PATM_ASMFIX_INTERRUPTFLAG (!!) 1994 jmp dword [ss:PATM_ASMFIX_CALL_PATCH_TARGET_ADDR] 1995 1995 ; returning here -> do not add code here or after the jmp!!!!! 1996 1996 ENDPROC PATMLookupAndCall … … 2004 2004 PATCHASMRECORD_INIT PATMLookupAndCall, 9 2005 2005 %endif 2006 DD PATM_ CALL_RETURN_ADDR, 02007 DD PATM_ PENDINGACTION, 02008 DD PATM_ PATCHBASE, 02009 DD PATM_ STACKPTR, 02010 DD PATM_ STACKBASE, 02011 DD PATM_ STACKBASE_GUEST, 02012 DD PATM_ CALL_PATCH_TARGET_ADDR, 02006 DD PATM_ASMFIX_CALL_RETURN_ADDR, 0 2007 DD PATM_ASMFIX_PENDINGACTION, 0 2008 DD PATM_ASMFIX_PATCHBASE, 0 2009 DD PATM_ASMFIX_STACKPTR, 0 2010 DD PATM_ASMFIX_STACKBASE, 0 2011 DD PATM_ASMFIX_STACKBASE_GUEST, 0 2012 DD PATM_ASMFIX_CALL_PATCH_TARGET_ADDR, 0 2013 2013 %ifdef PATM_LOG_PATCHINSTR 2014 DD PATM_ PENDINGACTION, 02014 DD PATM_ASMFIX_PENDINGACTION, 0 2015 2015 %endif 2016 DD PATM_ CALL_RETURN_ADDR, 02017 DD PATM_ CALL_PATCH_TARGET_ADDR, 02016 DD PATM_ASMFIX_CALL_RETURN_ADDR, 0 2017 DD PATM_ASMFIX_CALL_PATCH_TARGET_ADDR, 0 2018 2018 DD 0ffffffffh, 0ffffffffh 2019 2019 … … 2021 2021 ; 2022 2022 ; Global patch function for indirect jumps 2023 ; Caller is responsible for clearing PATM_ INTERRUPTFLAG and doing:2023 ; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and doing: 2024 2024 ; + 8 push [pTargetGC] 2025 2025 ; + 4 push [JumpTableAddress] 2026 2026 ;( + 0 return address ) 2027 ; And saving eflags in PATM_ TEMP_EFLAGS2027 ; And saving eflags in PATM_ASMFIX_TEMP_EFLAGS 2028 2028 ; 2029 2029 ; @note NEVER change this without bumping the SSM version … … 2054 2054 ; nothing found -> let our trap handler try to find it 2055 2055 ; @todo private ugly interface, since we have nothing generic at the moment 2056 lock or dword [ss:PATM_ PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS2056 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS 2057 2057 mov eax, PATM_ACTION_LOOKUP_ADDRESS 2058 2058 mov ecx, PATM_ACTION_MAGIC … … 2081 2081 2082 2082 mov ecx, eax ; ECX = target address (relative!) 2083 add ecx, PATM_ PATCHBASE ; Make it absolute2083 add ecx, PATM_ASMFIX_PATCHBASE ; Make it absolute 2084 2084 2085 2085 ; save jump patch target 2086 mov dword [ss:PATM_ TEMP_EAX], ecx2086 mov dword [ss:PATM_ASMFIX_TEMP_EAX], ecx 2087 2087 pop ecx 2088 2088 pop edi … … 2091 2091 add esp, 12 ; parameters + return address pushed by caller 2092 2092 ; restore flags (just to be sure) 2093 push dword [ss:PATM_ TEMP_EFLAGS]2094 popfd 2095 2096 ; the jump destination will set PATM_ INTERRUPTFLAG (!!)2097 jmp dword [ss:PATM_ TEMP_EAX] ; call duplicated patch destination address2093 push dword [ss:PATM_ASMFIX_TEMP_EFLAGS] 2094 popfd 2095 2096 ; the jump destination will set PATM_ASMFIX_INTERRUPTFLAG (!!) 2097 jmp dword [ss:PATM_ASMFIX_TEMP_EAX] ; call duplicated patch destination address 2098 2098 ENDPROC PATMLookupAndJump 2099 2099 … … 2102 2102 GLOBALNAME g_patmLookupAndJumpRecord 2103 2103 PATCHASMRECORD_INIT PATMLookupAndJump, 5 2104 DD PATM_ PENDINGACTION, 02105 DD PATM_ PATCHBASE, 02106 DD PATM_ TEMP_EAX, 02107 DD PATM_ TEMP_EFLAGS, 02108 DD PATM_ TEMP_EAX, 02104 DD PATM_ASMFIX_PENDINGACTION, 0 2105 DD PATM_ASMFIX_PATCHBASE, 0 2106 DD PATM_ASMFIX_TEMP_EAX, 0 2107 DD PATM_ASMFIX_TEMP_EFLAGS, 0 2108 DD PATM_ASMFIX_TEMP_EAX, 0 2109 2109 DD 0ffffffffh, 0ffffffffh 2110 2110 … … 2112 2112 ; Patch function for static calls 2113 2113 ; @note static calls have only one lookup slot! 2114 ; Caller is responsible for clearing PATM_ INTERRUPTFLAG and adding:2114 ; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and adding: 2115 2115 ; push [pTargetGC] 2116 2116 ; … … 2118 2118 BEGINPROC PATMCall 2119 2119 pushfd 2120 push PATM_ FIXUP ; fixup for jump table below2121 push PATM_ PATCHNEXTBLOCK2122 push PATM_ RETURNADDR2120 push PATM_ASMFIX_FIXUP ; fixup for jump table below 2121 push PATM_ASMFIX_PATCHNEXTBLOCK 2122 push PATM_ASMFIX_RETURNADDR 2123 2123 DB 0E8h ; call 2124 DD PATM_ LOOKUP_AND_CALL_FUNCTION2124 DD PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION 2125 2125 ; we only return in case of a failure 2126 2126 add esp, 12 ; pushed address of jump table 2127 2127 popfd 2128 2128 add esp, 4 ; pushed by caller (changes the flags, but that shouldn't matter (@todo)) 2129 mov dword [ss:PATM_ INTERRUPTFLAG], 12129 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 2130 2130 PATM_INT3 2131 2131 %ifdef DEBUG … … 2148 2148 GLOBALNAME g_patmCallRecord 2149 2149 PATCHASMRECORD_INIT PATMCall, 5 2150 DD PATM_ FIXUP, PATMCallTable - NAME(PATMCall)2151 DD PATM_ PATCHNEXTBLOCK, 02152 DD PATM_ RETURNADDR, 02153 DD PATM_ LOOKUP_AND_CALL_FUNCTION, 02154 DD PATM_ INTERRUPTFLAG, 02150 DD PATM_ASMFIX_FIXUP, PATMCallTable - NAME(PATMCall) 2151 DD PATM_ASMFIX_PATCHNEXTBLOCK, 0 2152 DD PATM_ASMFIX_RETURNADDR, 0 2153 DD PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION, 0 2154 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2155 2155 DD 0ffffffffh, 0ffffffffh 2156 2156 2157 2157 2158 2158 ; Patch function for indirect calls 2159 ; Caller is responsible for clearing PATM_ INTERRUPTFLAG and adding:2159 ; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and adding: 2160 2160 ; push [pTargetGC] 2161 2161 ; … … 2163 2163 BEGINPROC PATMCallIndirect 2164 2164 pushfd 2165 push PATM_ FIXUP ; fixup for jump table below2166 push PATM_ PATCHNEXTBLOCK2167 push PATM_ RETURNADDR2165 push PATM_ASMFIX_FIXUP ; fixup for jump table below 2166 push PATM_ASMFIX_PATCHNEXTBLOCK 2167 push PATM_ASMFIX_RETURNADDR 2168 2168 DB 0E8h ; call 2169 DD PATM_ LOOKUP_AND_CALL_FUNCTION2169 DD PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION 2170 2170 ; we only return in case of a failure 2171 2171 add esp, 12 ; pushed address of jump table 2172 2172 popfd 2173 2173 add esp, 4 ; pushed by caller (changes the flags, but that shouldn't matter (@todo)) 2174 mov dword [ss:PATM_ INTERRUPTFLAG], 12174 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 2175 2175 PATM_INT3 2176 2176 %ifdef DEBUG … … 2193 2193 GLOBALNAME g_patmCallIndirectRecord 2194 2194 PATCHASMRECORD_INIT PATMCallIndirect, 5 2195 DD PATM_ FIXUP, PATMCallIndirectTable - NAME(PATMCallIndirect)2196 DD PATM_ PATCHNEXTBLOCK, 02197 DD PATM_ RETURNADDR, 02198 DD PATM_ LOOKUP_AND_CALL_FUNCTION, 02199 DD PATM_ INTERRUPTFLAG, 02195 DD PATM_ASMFIX_FIXUP, PATMCallIndirectTable - NAME(PATMCallIndirect) 2196 DD PATM_ASMFIX_PATCHNEXTBLOCK, 0 2197 DD PATM_ASMFIX_RETURNADDR, 0 2198 DD PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION, 0 2199 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2200 2200 DD 0ffffffffh, 0ffffffffh 2201 2201 … … 2203 2203 ; 2204 2204 ; Patch function for indirect jumps 2205 ; Caller is responsible for clearing PATM_ INTERRUPTFLAG and adding:2205 ; Caller is responsible for clearing PATM_ASMFIX_INTERRUPTFLAG and adding: 2206 2206 ; push [pTargetGC] 2207 2207 ; … … 2210 2210 ; save flags (just to be sure) 2211 2211 pushfd 2212 pop dword [ss:PATM_ TEMP_EFLAGS]2213 2214 push PATM_ FIXUP ; fixup for jump table below2212 pop dword [ss:PATM_ASMFIX_TEMP_EFLAGS] 2213 2214 push PATM_ASMFIX_FIXUP ; fixup for jump table below 2215 2215 DB 0E8h ; call 2216 DD PATM_ LOOKUP_AND_JUMP_FUNCTION2216 DD PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION 2217 2217 ; we only return in case of a failure 2218 2218 add esp, 8 ; pushed address of jump table + pushed target address 2219 2219 2220 2220 ; restore flags (just to be sure) 2221 push dword [ss:PATM_ TEMP_EFLAGS]2222 popfd 2223 2224 mov dword [ss:PATM_ INTERRUPTFLAG], 12221 push dword [ss:PATM_ASMFIX_TEMP_EFLAGS] 2222 popfd 2223 2224 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 2225 2225 PATM_INT3 2226 2226 … … 2244 2244 GLOBALNAME g_patmJumpIndirectRecord 2245 2245 PATCHASMRECORD_INIT PATMJumpIndirect, 5 2246 DD PATM_ TEMP_EFLAGS, 02247 DD PATM_ FIXUP, PATMJumpIndirectTable - NAME(PATMJumpIndirect)2248 DD PATM_ LOOKUP_AND_JUMP_FUNCTION, 02249 DD PATM_ TEMP_EFLAGS, 02250 DD PATM_ INTERRUPTFLAG, 02246 DD PATM_ASMFIX_TEMP_EFLAGS, 0 2247 DD PATM_ASMFIX_FIXUP, PATMJumpIndirectTable - NAME(PATMJumpIndirect) 2248 DD PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION, 0 2249 DD PATM_ASMFIX_TEMP_EFLAGS, 0 2250 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2251 2251 DD 0ffffffffh, 0ffffffffh 2252 2252 … … 2260 2260 not dword [esp-32] 2261 2261 not dword [esp-32] 2262 mov dword [ss:PATM_ INTERRUPTFLAG], 02262 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 2263 2263 pushfd 2264 2264 push eax 2265 push PATM_ FIXUP2265 push PATM_ASMFIX_FIXUP 2266 2266 DB 0E8h ; call 2267 DD PATM_ RETURN_FUNCTION2267 DD PATM_ASMFIX_RETURN_FUNCTION 2268 2268 add esp, 4 ; pushed address of jump table 2269 2269 … … 2273 2273 pop eax 2274 2274 popfd 2275 mov dword [ss:PATM_ INTERRUPTFLAG], 12275 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 2276 2276 PATM_INT3 2277 2277 … … 2292 2292 popf 2293 2293 ; caller will duplicate the ret or ret n instruction 2294 ; the patched call will set PATM_ INTERRUPTFLAG after the return!2294 ; the patched call will set PATM_ASMFIX_INTERRUPTFLAG after the return! 2295 2295 ENDPROC PATMRet 2296 2296 … … 2298 2298 GLOBALNAME g_patmRetRecord 2299 2299 PATCHASMRECORD_INIT PATMRet, 4 2300 DD PATM_ INTERRUPTFLAG, 02301 DD PATM_ FIXUP, PATMRetTable - NAME(PATMRet)2302 DD PATM_ RETURN_FUNCTION, 02303 DD PATM_ INTERRUPTFLAG, 02300 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2301 DD PATM_ASMFIX_FIXUP, PATMRetTable - NAME(PATMRet) 2302 DD PATM_ASMFIX_RETURN_FUNCTION, 0 2303 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2304 2304 DD 0ffffffffh, 0ffffffffh 2305 2305 … … 2315 2315 ;( + 0 return address ) 2316 2316 ; 2317 ; @note assumes PATM_ INTERRUPTFLAG is zero2317 ; @note assumes PATM_ASMFIX_INTERRUPTFLAG is zero 2318 2318 ; @note assumes it can trash eax and eflags 2319 2319 ; … … 2337 2337 2338 2338 ; 1) Check if the return patch address was pushed on the PATM stack 2339 cmp dword [ss:PATM_ STACKPTR], PATM_STACK_SIZE2339 cmp dword [ss:PATM_ASMFIX_STACKPTR], PATM_STACK_SIZE 2340 2340 jae near PATMRetFunction_FindReturnAddress 2341 2341 2342 mov edx, dword PATM_ STACKPTR2342 mov edx, dword PATM_ASMFIX_STACKPTR 2343 2343 2344 2344 ; check if the return address is what we expect it to be 2345 mov eax, dword PATM_ STACKBASE_GUEST2345 mov eax, dword PATM_ASMFIX_STACKBASE_GUEST 2346 2346 add eax, dword [ss:edx] ; stack base + stack position 2347 2347 mov eax, dword [ss:eax] ; original return address … … 2353 2353 2354 2354 ; found it, convert relative to absolute patch address and return the result to the caller 2355 mov eax, dword PATM_ STACKBASE2355 mov eax, dword PATM_ASMFIX_STACKBASE 2356 2356 add eax, dword [ss:edx] ; stack base + stack position 2357 2357 mov eax, dword [ss:eax] ; relative patm return address 2358 add eax, PATM_ PATCHBASE2358 add eax, PATM_ASMFIX_PATCHBASE 2359 2359 2360 2360 %ifdef PATM_LOG_PATCHINSTR … … 2365 2365 mov edx, eax ; return address 2366 2366 lea ebx, [esp+16+12+16] ; stack address containing the return address 2367 lock or dword [ss:PATM_ PENDINGACTION], PATM_ACTION_LOG_RET2367 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOG_RET 2368 2368 mov eax, PATM_ACTION_LOG_RET 2369 2369 mov ecx, PATM_ACTION_MAGIC … … 2402 2402 ; 3) Query return patch address from the hypervisor 2403 2403 ; @todo private ugly interface, since we have nothing generic at the moment 2404 lock or dword [ss:PATM_ PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS2404 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOOKUP_ADDRESS 2405 2405 mov eax, PATM_ACTION_LOOKUP_ADDRESS 2406 2406 mov ecx, PATM_ACTION_MAGIC … … 2418 2418 jz PATMRetFunction_Failure 2419 2419 2420 add eax, PATM_ PATCHBASE2420 add eax, PATM_ASMFIX_PATCHBASE 2421 2421 2422 2422 %ifdef PATM_LOG_PATCHINSTR … … 2427 2427 mov edx, eax ; return address 2428 2428 lea ebx, [esp+16+12+16] ; stack address containing the return address 2429 lock or dword [ss:PATM_ PENDINGACTION], PATM_ACTION_LOG_RET2429 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOG_RET 2430 2430 mov eax, PATM_ACTION_LOG_RET 2431 2431 mov ecx, PATM_ACTION_MAGIC … … 2458 2458 PATCHASMRECORD_INIT PATMRetFunction, 7 2459 2459 %endif 2460 DD PATM_ STACKPTR, 02461 DD PATM_ STACKPTR, 02462 DD PATM_ STACKBASE_GUEST, 02463 DD PATM_ STACKBASE, 02464 DD PATM_ PATCHBASE, 02460 DD PATM_ASMFIX_STACKPTR, 0 2461 DD PATM_ASMFIX_STACKPTR, 0 2462 DD PATM_ASMFIX_STACKBASE_GUEST, 0 2463 DD PATM_ASMFIX_STACKBASE, 0 2464 DD PATM_ASMFIX_PATCHBASE, 0 2465 2465 %ifdef PATM_LOG_PATCHINSTR 2466 DD PATM_ PENDINGACTION, 02466 DD PATM_ASMFIX_PENDINGACTION, 0 2467 2467 %endif 2468 DD PATM_ PENDINGACTION, 02469 DD PATM_ PATCHBASE, 02468 DD PATM_ASMFIX_PENDINGACTION, 0 2469 DD PATM_ASMFIX_PATCHBASE, 0 2470 2470 %ifdef PATM_LOG_PATCHINSTR 2471 DD PATM_ PENDINGACTION, 02471 DD PATM_ASMFIX_PENDINGACTION, 0 2472 2472 %endif 2473 2473 DD 0ffffffffh, 0ffffffffh … … 2479 2479 BEGIN_PATCH_CODE_SECTION 2480 2480 BEGINPROC PATMCheckIF 2481 mov dword [ss:PATM_ INTERRUPTFLAG], 02481 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 2482 2482 pushf 2483 test dword [ss:PATM_ VMFLAGS], X86_EFL_IF2483 test dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF 2484 2484 jnz PATMCheckIF_Safe 2485 2485 nop … … 2487 2487 ; IF=0 -> unsafe, so we must call the duplicated function (which we don't do here) 2488 2488 popf 2489 mov dword [ss:PATM_ INTERRUPTFLAG], 12489 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 2490 2490 jmp NAME(PATMCheckIF_EndProc) 2491 2491 2492 2492 PATMCheckIF_Safe: 2493 2493 ; invalidate the PATM stack as we'll jump back to guest code 2494 mov dword [ss:PATM_ STACKPTR], PATM_STACK_SIZE2494 mov dword [ss:PATM_ASMFIX_STACKPTR], PATM_STACK_SIZE 2495 2495 2496 2496 %ifdef PATM_LOG_PATCHINSTR 2497 2497 push eax 2498 2498 push ecx 2499 lock or dword [ss:PATM_ PENDINGACTION], PATM_ACTION_LOG_IF12499 lock or dword [ss:PATM_ASMFIX_PENDINGACTION], PATM_ACTION_LOG_IF1 2500 2500 mov eax, PATM_ACTION_LOG_IF1 2501 2501 mov ecx, PATM_ACTION_MAGIC … … 2505 2505 %endif 2506 2506 popf 2507 mov dword [ss:PATM_ INTERRUPTFLAG], 12507 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 2508 2508 ; IF=1 -> we can safely jump back to the original instruction 2509 2509 DB 0xE9 2510 2510 PATMCheckIF_Jump: 2511 DD PATM_ JUMPDELTA2511 DD PATM_ASMFIX_JUMPDELTA 2512 2512 ENDPROC PATMCheckIF 2513 2513 … … 2520 2520 PATCHASMRECORD_INIT_JUMP PATMCheckIF, PATMCheckIF_Jump, 5 2521 2521 %endif 2522 DD PATM_ INTERRUPTFLAG, 02523 DD PATM_ VMFLAGS, 02524 DD PATM_ INTERRUPTFLAG, 02525 DD PATM_ STACKPTR, 02522 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2523 DD PATM_ASMFIX_VMFLAGS, 0 2524 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2525 DD PATM_ASMFIX_STACKPTR, 0 2526 2526 %ifdef PATM_LOG_PATCHINSTR 2527 DD PATM_ PENDINGACTION, 02527 DD PATM_ASMFIX_PENDINGACTION, 0 2528 2528 %endif 2529 DD PATM_ INTERRUPTFLAG, 02529 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2530 2530 DD 0ffffffffh, 0ffffffffh 2531 2531 … … 2536 2536 BEGIN_PATCH_CODE_SECTION 2537 2537 BEGINPROC PATMJumpToGuest_IF1 2538 mov dword [ss:PATM_ INTERRUPTFLAG], 02538 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 0 2539 2539 pushf 2540 test dword [ss:PATM_ VMFLAGS], X86_EFL_IF2540 test dword [ss:PATM_ASMFIX_VMFLAGS], X86_EFL_IF 2541 2541 jnz PATMJumpToGuest_IF1_Safe 2542 2542 nop … … 2544 2544 ; IF=0 -> unsafe, so fault 2545 2545 popf 2546 mov dword [ss:PATM_ INTERRUPTFLAG], 12546 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 2547 2547 PATM_INT3 2548 2548 … … 2550 2550 ; IF=1 -> we can safely jump back to the original instruction 2551 2551 popf 2552 mov dword [ss:PATM_ INTERRUPTFLAG], 12552 mov dword [ss:PATM_ASMFIX_INTERRUPTFLAG], 1 2553 2553 DB 0xE9 2554 2554 PATMJumpToGuest_IF1_Jump: 2555 DD PATM_ JUMPDELTA2555 DD PATM_ASMFIX_JUMPDELTA 2556 2556 ENDPROC PATMJumpToGuest_IF1 2557 2557 … … 2560 2560 GLOBALNAME PATMJumpToGuest_IF1Record 2561 2561 PATCHASMRECORD_INIT_JUMP PATMJumpToGuest_IF1, PATMJumpToGuest_IF1_Jump, 4 2562 DD PATM_ INTERRUPTFLAG, 02563 DD PATM_ VMFLAGS, 02564 DD PATM_ INTERRUPTFLAG, 02565 DD PATM_ INTERRUPTFLAG, 02562 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2563 DD PATM_ASMFIX_VMFLAGS, 0 2564 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2565 DD PATM_ASMFIX_INTERRUPTFLAG, 0 2566 2566 DD 0ffffffffh, 0ffffffffh 2567 2567 -
trunk/src/VBox/VMM/VMMR3/PATMA.mac
r54763 r54764 22 22 ; @remarks These fixups types are part of the saved state. 23 23 ; @{ 24 %define PATM_ VMFLAGS0xF1ABCD0024 %define PATM_ASMFIX_VMFLAGS 0xF1ABCD00 25 25 %ifdef VBOX_WITH_STATISTICS 26 %define PATM_A LLPATCHCALLS0xF1ABCD0127 %define PATM_ PERPATCHCALLS0xF1ABCD0226 %define PATM_ASMFIX_ALLPATCHCALLS 0xF1ABCD01 27 %define PATM_ASMFIX_PERPATCHCALLS 0xF1ABCD02 28 28 %endif 29 %define PATM_ JUMPDELTA0xF1ABCD0329 %define PATM_ASMFIX_JUMPDELTA 0xF1ABCD03 30 30 %ifdef VBOX_WITH_STATISTICS 31 %define PATM_ IRETEFLAGS0xF1ABCD0432 %define PATM_ IRETCS0xF1ABCD0533 %define PATM_ IRETEIP0xF1ABCD0631 %define PATM_ASMFIX_IRETEFLAGS 0xF1ABCD04 32 %define PATM_ASMFIX_IRETCS 0xF1ABCD05 33 %define PATM_ASMFIX_IRETEIP 0xF1ABCD06 34 34 %endif 35 %define PATM_ FIXUP0xF1ABCD0736 %define PATM_ PENDINGACTION0xF1ABCD0837 %define PATM_ CPUID_STD_PTR0xF1ABCD0938 %define PATM_ CPUID_EXT_PTR0xF1ABCD0a39 %define PATM_ CPUID_DEF_PTR0xF1ABCD0b40 %define PATM_ STACKBASE0xF1ABCD0c ;;< Stack to store our private patch return addresses41 %define PATM_ STACKBASE_GUEST 0xF1ABCD0d ;;< Stack to store guest return addresses42 %define PATM_ STACKPTR0xF1ABCD0e43 %define PATM_ PATCHBASE0xF1ABCD0f44 %define PATM_ INTERRUPTFLAG0xF1ABCD1045 %define PATM_ INHIBITIRQADDR0xF1ABCD1146 %define PATM_ VM_FORCEDACTIONS0xF1ABCD1247 %define PATM_ TEMP_EAX0xF1ABCD13 ;;< Location for original EAX register48 %define PATM_ TEMP_ECX0xF1ABCD14 ;;< Location for original ECX register49 %define PATM_ TEMP_EDI0xF1ABCD15 ;;< Location for original EDI register50 %define PATM_ TEMP_EFLAGS0xF1ABCD16 ;;< Location for original eflags51 %define PATM_ TEMP_RESTORE_FLAGS0xF1ABCD17 ;;< Which registers to restore52 %define PATM_ CALL_PATCH_TARGET_ADDR0xF1ABCD1853 %define PATM_ CALL_RETURN_ADDR0xF1ABCD1954 %define PATM_ CPUID_CENTAUR_PTR0xF1ABCD1a35 %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 55 %define PATM_ASMFIX_REUSE_LATER_0 0xF1ABCD1b 56 56 %define PATM_ASMFIX_REUSE_LATER_1 0xF1ABCD1c … … 60 60 61 61 ;/* Anything larger doesn't require a fixup */ 62 %define PATM_ NO_FIXUP0xF1ABCE0063 %define PATM_ CPUID_STD_MAX0xF1ABCE0064 %define PATM_ CPUID_EXT_MAX0xF1ABCE0165 %define PATM_ RETURNADDR0xF1ABCE0266 %define PATM_ PATCHNEXTBLOCK0xF1ABCE0367 %define PATM_ CALLTARGET 0xF1ABCE04 ;;< relative call target68 %define PATM_ NEXTINSTRADDR 0xF1ABCE05 ;;< absolute guest address of the next instruction69 %define PATM_ CURINSTRADDR 0xF1ABCE06 ;;< absolute guest address of the current instruction70 %define PATM_ LOOKUP_AND_CALL_FUNCTION 0xF1ABCE07 ;;< Relative address of global PATM lookup and call function.71 %define PATM_ RETURN_FUNCTION 0xF1ABCE08 ;;< Relative address of global PATM return function.72 %define PATM_ LOOKUP_AND_JUMP_FUNCTION 0xF1ABCE09 ;;< Relative address of global PATM lookup and jump function.73 %define PATM_ IRET_FUNCTION 0xF1ABCE0A ;;< Relative address of global PATM iret function.74 %define PATM_ CPUID_CENTAUR_MAX0xF1ABCE0B62 %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 75 ;; @} 76 76 … … 108 108 %define PATM_ACTION_MAGIC 0xABCD4321 109 109 110 ;; @name PATM_ TEMP_RESTORE_FLAGS110 ;; @name PATM_ASMFIX_TEMP_RESTORE_FLAGS 111 111 ;; @{ 112 112 %define PATM_RESTORE_EAX RT_BIT(0) -
trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp
r54763 r54764 109 109 || uType == FIXUP_REL_HELPER_IN_PATCH_ASM_TMPL) 110 110 && pSource == pDest 111 && PATM_IS_ FIXUP_TYPE(pSource))111 && PATM_IS_ASMFIX(pSource)) 112 112 || ((uType == FIXUP_REL_JMPTOPATCH || uType == FIXUP_REL_JMPTOGUEST) && pSource && pDest)); 113 113 … … 172 172 173 173 #ifdef VBOX_STRICT 174 if (pAsmRecord->aRelocs[i].uType == PATM_ FIXUP)174 if (pAsmRecord->aRelocs[i].uType == PATM_ASMFIX_FIXUP) 175 175 Assert(pAsmRecord->aRelocs[i].uInfo != 0); 176 176 else … … 188 188 * PATMGCSTATE member fixups. 189 189 */ 190 case PATM_ VMFLAGS:190 case PATM_ASMFIX_VMFLAGS: 191 191 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uVMFlags); 192 192 break; 193 case PATM_ PENDINGACTION:193 case PATM_ASMFIX_PENDINGACTION: 194 194 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uPendingAction); 195 195 break; 196 case PATM_ STACKPTR:196 case PATM_ASMFIX_STACKPTR: 197 197 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Psp); 198 198 break; 199 case PATM_ INTERRUPTFLAG:199 case PATM_ASMFIX_INTERRUPTFLAG: 200 200 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, fPIF); 201 201 break; 202 case PATM_ INHIBITIRQADDR:202 case PATM_ASMFIX_INHIBITIRQADDR: 203 203 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, GCPtrInhibitInterrupts); 204 204 break; 205 case PATM_ TEMP_EAX:205 case PATM_ASMFIX_TEMP_EAX: 206 206 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.uEAX); 207 207 break; 208 case PATM_ TEMP_ECX:208 case PATM_ASMFIX_TEMP_ECX: 209 209 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.uECX); 210 210 break; 211 case PATM_ TEMP_EDI:211 case PATM_ASMFIX_TEMP_EDI: 212 212 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.uEDI); 213 213 break; 214 case PATM_ TEMP_EFLAGS:214 case PATM_ASMFIX_TEMP_EFLAGS: 215 215 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.eFlags); 216 216 break; 217 case PATM_ TEMP_RESTORE_FLAGS:217 case PATM_ASMFIX_TEMP_RESTORE_FLAGS: 218 218 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, Restore.uFlags); 219 219 break; 220 case PATM_ CALL_PATCH_TARGET_ADDR:220 case PATM_ASMFIX_CALL_PATCH_TARGET_ADDR: 221 221 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, GCCallPatchTargetAddr); 222 222 break; 223 case PATM_ CALL_RETURN_ADDR:223 case PATM_ASMFIX_CALL_RETURN_ADDR: 224 224 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, GCCallReturnAddr); 225 225 break; 226 226 #ifdef VBOX_WITH_STATISTICS 227 case PATM_A LLPATCHCALLS:227 case PATM_ASMFIX_ALLPATCHCALLS: 228 228 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uPatchCalls); 229 229 break; 230 case PATM_ IRETEFLAGS:230 case PATM_ASMFIX_IRETEFLAGS: 231 231 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uIretEFlags); 232 232 break; 233 case PATM_ IRETCS:233 case PATM_ASMFIX_IRETCS: 234 234 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uIretCS); 235 235 break; 236 case PATM_ IRETEIP:236 case PATM_ASMFIX_IRETEIP: 237 237 dest = pVM->patm.s.pGCStateGC + RT_OFFSETOF(PATMGCSTATE, uIretEIP); 238 238 break; … … 240 240 241 241 242 case PATM_ FIXUP:242 case PATM_ASMFIX_FIXUP: 243 243 /* Offset in aRelocs[i].uInfo is from the base of the function. */ 244 244 dest = (RTGCUINTPTR32)pVM->patm.s.pPatchMemGC + pAsmRecord->aRelocs[i].uInfo … … 247 247 248 248 #ifdef VBOX_WITH_STATISTICS 249 case PATM_ PERPATCHCALLS:249 case PATM_ASMFIX_PERPATCHCALLS: 250 250 dest = patmPatchQueryStatAddress(pVM, pPatch); 251 251 break; … … 255 255 * part to store the original return addresses. 256 256 */ 257 case PATM_ STACKBASE:257 case PATM_ASMFIX_STACKBASE: 258 258 dest = pVM->patm.s.pGCStackGC; 259 259 break; 260 260 261 case PATM_ STACKBASE_GUEST:261 case PATM_ASMFIX_STACKBASE_GUEST: 262 262 dest = pVM->patm.s.pGCStackGC + PATM_STACK_SIZE; 263 263 break; 264 264 265 case PATM_ RETURNADDR: /* absolute guest address; no fixup required */266 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ NO_FIXUP);265 case PATM_ASMFIX_RETURNADDR: /* absolute guest address; no fixup required */ 266 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ASMFIX_NO_FIXUP); 267 267 dest = pCallInfo->pReturnGC; 268 268 break; 269 269 270 case PATM_ PATCHNEXTBLOCK: /* relative address of instruction following this block */271 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ NO_FIXUP);270 case PATM_ASMFIX_PATCHNEXTBLOCK: /* relative address of instruction following this block */ 271 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ASMFIX_NO_FIXUP); 272 272 273 273 /** @note hardcoded assumption that we must return to the instruction following this block */ … … 275 275 break; 276 276 277 case PATM_ CALLTARGET: /* relative to patch address; no fixup required */278 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ NO_FIXUP);277 case PATM_ASMFIX_CALLTARGET: /* relative to patch address; no fixup required */ 278 Assert(pCallInfo && pAsmRecord->aRelocs[i].uType >= PATM_ASMFIX_NO_FIXUP); 279 279 280 280 /* Address must be filled in later. (see patmr3SetBranchTargets) */ … … 283 283 break; 284 284 285 case PATM_ PATCHBASE: /* Patch GC base address */285 case PATM_ASMFIX_PATCHBASE: /* Patch GC base address */ 286 286 dest = pVM->patm.s.pPatchMemGC; 287 287 break; 288 288 289 case PATM_ NEXTINSTRADDR:289 case PATM_ASMFIX_NEXTINSTRADDR: 290 290 Assert(pCallInfo); 291 291 /* pNextInstrGC can be 0 if several instructions, that inhibit irqs, follow each other */ … … 293 293 break; 294 294 295 case PATM_ CURINSTRADDR:295 case PATM_ASMFIX_CURINSTRADDR: 296 296 Assert(pCallInfo); 297 297 dest = pCallInfo->pCurInstrGC; … … 299 299 300 300 /* Relative address of global patm lookup and call function. */ 301 case PATM_ LOOKUP_AND_CALL_FUNCTION:301 case PATM_ASMFIX_LOOKUP_AND_CALL_FUNCTION: 302 302 { 303 303 RTRCPTR pInstrAfterCall = pVM->patm.s.pPatchMemGC … … 311 311 } 312 312 313 case PATM_ RETURN_FUNCTION:313 case PATM_ASMFIX_RETURN_FUNCTION: 314 314 { 315 315 RTRCPTR pInstrAfterCall = pVM->patm.s.pPatchMemGC … … 323 323 } 324 324 325 case PATM_ IRET_FUNCTION:325 case PATM_ASMFIX_IRET_FUNCTION: 326 326 { 327 327 RTRCPTR pInstrAfterCall = pVM->patm.s.pPatchMemGC … … 335 335 } 336 336 337 case PATM_ LOOKUP_AND_JUMP_FUNCTION:337 case PATM_ASMFIX_LOOKUP_AND_JUMP_FUNCTION: 338 338 { 339 339 RTRCPTR pInstrAfterCall = pVM->patm.s.pPatchMemGC … … 347 347 } 348 348 349 case PATM_ CPUID_STD_MAX: /* saved state only */349 case PATM_ASMFIX_CPUID_STD_MAX: /* saved state only */ 350 350 dest = CPUMR3GetGuestCpuIdPatmStdMax(pVM); 351 351 break; 352 case PATM_ CPUID_EXT_MAX: /* saved state only */352 case PATM_ASMFIX_CPUID_EXT_MAX: /* saved state only */ 353 353 dest = CPUMR3GetGuestCpuIdPatmExtMax(pVM); 354 354 break; 355 case PATM_ CPUID_CENTAUR_MAX: /* saved state only */355 case PATM_ASMFIX_CPUID_CENTAUR_MAX: /* saved state only */ 356 356 dest = CPUMR3GetGuestCpuIdPatmCentaurMax(pVM); 357 357 break; … … 361 361 * Note! Earlier saved state versions had different hacks for detecting some of these. 362 362 */ 363 case PATM_ VM_FORCEDACTIONS:363 case PATM_ASMFIX_VM_FORCEDACTIONS: 364 364 dest = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions); 365 365 break; 366 366 367 case PATM_ CPUID_DEF_PTR: /* saved state only */367 case PATM_ASMFIX_CPUID_DEF_PTR: /* saved state only */ 368 368 dest = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM); 369 369 break; 370 case PATM_ CPUID_STD_PTR: /* saved state only */370 case PATM_ASMFIX_CPUID_STD_PTR: /* saved state only */ 371 371 dest = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM); 372 372 break; 373 case PATM_ CPUID_EXT_PTR: /* saved state only */373 case PATM_ASMFIX_CPUID_EXT_PTR: /* saved state only */ 374 374 dest = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM); 375 375 break; 376 case PATM_ CPUID_CENTAUR_PTR: /* saved state only */376 case PATM_ASMFIX_CPUID_CENTAUR_PTR: /* saved state only */ 377 377 dest = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM); 378 378 break; … … 412 412 *(PRTRCPTR)&pPB[j] = dest; 413 413 414 if (pAsmRecord->aRelocs[i].uType < PATM_ NO_FIXUP)414 if (pAsmRecord->aRelocs[i].uType < PATM_ASMFIX_NO_FIXUP) 415 415 { 416 416 patmPatchAddReloc32(pVM, pPatch, &pPB[j], uRelocType, … … 797 797 PATCHGEN_EPILOG(pPatch, size); 798 798 799 /* Need to set PATM_ INTERRUPTFLAG after the patched ret returns here. */799 /* Need to set PATM_ASMFIX_INTERRUPTFLAG after the patched ret returns here. */ 800 800 rc = patmPatchGenSetPIF(pVM, pPatch, pCurInstrGC); 801 801 if (rc == VERR_NO_MEMORY) -
trunk/src/VBox/VMM/VMMR3/PATMSSM.cpp
r54763 r54764 1111 1111 { 1112 1112 Assert( pRec->uType != PATM_SAVED_STATE_VERSION_NO_RAW_MEM 1113 || (pRec->pSource == pRec->pDest && PATM_IS_ FIXUP_TYPE(pRec->pSource)) );1113 || (pRec->pSource == pRec->pDest && PATM_IS_ASMFIX(pRec->pSource)) ); 1114 1114 1115 1115 /* bird: What is this for exactly? Only the MMIO fixups used to have pSource set. */ … … 1266 1266 LogFlow(("Changing fLocalForcedActions fixup from %RRv to %RRv\n", uFixup, pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions))); 1267 1267 *pFixup = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions); 1268 pRec->pSource = pRec->pDest = PATM_ VM_FORCEDACTIONS;1268 pRec->pSource = pRec->pDest = PATM_ASMFIX_VM_FORCEDACTIONS; 1269 1269 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1270 1270 } … … 1279 1279 case 0: 1280 1280 *pFixup = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM); 1281 pRec->pSource = pRec->pDest = PATM_ CPUID_DEF_PTR;1281 pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_DEF_PTR; 1282 1282 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1283 1283 break; 1284 1284 case 1: 1285 1285 *pFixup = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM); 1286 pRec->pSource = pRec->pDest = PATM_ CPUID_STD_PTR;1286 pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_STD_PTR; 1287 1287 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1288 1288 break; 1289 1289 case 2: 1290 1290 *pFixup = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM); 1291 pRec->pSource = pRec->pDest = PATM_ CPUID_EXT_PTR;1291 pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_EXT_PTR; 1292 1292 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1293 1293 break; 1294 1294 case 3: 1295 1295 *pFixup = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM); 1296 pRec->pSource = pRec->pDest = PATM_ CPUID_CENTAUR_PTR;1296 pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_CENTAUR_PTR; 1297 1297 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1298 1298 break; … … 1313 1313 case PATM_FIXUP_CPU_FF_ACTION: 1314 1314 *pFixup = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions); 1315 pRec->pSource = pRec->pDest = PATM_ VM_FORCEDACTIONS;1315 pRec->pSource = pRec->pDest = PATM_ASMFIX_VM_FORCEDACTIONS; 1316 1316 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1317 1317 LogFlow(("Changing cpu ff action fixup from %x to %x\n", uFixup, *pFixup)); … … 1319 1319 case PATM_FIXUP_CPUID_DEFAULT: 1320 1320 *pFixup = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM); 1321 pRec->pSource = pRec->pDest = PATM_ CPUID_DEF_PTR;1321 pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_DEF_PTR; 1322 1322 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1323 1323 LogFlow(("Changing cpuid def fixup from %x to %x\n", uFixup, *pFixup)); … … 1325 1325 case PATM_FIXUP_CPUID_STANDARD: 1326 1326 *pFixup = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM); 1327 pRec->pSource = pRec->pDest = PATM_ CPUID_STD_PTR;1327 pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_STD_PTR; 1328 1328 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1329 1329 LogFlow(("Changing cpuid std fixup from %x to %x\n", uFixup, *pFixup)); … … 1331 1331 case PATM_FIXUP_CPUID_EXTENDED: 1332 1332 *pFixup = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM); 1333 pRec->pSource = pRec->pDest = PATM_ CPUID_EXT_PTR;1333 pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_EXT_PTR; 1334 1334 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1335 1335 LogFlow(("Changing cpuid ext fixup from %x to %x\n", uFixup, *pFixup)); … … 1337 1337 case PATM_FIXUP_CPUID_CENTAUR: 1338 1338 *pFixup = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM); 1339 pRec->pSource = pRec->pDest = PATM_ CPUID_CENTAUR_PTR;1339 pRec->pSource = pRec->pDest = PATM_ASMFIX_CPUID_CENTAUR_PTR; 1340 1340 pRec->uType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL; 1341 1341 LogFlow(("Changing cpuid centaur fixup from %x to %x\n", uFixup, *pFixup)); … … 1353 1353 && pRec->uType == FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL) 1354 1354 { 1355 Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ FIXUP_TYPE(pRec->pSource));1355 Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ASMFIX(pRec->pSource)); 1356 1356 switch (pRec->pSource) 1357 1357 { 1358 case PATM_ VM_FORCEDACTIONS:1358 case PATM_ASMFIX_VM_FORCEDACTIONS: 1359 1359 *pFixup = pVM->pVMRC + RT_OFFSETOF(VM, aCpus[0].fLocalForcedActions); 1360 1360 break; 1361 case PATM_ CPUID_DEF_PTR:1361 case PATM_ASMFIX_CPUID_DEF_PTR: 1362 1362 *pFixup = CPUMR3GetGuestCpuIdPatmDefRCPtr(pVM); 1363 1363 break; 1364 case PATM_ CPUID_STD_PTR: /* Saved again patches only. */1364 case PATM_ASMFIX_CPUID_STD_PTR: /* Saved again patches only. */ 1365 1365 *pFixup = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM); 1366 1366 break; 1367 case PATM_ CPUID_EXT_PTR: /* Saved again patches only. */1367 case PATM_ASMFIX_CPUID_EXT_PTR: /* Saved again patches only. */ 1368 1368 *pFixup = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM); 1369 1369 break; 1370 case PATM_ CPUID_CENTAUR_PTR: /* Saved again patches only. */1370 case PATM_ASMFIX_CPUID_CENTAUR_PTR: /* Saved again patches only. */ 1371 1371 *pFixup = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM); 1372 1372 break; … … 1384 1384 { 1385 1385 AssertLogRelReturn(uVersion > PATM_SAVED_STATE_VERSION_NO_RAW_MEM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED); 1386 Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ FIXUP_TYPE(pRec->pSource));1386 Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ASMFIX(pRec->pSource)); 1387 1387 switch (pRec->pSource) 1388 1388 { … … 1406 1406 { 1407 1407 AssertLogRelReturn(uVersion > PATM_SAVED_STATE_VERSION_NO_RAW_MEM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED); 1408 Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ FIXUP_TYPE(pRec->pSource));1408 Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_ASMFIX(pRec->pSource)); 1409 1409 int rc; 1410 1410 RTRCPTR uRCPtrDest; -
trunk/src/VBox/VMM/include/PATMA.h
r54763 r54764 22 22 * @remarks These fixups types are part of the saved state. 23 23 * @{ */ 24 #define PATM_ VMFLAGS0xF1ABCD0024 #define PATM_ASMFIX_VMFLAGS 0xF1ABCD00 25 25 #ifdef VBOX_WITH_STATISTICS 26 # define PATM_A LLPATCHCALLS0xF1ABCD0127 # define PATM_ PERPATCHCALLS0xF1ABCD0226 # define PATM_ASMFIX_ALLPATCHCALLS 0xF1ABCD01 27 # define PATM_ASMFIX_PERPATCHCALLS 0xF1ABCD02 28 28 #endif 29 #define PATM_ JUMPDELTA0xF1ABCD0329 #define PATM_ASMFIX_JUMPDELTA 0xF1ABCD03 30 30 #ifdef VBOX_WITH_STATISTICS 31 # define PATM_ IRETEFLAGS0xF1ABCD0432 # define PATM_ IRETCS0xF1ABCD0533 # define PATM_ IRETEIP0xF1ABCD0631 # define PATM_ASMFIX_IRETEFLAGS 0xF1ABCD04 32 # define PATM_ASMFIX_IRETCS 0xF1ABCD05 33 # define PATM_ASMFIX_IRETEIP 0xF1ABCD06 34 34 #endif 35 #define PATM_ FIXUP0xF1ABCD0736 #define PATM_ PENDINGACTION0xF1ABCD0837 #define PATM_ CPUID_STD_PTR0xF1ABCD09 /**< Legacy, saved state only. */38 #define PATM_ CPUID_EXT_PTR0xF1ABCD0a /**< Legacy, saved state only. */39 #define PATM_ CPUID_DEF_PTR0xF1ABCD0b /**< Legacy, saved state only. */40 #define PATM_ STACKBASE0xF1ABCD0c /**< Stack to store our private patch return addresses */41 #define PATM_ STACKBASE_GUEST0xF1ABCD0d /**< Stack to store guest return addresses */42 #define PATM_ STACKPTR0xF1ABCD0e43 #define PATM_ PATCHBASE0xF1ABCD0f44 #define PATM_ INTERRUPTFLAG0xF1ABCD1045 #define PATM_ INHIBITIRQADDR0xF1ABCD1146 #define PATM_ VM_FORCEDACTIONS0xF1ABCD1247 #define PATM_ TEMP_EAX0xF1ABCD13 /**< Location for original EAX register */48 #define PATM_ TEMP_ECX0xF1ABCD14 /**< Location for original ECX register */49 #define PATM_ TEMP_EDI0xF1ABCD15 /**< Location for original EDI register */50 #define PATM_ TEMP_EFLAGS0xF1ABCD16 /**< Location for original eflags */51 #define PATM_ TEMP_RESTORE_FLAGS0xF1ABCD17 /**< Which registers to restore */52 #define PATM_ CALL_PATCH_TARGET_ADDR0xF1ABCD1853 #define PATM_ CALL_RETURN_ADDR0xF1ABCD1954 #define PATM_ CPUID_CENTAUR_PTR0xF1ABCD1a /**< Legacy, saved state only. */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 55 #define PATM_ASMFIX_REUSE_LATER_0 0xF1ABCD1b 56 56 #define PATM_ASMFIX_REUSE_LATER_1 0xF1ABCD1c … … 60 60 61 61 /* Anything larger doesn't require a fixup */ 62 #define PATM_ NO_FIXUP0xF1ABCE0063 #define PATM_ CPUID_STD_MAX0xF1ABCE0064 #define PATM_ CPUID_EXT_MAX0xF1ABCE0165 #define PATM_ RETURNADDR0xF1ABCE0266 #define PATM_ PATCHNEXTBLOCK0xF1ABCE0367 #define PATM_ CALLTARGET0xF1ABCE04 /**< relative call target */68 #define PATM_ NEXTINSTRADDR0xF1ABCE05 /**< absolute guest address of the next instruction */69 #define PATM_ CURINSTRADDR0xF1ABCE06 /**< absolute guest address of the current instruction */70 #define PATM_ LOOKUP_AND_CALL_FUNCTION0xF1ABCE07 /**< Relative address of global PATM lookup and call function. */71 #define PATM_ RETURN_FUNCTION0xF1ABCE08 /**< Relative address of global PATM return function. */72 #define PATM_ LOOKUP_AND_JUMP_FUNCTION0xF1ABCE09 /**< Relative address of global PATM lookup and jump function. */73 #define PATM_ IRET_FUNCTION0xF1ABCE0A /**< Relative address of global PATM iret function. */74 #define PATM_ CPUID_CENTAUR_MAX0xF1ABCE0B62 #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 75 76 76 /** Identifies an patch fixup type value (with reasonable accuracy). */ 77 #define PATM_IS_ FIXUP_TYPE(a_uValue) \77 #define PATM_IS_ASMFIX(a_uValue) \ 78 78 ( ((a_uValue) & UINT32_C(0xfffffC00)) == UINT32_C(0xF1ABCC00) && ((a_uValue) & UINT32_C(0xff)) < UINT32_C(0x30) ) 79 79 /** @} */ … … 113 113 #define PATM_ACTION_MAGIC 0xABCD4321 114 114 115 /** @name PATM_ TEMP_RESTORE_FLAGS115 /** @name PATM_ASMFIX_TEMP_RESTORE_FLAGS 116 116 * @{ */ 117 117 #define PATM_RESTORE_EAX RT_BIT(0) -
trunk/src/VBox/VMM/include/PATMInternal.h
r54763 r54764 70 70 #define PATMFL_CALLABLE_AS_FUNCTION RT_BIT_64(25) /** cli and pushf blocks can be used as callable functions. */ 71 71 #define PATMFL_GLOBAL_FUNCTIONS RT_BIT_64(26) /** fake patch for global patm functions. */ 72 #define PATMFL_TRAMPOLINE RT_BIT_64(27) /** trampoline patch that clears PATM_ INTERRUPTFLAG and jumps to patch destination */72 #define PATMFL_TRAMPOLINE RT_BIT_64(27) /** trampoline patch that clears PATM_ASMFIX_INTERRUPTFLAG and jumps to patch destination */ 73 73 #define PATMFL_GENERATE_SETPIF RT_BIT_64(28) /** generate set PIF for the next instruction */ 74 74 #define PATMFL_INSTR_HINT RT_BIT_64(29) /** Generate patch, but don't activate it. */ … … 112 112 * 113 113 * The source and desination addresses both set to the patch fixup type (see 114 * PATM_IS_ FIXUP_TYPEand friends in PATMA.h). This is recent addition (CPUID114 * PATM_IS_ASMFIX and friends in PATMA.h). This is recent addition (CPUID 115 115 * subleaf code), so when loading older saved states this is usally represented 116 116 * as FIXUP_ABSOLUTE. */
Note:
See TracChangeset
for help on using the changeset viewer.