Changeset 36833 in vbox
- Timestamp:
- Apr 24, 2011 10:59:32 PM (14 years ago)
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r36831 r36833 4677 4677 4678 4678 /** 4679 * Implements 'mov SReg, r/m'.4679 * Common worker for 'pop SReg', 'mov SReg, GReg' and 'lXs GReg, reg/mem'. 4680 4680 * 4681 4681 * @param iSegReg The segment register number (valid). … … 4710 4710 4711 4711 iemRegAddToRip(pIemCpu, cbInstr); 4712 if (iSegReg == X86_SREG_SS)4713 EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip);4714 4712 return VINF_SUCCESS; 4715 4713 } … … 4739 4737 *pSel = uSel; 4740 4738 iemRegAddToRip(pIemCpu, cbInstr); 4741 EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip);4742 4739 return VINF_SUCCESS; 4743 4740 } … … 4881 4878 4882 4879 iemRegAddToRip(pIemCpu, cbInstr); 4883 if (iSegReg == X86_SREG_SS)4884 EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip);4885 4880 return VINF_SUCCESS; 4881 } 4882 4883 4884 /** 4885 * Implements 'mov SReg, r/m'. 4886 * 4887 * @param iSegReg The segment register number (valid). 4888 * @param uSel The new selector value. 4889 */ 4890 IEM_CIMPL_DEF_2(iemCImpl_load_SReg, uint8_t, iSegReg, uint16_t, uSel) 4891 { 4892 VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, uSel); 4893 if (rcStrict == VINF_SUCCESS) 4894 { 4895 if (iSegReg == X86_SREG_SS) 4896 { 4897 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 4898 EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip); 4899 } 4900 } 4901 return rcStrict; 4902 } 4903 4904 4905 /** 4906 * Implements 'pop SReg'. 4907 * 4908 * @param iSegReg The segment register number (valid). 4909 * @param enmEffOpSize The efficient operand size (valid). 4910 */ 4911 IEM_CIMPL_DEF_2(iemOpCImpl_pop_Sreg, uint8_t, iSegReg, IEMMODE, enmEffOpSize) 4912 { 4913 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 4914 VBOXSTRICTRC rcStrict; 4915 4916 /* 4917 * Read the selector off the stack and join paths with mov ss, reg. 4918 */ 4919 RTUINT64U TmpRsp; 4920 TmpRsp.u = pCtx->rsp; 4921 switch (enmEffOpSize) 4922 { 4923 case IEMMODE_16BIT: 4924 { 4925 uint16_t uSel; 4926 rcStrict = iemMemStackPopU16Ex(pIemCpu, &uSel, &TmpRsp); 4927 if (rcStrict == VINF_SUCCESS) 4928 rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, uSel); 4929 break; 4930 } 4931 4932 case IEMMODE_32BIT: 4933 { 4934 uint32_t u32Value; 4935 rcStrict = iemMemStackPopU32Ex(pIemCpu, &u32Value, &TmpRsp); 4936 if (rcStrict == VINF_SUCCESS) 4937 rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, (uint16_t)u32Value); 4938 break; 4939 } 4940 4941 case IEMMODE_64BIT: 4942 { 4943 uint64_t u64Value; 4944 rcStrict = iemMemStackPopU64Ex(pIemCpu, &u64Value, &TmpRsp); 4945 if (rcStrict == VINF_SUCCESS) 4946 rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, (uint16_t)u64Value); 4947 break; 4948 } 4949 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 4950 } 4951 4952 /* 4953 * Commit the stack on success. 4954 */ 4955 if (rcStrict == VINF_SUCCESS) 4956 { 4957 pCtx->rsp = TmpRsp.u; 4958 if (iSegReg == X86_SREG_SS) 4959 EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip); 4960 } 4961 return rcStrict; 4886 4962 } 4887 4963 … … 4923 4999 } 4924 5000 4925 return rcStrict;4926 }4927 4928 4929 /**4930 * Implements 'pop SReg'.4931 *4932 * @param iSegReg The segment register number (valid).4933 * @param enmEffOpSize The efficient operand size (valid).4934 */4935 IEM_CIMPL_DEF_2(iemOpCImpl_pop_Sreg, uint8_t, iSegReg, IEMMODE, enmEffOpSize)4936 {4937 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);4938 VBOXSTRICTRC rcStrict;4939 4940 /*4941 * Read the selector off the stack and join paths with mov ss, reg.4942 */4943 RTUINT64U TmpRsp;4944 TmpRsp.u = pCtx->rsp;4945 switch (enmEffOpSize)4946 {4947 case IEMMODE_16BIT:4948 {4949 uint16_t uSel;4950 rcStrict = iemMemStackPopU16Ex(pIemCpu, &uSel, &TmpRsp);4951 if (rcStrict == VINF_SUCCESS)4952 rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, uSel);4953 break;4954 }4955 4956 case IEMMODE_32BIT:4957 {4958 uint32_t u32Value;4959 rcStrict = iemMemStackPopU32Ex(pIemCpu, &u32Value, &TmpRsp);4960 if (rcStrict == VINF_SUCCESS)4961 rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, (uint16_t)u32Value);4962 break;4963 }4964 4965 case IEMMODE_64BIT:4966 {4967 uint64_t u64Value;4968 rcStrict = iemMemStackPopU64Ex(pIemCpu, &u64Value, &TmpRsp);4969 if (rcStrict == VINF_SUCCESS)4970 rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, (uint16_t)u64Value);4971 break;4972 }4973 IEM_NOT_REACHED_DEFAULT_CASE_RET();4974 }4975 4976 /*4977 * Commit the stack on success.4978 */4979 if (rcStrict == VINF_SUCCESS)4980 pCtx->rsp = TmpRsp.u;4981 5001 return rcStrict; 4982 5002 } -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h
r36829 r36833 66 66 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 67 67 if (uCounterReg == 0) 68 { 69 iemRegAddToRip(pIemCpu, cbInstr); 68 70 return VINF_SUCCESS; 71 } 69 72 70 73 PCCPUMSELREGHID pSrc1Hid = iemSRegGetHid(pIemCpu, iEffSeg); … … 218 221 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 219 222 if (uCounterReg == 0) 223 { 224 iemRegAddToRip(pIemCpu, cbInstr); 220 225 return VINF_SUCCESS; 226 } 221 227 222 228 PCCPUMSELREGHID pSrc1Hid = iemSRegGetHid(pIemCpu, iEffSeg); … … 370 376 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 371 377 if (uCounterReg == 0) 378 { 379 iemRegAddToRip(pIemCpu, cbInstr); 372 380 return VINF_SUCCESS; 381 } 373 382 374 383 VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->esHid, X86_SREG_ES); … … 495 504 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 496 505 if (uCounterReg == 0) 506 { 507 iemRegAddToRip(pIemCpu, cbInstr); 497 508 return VINF_SUCCESS; 509 } 498 510 499 511 VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->esHid, X86_SREG_ES); … … 622 634 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 623 635 if (uCounterReg == 0) 636 { 637 iemRegAddToRip(pIemCpu, cbInstr); 624 638 return VINF_SUCCESS; 639 } 625 640 626 641 PCCPUMSELREGHID pSrcHid = iemSRegGetHid(pIemCpu, iEffSeg); … … 734 749 if (rcStrict == VINF_SUCCESS) 735 750 iemRegAddToRip(pIemCpu, cbInstr); 736 else737 AssertFailed();738 751 739 752 return rcStrict; … … 753 766 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 754 767 if (uCounterReg == 0) 768 { 769 iemRegAddToRip(pIemCpu, cbInstr); 755 770 return VINF_SUCCESS; 771 } 756 772 757 773 VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, &pCtx->esHid, X86_SREG_ES); … … 866 882 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 867 883 if (uCounterReg == 0) 884 { 885 iemRegAddToRip(pIemCpu, cbInstr); 868 886 return VINF_SUCCESS; 887 } 869 888 870 889 PCCPUMSELREGHID pSrcHid = iemSRegGetHid(pIemCpu, iEffSeg); … … 1038 1057 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 1039 1058 if (uCounterReg == 0) 1059 { 1060 iemRegAddToRip(pIemCpu, cbInstr); 1040 1061 return VINF_SUCCESS; 1062 } 1041 1063 1042 1064 rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, &pCtx->esHid, X86_SREG_ES); … … 1232 1254 ADDR_TYPE uCounterReg = pCtx->ADDR_rCX; 1233 1255 if (uCounterReg == 0) 1256 { 1257 iemRegAddToRip(pIemCpu, cbInstr); 1234 1258 return VINF_SUCCESS; 1259 } 1235 1260 1236 1261 PCCPUMSELREGHID pHid = iemSRegGetHid(pIemCpu, iEffSeg); -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r36829 r36833 5993 5993 IEM_MC_ARG(uint16_t, u16Value, 1); 5994 5994 IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB); 5995 IEM_MC_CALL_CIMPL_2(iemCImpl_ LoadSReg, iSRegArg, u16Value);5995 IEM_MC_CALL_CIMPL_2(iemCImpl_load_SReg, iSRegArg, u16Value); 5996 5996 IEM_MC_END(); 5997 5997 } … … 6008 6008 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 6009 6009 IEM_MC_FETCH_MEM_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst); 6010 IEM_MC_CALL_CIMPL_2(iemCImpl_ LoadSReg, iSRegArg, u16Value);6010 IEM_MC_CALL_CIMPL_2(iemCImpl_load_SReg, iSRegArg, u16Value); 6011 6011 IEM_MC_END(); 6012 6012 } … … 6017 6017 /** Opcode 0x8f. */ 6018 6018 FNIEMOP_STUB(iemOp_pop_Ev); 6019 /** @todo DO ME NEXT, PLEEEASE. */ 6019 6020 6020 6021
Note:
See TracChangeset
for help on using the changeset viewer.