Changeset 97208 in vbox
- Timestamp:
- Oct 18, 2022 1:56:59 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 154184
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/em.h
r97206 r97208 273 273 VMM_INT_DECL(VBOXSTRICTRC) EMInterpretInstruction(PVMCPUCC pVCpu); 274 274 VMM_INT_DECL(VBOXSTRICTRC) EMInterpretInstructionDisasState(PVMCPUCC pVCpu, PDISCPUSTATE pDis, uint64_t rip); 275 VMM_INT_DECL(int) EMInterpretDRxWrite(PVMCC pVM, PVMCPUCC pVCpu, PCPUMCTXCORE pRegFrame, uint32_t DestRegDrx, uint32_t SrcRegGen);276 VMM_INT_DECL(int) EMInterpretDRxRead(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, uint32_t DestRegGen, uint32_t SrcRegDrx);277 275 /** @} */ 278 276 -
trunk/include/VBox/vmm/iem.h
r97200 r97208 335 335 VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxWrite(PVMCPUCC pVCpu, uint8_t cbInstr, uint8_t iCrReg, uint8_t iGReg); 336 336 VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxRead(PVMCPUCC pVCpu, uint8_t cbInstr, uint8_t iGReg, uint8_t iCrReg); 337 VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovDRxWrite(PVMCPUCC pVCpu, uint8_t cbInstr, uint8_t iDrReg, uint8_t iGReg); 338 VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovDRxRead(PVMCPUCC pVCpu, uint8_t cbInstr, uint8_t iGReg, uint8_t iDrReg); 337 339 VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedClts(PVMCPUCC pVCpu, uint8_t cbInstr); 338 340 VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedLmsw(PVMCPUCC pVCpu, uint8_t cbInstr, uint16_t uValue, RTGCPTR GCPtrEffDst); -
trunk/src/VBox/VMM/VMMAll/EMAll.cpp
r97206 r97208 1017 1017 } 1018 1018 1019 1020 1021 1022 /*1023 *1024 * Old interpreter primitives used by HM, move/eliminate later.1025 * Old interpreter primitives used by HM, move/eliminate later.1026 * Old interpreter primitives used by HM, move/eliminate later.1027 * Old interpreter primitives used by HM, move/eliminate later.1028 * Old interpreter primitives used by HM, move/eliminate later.1029 *1030 */1031 1032 /* VT-x only: */1033 1034 /**1035 * Interpret DRx write.1036 *1037 * @returns VBox status code.1038 * @param pVM The cross context VM structure.1039 * @param pVCpu The cross context virtual CPU structure.1040 * @param pRegFrame The register frame.1041 * @param DestRegDrx DRx register index (USE_REG_DR*)1042 * @param SrcRegGen General purpose register index (USE_REG_E**))1043 *1044 */1045 VMM_INT_DECL(int) EMInterpretDRxWrite(PVMCC pVM, PVMCPUCC pVCpu, PCPUMCTXCORE pRegFrame, uint32_t DestRegDrx, uint32_t SrcRegGen)1046 {1047 Assert(pRegFrame == CPUMGetGuestCtxCore(pVCpu));1048 uint64_t uNewDrX;1049 int rc;1050 NOREF(pVM);1051 1052 if (CPUMIsGuestIn64BitCode(pVCpu))1053 rc = DISFetchReg64(pRegFrame, SrcRegGen, &uNewDrX);1054 else1055 {1056 uint32_t val32;1057 rc = DISFetchReg32(pRegFrame, SrcRegGen, &val32);1058 uNewDrX = val32;1059 }1060 1061 if (RT_SUCCESS(rc))1062 {1063 if (DestRegDrx == 6)1064 {1065 uNewDrX |= X86_DR6_RA1_MASK;1066 uNewDrX &= ~X86_DR6_RAZ_MASK;1067 }1068 else if (DestRegDrx == 7)1069 {1070 uNewDrX |= X86_DR7_RA1_MASK;1071 uNewDrX &= ~X86_DR7_RAZ_MASK;1072 }1073 1074 /** @todo we don't fail if illegal bits are set/cleared for e.g. dr7 */1075 rc = CPUMSetGuestDRx(pVCpu, DestRegDrx, uNewDrX);1076 if (RT_SUCCESS(rc))1077 return rc;1078 AssertMsgFailed(("CPUMSetGuestDRx %d failed\n", DestRegDrx));1079 }1080 return VERR_EM_INTERPRETER;1081 }1082 1083 1084 /**1085 * Interpret DRx read.1086 *1087 * @returns VBox status code.1088 * @param pVM The cross context VM structure.1089 * @param pVCpu The cross context virtual CPU structure.1090 * @param pRegFrame The register frame.1091 * @param DestRegGen General purpose register index (USE_REG_E**))1092 * @param SrcRegDrx DRx register index (USE_REG_DR*)1093 */1094 VMM_INT_DECL(int) EMInterpretDRxRead(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, uint32_t DestRegGen, uint32_t SrcRegDrx)1095 {1096 uint64_t val64;1097 Assert(pRegFrame == CPUMGetGuestCtxCore(pVCpu));1098 NOREF(pVM);1099 1100 int rc = CPUMGetGuestDRx(pVCpu, SrcRegDrx, &val64);1101 AssertMsgRCReturn(rc, ("CPUMGetGuestDRx %d failed\n", SrcRegDrx), VERR_EM_INTERPRETER);1102 if (CPUMIsGuestIn64BitCode(pVCpu))1103 rc = DISWriteReg64(pRegFrame, DestRegGen, val64);1104 else1105 rc = DISWriteReg32(pRegFrame, DestRegGen, (uint32_t)val64);1106 1107 if (RT_SUCCESS(rc))1108 return VINF_SUCCESS;1109 1110 return VERR_EM_INTERPRETER;1111 }1112 -
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r97200 r97208 10798 10798 10799 10799 /** 10800 * Interface for HM and EM to write to a DRx register. 10801 * 10802 * @returns Strict VBox status code. 10803 * @param pVCpu The cross context virtual CPU structure. 10804 * @param cbInstr The instruction length in bytes. 10805 * @param iDrReg The debug register number (destination). 10806 * @param iGReg The general purpose register number (source). 10807 * 10808 * @remarks In ring-0 not all of the state needs to be synced in. 10809 */ 10810 VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovDRxWrite(PVMCPUCC pVCpu, uint8_t cbInstr, uint8_t iDrReg, uint8_t iGReg) 10811 { 10812 IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 2); 10813 IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK); 10814 Assert(iDrReg < 8); 10815 Assert(iGReg < 16); 10816 10817 iemInitExec(pVCpu, false /*fBypassHandlers*/); 10818 VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_mov_Dd_Rd, iDrReg, iGReg); 10819 Assert(!pVCpu->iem.s.cActiveMappings); 10820 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 10821 } 10822 10823 10824 /** 10825 * Interface for HM and EM to read from a DRx register. 10826 * 10827 * @returns Strict VBox status code. 10828 * @param pVCpu The cross context virtual CPU structure. 10829 * @param cbInstr The instruction length in bytes. 10830 * @param iGReg The general purpose register number (destination). 10831 * @param iDrReg The debug register number (source). 10832 * 10833 * @remarks In ring-0 not all of the state needs to be synced in. 10834 */ 10835 VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovDRxRead(PVMCPUCC pVCpu, uint8_t cbInstr, uint8_t iGReg, uint8_t iDrReg) 10836 { 10837 IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 2); 10838 IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK); 10839 Assert(iDrReg < 8); 10840 Assert(iGReg < 16); 10841 10842 iemInitExec(pVCpu, false /*fBypassHandlers*/); 10843 VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_mov_Rd_Dd, iGReg, iDrReg); 10844 Assert(!pVCpu->iem.s.cActiveMappings); 10845 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 10846 } 10847 10848 10849 /** 10800 10850 * Interface for HM and EM to clear the CR0[TS] bit. 10801 10851 * -
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
r97196 r97208 6427 6427 drX &= ~X86_DR7_RAZ_MASK; 6428 6428 break; 6429 IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* call checks */6429 IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* caller checks */ 6430 6430 } 6431 6431 … … 6439 6439 IEM_SVM_UPDATE_NRIP(pVCpu); 6440 6440 IEM_SVM_VMEXIT_RET(pVCpu, SVM_EXIT_READ_DR0 + (iDrReg & 0xf), 6441 6441 IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmDecodeAssists ? (iGReg & 7) : 0, 0 /* uExitInfo2 */); 6442 6442 } 6443 6443 -
trunk/src/VBox/VMM/VMMAll/VMXAllTemplate.cpp.h
r97206 r97208 9170 9170 9171 9171 /* 9172 * EMInterpretDRx[Write|Read]() calls CPUMIsGuestIn64BitCode() which requires EFER MSR, CS.9173 * The EFER MSR is always up-to-date.9174 * Update the segment registers and DR7 from the CPU.9172 * Import state. We must have DR7 loaded here as it's always consulted, 9173 * both for reading and writing. The other debug registers are never 9174 * exported as such. 9175 9175 */ 9176 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 9177 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 9178 int rc = vmxHCImportGuestState<CPUMCTX_EXTRN_SREG_MASK | CPUMCTX_EXTRN_DR7>(pVCpu, pVmcsInfo, __FUNCTION__); 9176 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9177 int rc = vmxHCImportGuestState< IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK 9178 | CPUMCTX_EXTRN_GPRS_MASK 9179 | CPUMCTX_EXTRN_DR7>(pVCpu, pVmcsInfo, __FUNCTION__); 9179 9180 AssertRCReturn(rc, rc); 9180 Log4Func(("cs:rip=%#04x:%08RX64\n", pCtx->cs.Sel, pCtx->rip)); 9181 9182 PVMCC pVM = pVCpu->CTX_SUFF(pVM); 9181 Log4Func(("cs:rip=%#04x:%08RX64\n", pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.rip)); 9182 9183 uint8_t const iGReg = VMX_EXIT_QUAL_DRX_GENREG(pVmxTransient->uExitQual); 9184 uint8_t const iDrReg = VMX_EXIT_QUAL_DRX_REGISTER(pVmxTransient->uExitQual); 9185 9186 VBOXSTRICTRC rcStrict; 9183 9187 if (VMX_EXIT_QUAL_DRX_DIRECTION(pVmxTransient->uExitQual) == VMX_EXIT_QUAL_DRX_DIRECTION_WRITE) 9184 9188 { 9185 rc = EMInterpretDRxWrite(pVM, pVCpu, CPUMCTX2CORE(pCtx), 9186 VMX_EXIT_QUAL_DRX_REGISTER(pVmxTransient->uExitQual), 9187 VMX_EXIT_QUAL_DRX_GENREG(pVmxTransient->uExitQual)); 9188 if (RT_SUCCESS(rc)) 9189 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_GUEST_DR7); 9189 /* 9190 * Write DRx register. 9191 */ 9192 rcStrict = IEMExecDecodedMovDRxWrite(pVCpu, pVmxTransient->cbExitInstr, iDrReg, iGReg); 9193 AssertMsg( rcStrict == VINF_SUCCESS 9194 || rcStrict == VINF_IEM_RAISED_XCPT, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 9195 9196 if (rcStrict == VINF_SUCCESS) 9197 /** @todo r=bird: Not sure why we always flag DR7 as modified here, but I've 9198 * kept it for now to avoid breaking something non-obvious. */ 9199 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS 9200 | HM_CHANGED_GUEST_DR7); 9201 else if (rcStrict == VINF_IEM_RAISED_XCPT) 9202 { 9203 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK); 9204 rcStrict = VINF_SUCCESS; 9205 } 9206 9190 9207 STAM_COUNTER_INC(&VCPU_2_VMXSTATS(pVCpu).StatExitDRxWrite); 9191 9208 } 9192 9209 else 9193 9210 { 9194 rc = EMInterpretDRxRead(pVM, pVCpu, CPUMCTX2CORE(pCtx), 9195 VMX_EXIT_QUAL_DRX_GENREG(pVmxTransient->uExitQual), 9196 VMX_EXIT_QUAL_DRX_REGISTER(pVmxTransient->uExitQual)); 9211 /* 9212 * Read DRx register into a general purpose register. 9213 */ 9214 rcStrict = IEMExecDecodedMovDRxRead(pVCpu, pVmxTransient->cbExitInstr, iGReg, iDrReg); 9215 AssertMsg( rcStrict == VINF_SUCCESS 9216 || rcStrict == VINF_IEM_RAISED_XCPT, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 9217 9218 if (rcStrict == VINF_SUCCESS) 9219 { 9220 if (iGReg == X86_GREG_xSP) 9221 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS 9222 | HM_CHANGED_GUEST_RSP); 9223 else 9224 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS); 9225 } 9226 else if (rcStrict == VINF_IEM_RAISED_XCPT) 9227 { 9228 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK); 9229 rcStrict = VINF_SUCCESS; 9230 } 9231 9197 9232 STAM_COUNTER_INC(&VCPU_2_VMXSTATS(pVCpu).StatExitDRxRead); 9198 9233 } 9199 9234 9200 Assert(rc == VINF_SUCCESS || rc == VERR_EM_INTERPRETER); 9201 if (RT_SUCCESS(rc)) 9202 { 9203 int rc2 = vmxHCAdvanceGuestRip(pVCpu, pVmxTransient); 9204 AssertRCReturn(rc2, rc2); 9205 return VINF_SUCCESS; 9206 } 9207 return rc; 9235 return rcStrict; 9208 9236 } 9209 9237
Note:
See TracChangeset
for help on using the changeset viewer.