Changeset 19986 in vbox
- Timestamp:
- May 25, 2009 9:23:06 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 47692
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp
r19985 r19986 2907 2907 2908 2908 LogFlow(("EPT Page fault %x at %RGp error code %x\n", (uint32_t)exitQualification, GCPhys, errCode)); 2909 2910 /* Shortcut for APIC TPR reads and writes. */2911 if ((GCPhys & 0xfff) == 0x080)2912 {2913 RTGCPHYS GCPhysApicBase;2914 PDMApicGetBase(pVM, &GCPhysApicBase);2915 if (GCPhys == GCPhysApicBase + 0x80)2916 {2917 DISCPUSTATE Cpu;2918 uint32_t cbOp;2919 Cpu.mode = SELMGetCpuModeFromSelector(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid);2920 2921 rc = EMInterpretDisasOne(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu, &cbOp);2922 if ( rc == VINF_SUCCESS2923 && Cpu.pCurInstr->opcode == OP_MOV)2924 {2925 if ( (errCode & X86_TRAP_PF_RW)2926 && (Cpu.param2.flags == USE_REG_GEN32))2927 {2928 uint32_t val;2929 2930 DISFetchReg32(CPUMCTX2CORE(pCtx), Cpu.param2.base.reg_gen, &val);2931 2932 rc = PDMApicSetTPR(pVM, val >> 4);2933 goto ResumeExecution;2934 }2935 else2936 if (Cpu.param1.flags == USE_REG_GEN32)2937 {2938 uint8_t u8TPR;2939 bool fPending;2940 2941 rc = PDMApicGetTPR(pVM, &u8TPR, &fPending);2942 AssertRC(rc);2943 2944 DISWriteReg32(CPUMCTX2CORE(pCtx), Cpu.param1.base.reg_gen, u8TPR << 4);2945 goto ResumeExecution;2946 }2947 }2948 }2949 }2950 2909 2951 2910 /* GCPhys contains the guest physical address of the page fault. */
Note:
See TracChangeset
for help on using the changeset viewer.