Changeset 12786 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Sep 29, 2008 11:01:57 AM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 37131
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/EMAll.cpp
r12773 r12786 396 396 case OP_MOV_DR: return "MovDRx"; 397 397 case OP_LLDT: return "LLdt"; 398 case OP_LGDT: return "LGdt"; 399 case OP_LIDT: return "LGdt"; 398 400 case OP_CLTS: return "Clts"; 399 401 case OP_MONITOR: return "Monitor"; … … 2240 2242 return VERR_EM_INTERPRETER; 2241 2243 } 2244 2245 #ifdef IN_RING0 2246 /** 2247 * LIDT/LGDT Emulation. 2248 */ 2249 static int emInterpretLIGdt(PVM pVM, PDISCPUSTATE pCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize) 2250 { 2251 OP_PARAMVAL param1; 2252 RTGCPTR pParam1; 2253 X86XDTR32 dtr32; 2254 2255 LogFlow(("Emulate %s at %VGv\n", emGetMnemonic(pCpu), pRegFrame->rip)); 2256 2257 /* Only for the VT-x real-mode emulation case. */ 2258 if (!CPUMIsGuestInRealMode(pVM)) 2259 return VERR_EM_INTERPRETER; 2260 2261 int rc = DISQueryParamVal(pRegFrame, pCpu, &pCpu->param1, ¶m1, PARAM_SOURCE); 2262 if(VBOX_FAILURE(rc)) 2263 return VERR_EM_INTERPRETER; 2264 2265 switch(param1.type) 2266 { 2267 case PARMTYPE_ADDRESS: 2268 pParam1 = emConvertToFlatAddr(pVM, pRegFrame, pCpu, &pCpu->param1, param1.val.val16); 2269 break; 2270 2271 default: 2272 return VERR_EM_INTERPRETER; 2273 } 2274 2275 rc = emRamRead(pVM, &dtr32, pParam1, sizeof(dtr32)); 2276 AssertRCReturn(rc, VERR_EM_INTERPRETER); 2277 2278 if (pCpu->pCurInstr->opcode == OP_LIDT) 2279 CPUMSetGuestIDTR(pVM, dtr32.uAddr, dtr32.cb); 2280 else 2281 CPUMSetGuestGDTR(pVM, dtr32.uAddr, dtr32.cb); 2282 2283 return VINF_SUCCESS; 2284 } 2285 #endif 2242 2286 2243 2287 … … 2772 2816 STAM_COUNTER_INC(&pVM->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Failed##Instr)); \ 2773 2817 return rc 2818 2819 #define INTERPRET_CASE_EX_DUAL_PARAM2(opcode, Instr, InstrFn) \ 2820 case opcode:\ 2821 rc = emInterpret##InstrFn(pVM, pCpu, pRegFrame, pvFault, pcbSize); \ 2822 if (VBOX_SUCCESS(rc)) \ 2823 STAM_COUNTER_INC(&pVM->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Instr)); \ 2824 else \ 2825 STAM_COUNTER_INC(&pVM->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Failed##Instr)); \ 2826 return rc 2827 2774 2828 #define INTERPRET_STAT_CASE(opcode, Instr) \ 2775 2829 case opcode: STAM_COUNTER_INC(&pVM->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Failed##Instr)); return VERR_EM_INTERPRETER; … … 2791 2845 INTERPRET_CASE(OP_MOV_DR,MovDRx); 2792 2846 INTERPRET_CASE(OP_LLDT,LLdt); 2847 #ifdef IN_RING0 2848 INTERPRET_CASE_EX_DUAL_PARAM2(OP_LIDT, LIdt, LIGdt); 2849 INTERPRET_CASE_EX_DUAL_PARAM2(OP_LGDT, LGdt, LIGdt); 2850 #endif 2793 2851 INTERPRET_CASE(OP_CLTS,Clts); 2794 2852 INTERPRET_CASE(OP_MONITOR, Monitor);
Note:
See TracChangeset
for help on using the changeset viewer.