Changeset 39970 in vbox for trunk/src/VBox
- Timestamp:
- Feb 2, 2012 9:29:12 PM (13 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r39962 r39970 5002 5002 #define IEM_MC_STORE_GREG_U64_CONST IEM_MC_STORE_GREG_U64 5003 5003 #define IEM_MC_CLEAR_HIGH_GREG_U64(a_iGReg) *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) &= UINT32_MAX 5004 #define IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(a_pu32Dst) do { (a_pu32Dst)[1] = 0; } while (0) 5004 5005 5005 5006 #define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg) (a_pu8Dst) = iemGRegRefU8(pIemCpu, (a_iGReg)) 5006 5007 #define IEM_MC_REF_GREG_U16(a_pu16Dst, a_iGReg) (a_pu16Dst) = (uint16_t *)iemGRegRef(pIemCpu, (a_iGReg)) 5007 /** @todo User of IEM_MC_REF_GREG_U32 needs to clear the high bits on 5008 * commit.*/5008 /** @todo User of IEM_MC_REF_GREG_U32 needs to clear the high bits on commit. 5009 * Use IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF! */ 5009 5010 #define IEM_MC_REF_GREG_U32(a_pu32Dst, a_iGReg) (a_pu32Dst) = (uint32_t *)iemGRegRef(pIemCpu, (a_iGReg)) 5010 5011 #define IEM_MC_REF_GREG_U64(a_pu64Dst, a_iGReg) (a_pu64Dst) = (uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) … … 5239 5240 IEM_MC_RETURN_ON_FAILURE(iemOpHlpCalcRmEffAddr(pIemCpu, (bRm), &(a_GCPtrEff))) 5240 5241 5242 #define IEM_MC_CALL_VOID_AIMPL_1(a_pfn, a0) (a_pfn)((a0)) 5241 5243 #define IEM_MC_CALL_VOID_AIMPL_2(a_pfn, a0, a1) (a_pfn)((a0), (a1)) 5242 5244 #define IEM_MC_CALL_VOID_AIMPL_3(a_pfn, a0, a1, a2) (a_pfn)((a0), (a1), (a2)) … … 6000 6002 } 6001 6003 pIemCpu->cIOReads++; 6002 *pu32Value = 0x ffffffff;6004 *pu32Value = 0xcccccccc; 6003 6005 return VINF_SUCCESS; 6004 6006 } -
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r38026 r39970 1234 1234 IEMIMPL_DIV_OP idiv, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF) 1235 1235 1236 1237 ; 1238 ; BSWAP. No flag changes. 1239 ; 1240 ; Each function takes one argument, pointer to the value to bswap 1241 ; (input/output). They all return void. 1242 ; 1243 BEGINPROC_FASTCALL iemAImpl_bswap_u16, 4 1244 PROLOGUE_1_ARGS 1245 mov T0_32, [A0] ; just in case any of the upper bits are used. 1246 db 66h 1247 bswap T0_32 1248 mov [A0], T0_32 1249 EPILOGUE_1_ARGS 0 1250 ENDPROC iemAImpl_bswap_u16 1251 1252 BEGINPROC_FASTCALL iemAImpl_bswap_u32, 4 1253 PROLOGUE_1_ARGS 1254 mov T0_32, [A0] 1255 bswap T0_32 1256 mov [A0], T0_32 1257 EPILOGUE_1_ARGS 0 1258 ENDPROC iemAImpl_bswap_u32 1259 1260 BEGINPROC_FASTCALL iemAImpl_bswap_u64, 4 1261 %ifdef RT_ARCH_AMD64 1262 PROLOGUE_1_ARGS 1263 mov T0, [A0] 1264 bswap T0 1265 mov [A0], T0 1266 EPILOGUE_1_ARGS 0 1267 %else 1268 PROLOGUE_1_ARGS 1269 mov T0, [A0] 1270 mov T1, [A0 + 4] 1271 bswap T0 1272 bswap T1 1273 mov [A0 + 4], T0 1274 mov [A0], T1 1275 EPILOGUE_1_ARGS 0 1276 %endif 1277 ENDPROC iemAImpl_bswap_u64 1278 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h
r39958 r39970 1158 1158 return rcStrict; 1159 1159 1160 *puMem = u32Value;1160 *puMem = (OP_TYPE)u32Value; 1161 1161 VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmap(pIemCpu, puMem, IEM_ACCESS_DATA_W); 1162 1162 AssertLogRelReturn(rcStrict2 == VINF_SUCCESS, VERR_IEM_IPE_1); /* See non-rep version. */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r39958 r39970 4103 4103 FNIEMOP_STUB(iemOp_Grp9); 4104 4104 4105 #if 0 4105 4106 4106 /** 4107 4107 * Common 'bswap register' helper. 4108 4108 */ 4109 FNIEMOP_DEF_ 2(iemOpCommonBswapGReg, PCIEMOPUNARYSIZES, pImpl, uint8_t, iReg)4109 FNIEMOP_DEF_1(iemOpCommonBswapGReg, uint8_t, iReg) 4110 4110 { 4111 4111 IEMOP_HLP_NO_LOCK_PREFIX(); … … 4113 4113 { 4114 4114 case IEMMODE_16BIT: 4115 IEM_MC_BEGIN(2, 0); 4116 IEM_MC_ARG(uint16_t *, pu16Dst, 0); 4117 IEM_MC_ARG(uint32_t *, pEFlags, 1); 4118 IEM_MC_REF_GREG_U16(pu16Dst, iReg); 4119 IEM_MC_REF_EFLAGS(pEFlags); 4120 IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU16, pu16Dst, pEFlags); 4115 IEM_MC_BEGIN(1, 0); 4116 IEM_MC_ARG(uint32_t *, pu32Dst, 0); 4117 IEM_MC_REF_GREG_U32(pu32Dst, iReg); /* Don't clear the high dword! */ 4118 IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u16, pu32Dst); 4121 4119 IEM_MC_ADVANCE_RIP(); 4122 4120 IEM_MC_END(); … … 4124 4122 4125 4123 case IEMMODE_32BIT: 4126 IEM_MC_BEGIN( 2, 0);4124 IEM_MC_BEGIN(1, 0); 4127 4125 IEM_MC_ARG(uint32_t *, pu32Dst, 0); 4128 IEM_MC_ARG(uint32_t *, pEFlags, 1);4129 4126 IEM_MC_REF_GREG_U32(pu32Dst, iReg); 4130 IEM_MC_ REF_EFLAGS(pEFlags);4131 IEM_MC_CALL_VOID_AIMPL_ 2(pImpl->pfnNormalU32, pu32Dst, pEFlags);4127 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst); 4128 IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u32, pu32Dst); 4132 4129 IEM_MC_ADVANCE_RIP(); 4133 4130 IEM_MC_END(); … … 4135 4132 4136 4133 case IEMMODE_64BIT: 4137 IEM_MC_BEGIN( 2, 0);4134 IEM_MC_BEGIN(1, 0); 4138 4135 IEM_MC_ARG(uint64_t *, pu64Dst, 0); 4139 IEM_MC_ARG(uint32_t *, pEFlags, 1);4140 4136 IEM_MC_REF_GREG_U64(pu64Dst, iReg); 4141 IEM_MC_REF_EFLAGS(pEFlags); 4142 IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU64, pu64Dst, pEFlags); 4137 IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u64, pu64Dst); 4143 4138 IEM_MC_ADVANCE_RIP(); 4144 4139 IEM_MC_END(); 4145 4140 return VINF_SUCCESS; 4146 } 4147 return VINF_SUCCESS; 4141 4142 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 4143 } 4148 4144 } 4149 4145 … … 4153 4149 { 4154 4150 IEMOP_MNEMONIC("bswap rAX/r8"); 4155 return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xAX | pIemCpu->uRexReg); 4156 } 4157 4158 4159 #else 4160 FNIEMOP_STUB(iemOp_bswap_rAX_r8); 4161 #endif 4151 return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xAX | pIemCpu->uRexReg); 4152 } 4153 4154 4162 4155 /** Opcode 0x0f 0xc9. */ 4163 FNIEMOP_STUB(iemOp_bswap_rCX_r9); 4156 FNIEMOP_DEF(iemOp_bswap_rCX_r9) 4157 { 4158 IEMOP_MNEMONIC("bswap rCX/r9"); 4159 return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xCX | pIemCpu->uRexReg); 4160 } 4161 4162 4164 4163 /** Opcode 0x0f 0xca. */ 4165 FNIEMOP_STUB(iemOp_bswap_rDX_r10); 4164 FNIEMOP_DEF(iemOp_bswap_rDX_r10) 4165 { 4166 IEMOP_MNEMONIC("bswap rDX/r9"); 4167 return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDX | pIemCpu->uRexReg); 4168 } 4169 4170 4166 4171 /** Opcode 0x0f 0xcb. */ 4167 FNIEMOP_STUB(iemOp_bswap_rBX_r11); 4172 FNIEMOP_DEF(iemOp_bswap_rBX_r11) 4173 { 4174 IEMOP_MNEMONIC("bswap rBX/r9"); 4175 return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBX | pIemCpu->uRexReg); 4176 } 4177 4178 4168 4179 /** Opcode 0x0f 0xcc. */ 4169 FNIEMOP_STUB(iemOp_bswap_rSP_r12); 4180 FNIEMOP_DEF(iemOp_bswap_rSP_r12) 4181 { 4182 IEMOP_MNEMONIC("bswap rSP/r12"); 4183 return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSP | pIemCpu->uRexReg); 4184 } 4185 4186 4170 4187 /** Opcode 0x0f 0xcd. */ 4171 FNIEMOP_STUB(iemOp_bswap_rBP_r13); 4188 FNIEMOP_DEF(iemOp_bswap_rBP_r13) 4189 { 4190 IEMOP_MNEMONIC("bswap rBP/r13"); 4191 return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBP | pIemCpu->uRexReg); 4192 } 4193 4194 4172 4195 /** Opcode 0x0f 0xce. */ 4173 FNIEMOP_STUB(iemOp_bswap_rSI_r14); 4196 FNIEMOP_DEF(iemOp_bswap_rSI_r14) 4197 { 4198 IEMOP_MNEMONIC("bswap rSI/r14"); 4199 return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSI | pIemCpu->uRexReg); 4200 } 4201 4202 4174 4203 /** Opcode 0x0f 0xcf. */ 4175 FNIEMOP_STUB(iemOp_bswap_rDI_r15); 4204 FNIEMOP_DEF(iemOp_bswap_rDI_r15) 4205 { 4206 IEMOP_MNEMONIC("bswap rDI/r15"); 4207 return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDI | pIemCpu->uRexReg); 4208 } 4209 4210 4176 4211 4177 4212 /** Opcode 0x0f 0xd0. */ -
trunk/src/VBox/VMM/include/IEMInternal.h
r39944 r39970 671 671 /** @} */ 672 672 673 /** @name Byte Swap. 674 * @{ */ 675 IEM_DECL_IMPL_TYPE(void, iemAImpl_bswap_u16,(uint32_t *pu32Dst)); /* Yes, 32-bit register access. */ 676 IEM_DECL_IMPL_TYPE(void, iemAImpl_bswap_u32,(uint32_t *pu32Dst)); 677 IEM_DECL_IMPL_TYPE(void, iemAImpl_bswap_u64,(uint64_t *pu64Dst)); 678 /** @} */ 679 673 680 674 681 /** @name Function tables. -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r39402 r39970 268 268 #define IEM_MC_STORE_GREG_U64_CONST(a_iGReg, a_u64C) do { AssertCompile((uint64_t)(a_u64C) == (a_u64C)); } while (0) 269 269 #define IEM_MC_CLEAR_HIGH_GREG_U64(a_iGReg) do { } while (0) 270 #define IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(a_pu32Dst) do { CHK_PTYPE(uint32_t *, a_pu32Dst); } while (0) 270 271 #define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg) do { (a_pu8Dst) = (uint8_t *)((uintptr_t)0); CHK_PTYPE(uint8_t *, a_pu8Dst); } while (0) 271 272 #define IEM_MC_REF_GREG_U16(a_pu16Dst, a_iGReg) do { (a_pu16Dst) = (uint16_t *)((uintptr_t)0); CHK_PTYPE(uint16_t *, a_pu16Dst); } while (0) … … 372 373 #define IEM_MC_MEM_COMMIT_AND_UNMAP(a_pvMem, a_fAccess) do {} while (0) 373 374 #define IEM_MC_CALC_RM_EFF_ADDR(a_GCPtrEff, bRm) do { (a_GCPtrEff) = 0; CHK_GCPTR(a_GCPtrEff); } while (0) 375 #define IEM_MC_CALL_VOID_AIMPL_1(a_pfn, a0) do {} while (0) 374 376 #define IEM_MC_CALL_VOID_AIMPL_2(a_pfn, a0, a1) do {} while (0) 375 377 #define IEM_MC_CALL_VOID_AIMPL_3(a_pfn, a0, a1, a2) do {} while (0)
Note:
See TracChangeset
for help on using the changeset viewer.