Changeset 8149 in vbox
- Timestamp:
- Apr 18, 2008 1:56:29 PM (16 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
-
include/VBox/dis.h (modified) (6 diffs)
-
src/VBox/Disassembler/DisasmCore.cpp (modified) (81 diffs)
-
src/VBox/VMM/VMMAll/EMAll.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/dis.h
r8142 r8149 124 124 * @{ 125 125 */ 126 #define USE_BASE RT_BIT(0) 127 #define USE_INDEX RT_BIT(1) 128 #define USE_SCALE RT_BIT(2) 129 #define USE_REG_GEN8 RT_BIT(3) 130 #define USE_REG_GEN16 RT_BIT(4) 131 #define USE_REG_GEN32 RT_BIT(5) 132 #define USE_REG_FP RT_BIT(6) 133 #define USE_REG_MMX RT_BIT(7) 134 #define USE_REG_XMM RT_BIT(8) 135 #define USE_REG_CR RT_BIT(9) 136 #define USE_REG_DBG RT_BIT(10) 137 #define USE_REG_SEG RT_BIT(11) 138 #define USE_REG_TEST RT_BIT(12) 139 #define USE_DISPLACEMENT8 RT_BIT(13) 140 #define USE_DISPLACEMENT16 RT_BIT(14) 141 #define USE_DISPLACEMENT32 RT_BIT(15) 142 #define USE_IMMEDIATE8 RT_BIT(16) 143 #define USE_IMMEDIATE8_REL RT_BIT(17) 144 #define USE_IMMEDIATE16 RT_BIT(18) 145 #define USE_IMMEDIATE16_REL RT_BIT(19) 146 #define USE_IMMEDIATE32 RT_BIT(20) 147 #define USE_IMMEDIATE32_REL RT_BIT(21) 148 #define USE_IMMEDIATE64 RT_BIT(22) 149 #define USE_IMMEDIATE_ADDR_0_32 RT_BIT(23) 150 #define USE_IMMEDIATE_ADDR_16_32 RT_BIT(24) 151 #define USE_IMMEDIATE_ADDR_0_16 RT_BIT(25) 152 #define USE_IMMEDIATE_ADDR_16_16 RT_BIT(26) 126 #define USE_BASE RT_BIT_64(0) 127 #define USE_INDEX RT_BIT_64(1) 128 #define USE_SCALE RT_BIT_64(2) 129 #define USE_REG_GEN8 RT_BIT_64(3) 130 #define USE_REG_GEN16 RT_BIT_64(4) 131 #define USE_REG_GEN32 RT_BIT_64(5) 132 #define USE_REG_GEN64 RT_BIT_64(6) 133 #define USE_REG_FP RT_BIT_64(7) 134 #define USE_REG_MMX RT_BIT_64(8) 135 #define USE_REG_XMM RT_BIT_64(9) 136 #define USE_REG_CR RT_BIT_64(10) 137 #define USE_REG_DBG RT_BIT_64(11) 138 #define USE_REG_SEG RT_BIT_64(12) 139 #define USE_REG_TEST RT_BIT_64(13) 140 #define USE_DISPLACEMENT8 RT_BIT_64(14) 141 #define USE_DISPLACEMENT16 RT_BIT_64(15) 142 #define USE_DISPLACEMENT32 RT_BIT_64(16) 143 #define USE_IMMEDIATE8 RT_BIT_64(17) 144 #define USE_IMMEDIATE8_REL RT_BIT_64(18) 145 #define USE_IMMEDIATE16 RT_BIT_64(19) 146 #define USE_IMMEDIATE16_REL RT_BIT_64(20) 147 #define USE_IMMEDIATE32 RT_BIT_64(21) 148 #define USE_IMMEDIATE32_REL RT_BIT_64(22) 149 #define USE_IMMEDIATE64 RT_BIT_64(23) 150 #define USE_IMMEDIATE_ADDR_0_32 RT_BIT_64(24) 151 #define USE_IMMEDIATE_ADDR_16_32 RT_BIT_64(25) 152 #define USE_IMMEDIATE_ADDR_0_16 RT_BIT_64(26) 153 #define USE_IMMEDIATE_ADDR_16_16 RT_BIT_64(27) 153 154 /** DS:ESI */ 154 #define USE_POINTER_DS_BASED RT_BIT (27)155 #define USE_POINTER_DS_BASED RT_BIT_64(28) 155 156 /** ES:EDI */ 156 #define USE_POINTER_ES_BASED RT_BIT (28)157 #define USE_IMMEDIATE16_SX8 RT_BIT (29)158 #define USE_IMMEDIATE32_SX8 RT_BIT (30)157 #define USE_POINTER_ES_BASED RT_BIT_64(29) 158 #define USE_IMMEDIATE16_SX8 RT_BIT_64(30) 159 #define USE_IMMEDIATE32_SX8 RT_BIT_64(31) 159 160 160 161 #define USE_IMMEDIATE (USE_IMMEDIATE8|USE_IMMEDIATE16|USE_IMMEDIATE32|USE_IMMEDIATE64|USE_IMMEDIATE8_REL|USE_IMMEDIATE16_REL|USE_IMMEDIATE32_REL|USE_IMMEDIATE_ADDR_0_32|USE_IMMEDIATE_ADDR_16_32|USE_IMMEDIATE_ADDR_0_16|USE_IMMEDIATE_ADDR_16_16|USE_IMMEDIATE16_SX8|USE_IMMEDIATE32_SX8) … … 291 292 { 292 293 uint32_t type; 293 uint32_t flags;294 294 uint32_t size; 295 uint64_t flags; 295 296 296 297 union … … 331 332 int32_t disp8, disp16, disp32; 332 333 333 uint32_t flags;334 335 334 uint32_t size; 335 336 uint64_t flags; 336 337 337 338 union … … 340 341 uint32_t reg_gen16; 341 342 uint32_t reg_gen32; 343 uint64_t reg_gen64; 342 344 /** ST(0) - ST(7) */ 343 345 uint32_t reg_fp; … … 351 353 uint32_t reg_test; 352 354 /** CR0-CR4 */ 353 uint 32_t reg_ctrl;355 uint64_t reg_ctrl; 354 356 /** DR0-DR7 */ 355 357 uint32_t reg_dbg; … … 568 570 */ 569 571 DISDECL(int) DISQueryParamVal(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, POP_PARAMETER pParam, POP_PARAMVAL pParamVal, PARAM_TYPE parmtype); 570 DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, POP_PARAMETER pParam, uint32_t**ppReg, size_t *pcbSize);572 DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, POP_PARAMETER pParam, void **ppReg, size_t *pcbSize); 571 573 572 574 DISDECL(int) DISFetchReg8(PCPUMCTXCORE pCtx, unsigned reg8, uint8_t *pVal); -
trunk/src/VBox/Disassembler/DisasmCore.cpp
r8142 r8149 265 265 { 266 266 pCpu->lastprefix = opcode; 267 switch (opcode)267 switch (opcode) 268 268 { 269 269 case OP_INVALID: … … 287 287 case OP_ADRSIZE: 288 288 pCpu->prefix |= PREFIX_ADDRSIZE; 289 if (pCpu->mode == CPUMODE_16BIT)289 if (pCpu->mode == CPUMODE_16BIT) 290 290 pCpu->addrmode = CPUMODE_32BIT; 291 291 else pCpu->addrmode = CPUMODE_16BIT; … … 296 296 case OP_OPSIZE: 297 297 pCpu->prefix |= PREFIX_OPSIZE; 298 if (pCpu->mode == CPUMODE_16BIT)298 if (pCpu->mode == CPUMODE_16BIT) 299 299 pCpu->opmode = CPUMODE_32BIT; 300 300 else pCpu->opmode = CPUMODE_16BIT; … … 378 378 pCpu->param3.param = pOp->param3; 379 379 380 if(pOp->idxParse1 != IDX_ParseNop) { 380 if (pOp->idxParse1 != IDX_ParseNop) 381 { 381 382 size += pCpu->pfnDisasmFnTable[pOp->idxParse1](lpszCodeBlock, pOp, &pCpu->param1, pCpu); 382 383 if (fFiltered == false) pCpu->param1.size = DISGetParamSize(pCpu, &pCpu->param1); 383 384 } 384 if(pOp->idxParse2 != IDX_ParseNop) { 385 386 if (pOp->idxParse2 != IDX_ParseNop) 387 { 385 388 size += pCpu->pfnDisasmFnTable[pOp->idxParse2](lpszCodeBlock+size, pOp, &pCpu->param2, pCpu); 386 389 if (fFiltered == false) pCpu->param2.size = DISGetParamSize(pCpu, &pCpu->param2); 387 390 } 388 if(pOp->idxParse3 != IDX_ParseNop) { 391 392 if (pOp->idxParse3 != IDX_ParseNop) 393 { 389 394 size += pCpu->pfnDisasmFnTable[pOp->idxParse3](lpszCodeBlock+size, pOp, &pCpu->param3, pCpu); 390 395 if (fFiltered == false) pCpu->param3.size = DISGetParamSize(pCpu, &pCpu->param3); … … 406 411 407 412 index = pCpu->opcode - 0xD8; 408 if (pCpu->ModRM <= 0xBF)413 if (pCpu->ModRM <= 0xBF) 409 414 { 410 415 fpop = &(g_paMapX86_FP_Low[index])[MODRM_REG(pCpu->ModRM)]; … … 430 435 431 436 // Little hack to make sure the ModRM byte is included in the returned size 432 if(fpop->idxParse1 != IDX_ParseModRM && fpop->idxParse2 != IDX_ParseModRM) 433 { 437 if (fpop->idxParse1 != IDX_ParseModRM && fpop->idxParse2 != IDX_ParseModRM) 434 438 size = sizeof(uint8_t); //ModRM byte 435 } 436 437 if(fpop->idxParse1 != IDX_ParseNop) { 439 440 if (fpop->idxParse1 != IDX_ParseNop) 438 441 size += pCpu->pfnDisasmFnTable[fpop->idxParse1](lpszCodeBlock+size, (PCOPCODE)fpop, pParam, pCpu); 439 } 440 if (fpop->idxParse2 != IDX_ParseNop) {442 443 if (fpop->idxParse2 != IDX_ParseNop) 441 444 size += pCpu->pfnDisasmFnTable[fpop->idxParse2](lpszCodeBlock+size, (PCOPCODE)fpop, pParam, pCpu); 442 }443 445 } 444 446 else … … 490 492 index = SIB_INDEX(pCpu->SIB); 491 493 492 if (szSIBIndexReg[index])494 if (szSIBIndexReg[index]) 493 495 { 494 496 pParam->flags |= USE_INDEX; 495 497 pParam->index.reg_gen = index; 496 498 497 if (scale != 0)499 if (scale != 0) 498 500 { 499 501 pParam->flags |= USE_SCALE; … … 501 503 } 502 504 503 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0)505 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0) 504 506 disasmAddStringF(szTemp, sizeof(szTemp), "%s%s", szSIBIndexReg[index], szSIBScale[scale]); 505 507 else … … 508 510 else 509 511 { 510 if (base != 5 || MODRM_MOD(pCpu->ModRM) != 0)512 if (base != 5 || MODRM_MOD(pCpu->ModRM) != 0) 511 513 disasmAddStringF(szTemp, sizeof(szTemp), "%s", szSIBBaseReg[base]); 512 514 } 513 515 514 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0)516 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0) 515 517 { 516 518 // [scaled index] + disp32 … … 540 542 541 543 base = SIB_BASE(pCpu->SIB); 542 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0)544 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0) 543 545 {//additional 32 bits displacement 544 546 pCpu->disp = DISReadDWord(pCpu, lpszCodeBlock); … … 557 559 558 560 base = SIB_BASE(pCpu->SIB); 559 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0)561 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0) 560 562 {//additional 32 bits displacement 561 563 size += sizeof(int32_t); … … 575 577 int vtype = OP_PARM_VTYPE(pParam->param); 576 578 577 switch (vtype)579 switch (vtype) 578 580 { 579 581 case OP_PARM_G: //general purpose register … … 584 586 if (IS_OP_PARM_RARE(vtype)) 585 587 { 586 switch (vtype)588 switch (vtype) 587 589 { 588 590 case OP_PARM_C: //control register … … 636 638 //TODO: bound 637 639 638 if (pCpu->addrmode == CPUMODE_32BIT)640 if (pCpu->addrmode == CPUMODE_32BIT) 639 641 {//32 bits addressing mode 640 switch (mod)642 switch (mod) 641 643 { 642 644 case 0: //effective address 643 645 disasmGetPtrString(pCpu, pOp, pParam); 644 646 disasmAddChar(pParam->szParam, '['); 645 if (rm == 4) {//SIB byte follows ModRM647 if (rm == 4) {//SIB byte follows ModRM 646 648 UseSIB(lpszCodeBlock, pOp, pParam, pCpu); 647 649 } 648 650 else 649 if (rm == 5) {//32 bits displacement651 if (rm == 5) {//32 bits displacement 650 652 pParam->flags |= USE_DISPLACEMENT32; 651 653 pParam->disp32 = pCpu->disp; … … 662 664 disasmGetPtrString(pCpu, pOp, pParam); 663 665 disasmAddChar(pParam->szParam, '['); 664 if (rm == 4) {//SIB byte follows ModRM666 if (rm == 4) {//SIB byte follows ModRM 665 667 UseSIB(lpszCodeBlock, pOp, pParam, pCpu); 666 668 } … … 673 675 pParam->flags |= USE_DISPLACEMENT8; 674 676 675 if (pParam->disp8 != 0)677 if (pParam->disp8 != 0) 676 678 { 677 if (pParam->disp8 > 0)679 if (pParam->disp8 > 0) 678 680 disasmAddChar(pParam->szParam, '+'); 679 681 disasmPrintDisp8(pParam); … … 685 687 disasmGetPtrString(pCpu, pOp, pParam); 686 688 disasmAddChar(pParam->szParam, '['); 687 if (rm == 4) {//SIB byte follows ModRM689 if (rm == 4) {//SIB byte follows ModRM 688 690 UseSIB(lpszCodeBlock, pOp, pParam, pCpu); 689 691 } … … 696 698 pParam->flags |= USE_DISPLACEMENT32; 697 699 698 if (pParam->disp32 != 0)700 if (pParam->disp32 != 0) 699 701 { 700 702 disasmAddChar(pParam->szParam, '+'); … … 711 713 else 712 714 {//16 bits addressing mode 713 switch (mod)715 switch (mod) 714 716 { 715 717 case 0: //effective address 716 718 disasmGetPtrString(pCpu, pOp, pParam); 717 719 disasmAddChar(pParam->szParam, '['); 718 if (rm == 6)720 if (rm == 6) 719 721 {//16 bits displacement 720 722 pParam->disp16 = pCpu->disp; … … 737 739 pParam->flags |= USE_BASE | USE_DISPLACEMENT8; 738 740 739 if (pParam->disp8 != 0)741 if (pParam->disp8 != 0) 740 742 { 741 if (pParam->disp8 > 0)743 if (pParam->disp8 > 0) 742 744 disasmAddChar(pParam->szParam, '+'); 743 745 disasmPrintDisp8(pParam); … … 753 755 pParam->flags |= USE_BASE | USE_DISPLACEMENT16; 754 756 755 if (pParam->disp16 != 0)757 if (pParam->disp16 != 0) 756 758 { 757 759 disasmAddChar(pParam->szParam, '+'); … … 779 781 mod = MODRM_MOD(pCpu->ModRM); 780 782 781 if (!pSibInc)783 if (!pSibInc) 782 784 { 783 785 pSibInc = &sibinc; … … 786 788 *pSibInc = 0; 787 789 788 if (pCpu->addrmode == CPUMODE_32BIT)790 if (pCpu->addrmode == CPUMODE_32BIT) 789 791 {//32 bits addressing mode 790 if (mod != 3 && rm == 4)792 if (mod != 3 && rm == 4) 791 793 {//SIB byte follows ModRM 792 794 *pSibInc = ParseSIB(lpszCodeBlock, pOp, pParam, pCpu); … … 795 797 } 796 798 797 switch (mod)799 switch (mod) 798 800 { 799 801 case 0: //effective address 800 if (rm == 5) {//32 bits displacement802 if (rm == 5) {//32 bits displacement 801 803 pCpu->disp = DISReadDWord(pCpu, lpszCodeBlock); 802 804 size += sizeof(int32_t); … … 821 823 else 822 824 {//16 bits addressing mode 823 switch (mod)825 switch (mod) 824 826 { 825 827 case 0: //effective address 826 if (rm == 6) {828 if (rm == 6) { 827 829 pCpu->disp = DISReadWord(pCpu, lpszCodeBlock); 828 830 size += sizeof(uint16_t); … … 857 859 mod = MODRM_MOD(pCpu->ModRM); 858 860 859 if (!pSibInc)861 if (!pSibInc) 860 862 { 861 863 pSibInc = &sibinc; … … 864 866 *pSibInc = 0; 865 867 866 if (pCpu->addrmode == CPUMODE_32BIT)868 if (pCpu->addrmode == CPUMODE_32BIT) 867 869 {//32 bits addressing mode 868 if (mod != 3 && rm == 4)870 if (mod != 3 && rm == 4) 869 871 {//SIB byte follows ModRM 870 872 *pSibInc = ParseSIB_SizeOnly(lpszCodeBlock, pOp, pParam, pCpu); … … 873 875 } 874 876 875 switch (mod)877 switch (mod) 876 878 { 877 879 case 0: //effective address 878 if (rm == 5) {//32 bits displacement880 if (rm == 5) {//32 bits displacement 879 881 size += sizeof(int32_t); 880 882 } … … 896 898 else 897 899 {//16 bits addressing mode 898 switch (mod)900 switch (mod) 899 901 { 900 902 case 0: //effective address 901 if (rm == 6) {903 if (rm == 6) { 902 904 size += sizeof(uint16_t); 903 905 } … … 986 988 unsigned ParseImmByteSX(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 987 989 { 988 if (pCpu->opmode == CPUMODE_32BIT)990 if (pCpu->opmode == CPUMODE_32BIT) 989 991 { 990 992 pParam->parval = (uint32_t)(int8_t)DISReadByte(pCpu, lpszCodeBlock); … … 1059 1061 unsigned ParseImmV(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 1060 1062 { 1061 if (pCpu->opmode == CPUMODE_32BIT)1063 if (pCpu->opmode == CPUMODE_32BIT) 1062 1064 { 1063 1065 pParam->parval = DISReadDWord(pCpu, lpszCodeBlock); … … 1080 1082 unsigned ParseImmV_SizeOnly(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 1081 1083 { 1082 if (pCpu->opmode == CPUMODE_32BIT)1084 if (pCpu->opmode == CPUMODE_32BIT) 1083 1085 { 1084 1086 return sizeof(uint32_t); … … 1112 1114 unsigned ParseImmVRel(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 1113 1115 { 1114 if (pCpu->opmode == CPUMODE_32BIT)1116 if (pCpu->opmode == CPUMODE_32BIT) 1115 1117 { 1116 1118 pParam->parval = DISReadDWord(pCpu, lpszCodeBlock); … … 1134 1136 unsigned ParseImmVRel_SizeOnly(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 1135 1137 { 1136 if (pCpu->opmode == CPUMODE_32BIT)1138 if (pCpu->opmode == CPUMODE_32BIT) 1137 1139 { 1138 1140 return sizeof(int32_t); … … 1148 1150 { 1149 1151 disasmGetPtrString(pCpu, pOp, pParam); 1150 if (pCpu->addrmode == CPUMODE_32BIT)1151 { 1152 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p)1152 if (pCpu->addrmode == CPUMODE_32BIT) 1153 { 1154 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p) 1153 1155 {// far 16:32 pointer 1154 1156 pParam->parval = DISReadDWord(pCpu, lpszCodeBlock); … … 1174 1176 else 1175 1177 { 1176 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p)1178 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p) 1177 1179 {// far 16:16 pointer 1178 1180 pParam->parval = DISReadDWord(pCpu, lpszCodeBlock); … … 1200 1202 unsigned ParseImmAddr_SizeOnly(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 1201 1203 { 1202 if (pCpu->addrmode == CPUMODE_32BIT)1203 { 1204 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p)1204 if (pCpu->addrmode == CPUMODE_32BIT) 1205 { 1206 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p) 1205 1207 {// far 16:32 pointer 1206 1208 return sizeof(uint32_t) + sizeof(uint16_t); … … 1213 1215 else 1214 1216 { 1215 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p)1217 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p) 1216 1218 {// far 16:16 pointer 1217 1219 return sizeof(uint32_t); … … 1231 1233 */ 1232 1234 1233 if (pParam->param == OP_PARM_NONE)1235 if (pParam->param == OP_PARM_NONE) 1234 1236 { 1235 1237 /* No parameter at all. */ … … 1237 1239 } 1238 1240 1239 if (pParam->param < OP_PARM_REG_SEG_START)1241 if (pParam->param < OP_PARM_REG_SEG_START) 1240 1242 { 1241 1243 /* 32-bit EAX..EDI registers. */ 1242 1244 1243 if (pCpu->opmode == CPUMODE_32BIT)1245 if (pCpu->opmode == CPUMODE_32BIT) 1244 1246 { 1245 1247 /* Use 32-bit registers. */ … … 1258 1260 } 1259 1261 else 1260 if (pParam->param < OP_PARM_REG_GEN16_START)1262 if (pParam->param < OP_PARM_REG_GEN16_START) 1261 1263 { 1262 1264 /* Segment ES..GS registers. */ … … 1266 1268 } 1267 1269 else 1268 if (pParam->param < OP_PARM_REG_GEN8_START)1270 if (pParam->param < OP_PARM_REG_GEN8_START) 1269 1271 { 1270 1272 /* 16-bit AX..DI registers. */ … … 1274 1276 } 1275 1277 else 1276 if (pParam->param < OP_PARM_REG_FP_START)1278 if (pParam->param < OP_PARM_REG_FP_START) 1277 1279 { 1278 1280 /* 8-bit AL..DL, AH..DH registers. */ … … 1282 1284 } 1283 1285 else 1284 if (pParam->param <= OP_PARM_REGFP_7)1286 if (pParam->param <= OP_PARM_REGFP_7) 1285 1287 { 1286 1288 /* FPU registers. */ … … 1301 1303 1302 1304 pParam->flags |= USE_POINTER_DS_BASED; 1303 if (pCpu->addrmode == CPUMODE_32BIT)1305 if (pCpu->addrmode == CPUMODE_32BIT) 1304 1306 { 1305 1307 pParam->base.reg_gen32 = USE_REG_ESI; … … 1320 1322 1321 1323 pParam->flags |= USE_POINTER_DS_BASED; 1322 if (pCpu->addrmode == CPUMODE_32BIT)1324 if (pCpu->addrmode == CPUMODE_32BIT) 1323 1325 { 1324 1326 pParam->base.reg_gen32 = USE_REG_ESI; … … 1340 1342 1341 1343 pParam->flags |= USE_POINTER_ES_BASED; 1342 if (pCpu->addrmode == CPUMODE_32BIT)1344 if (pCpu->addrmode == CPUMODE_32BIT) 1343 1345 { 1344 1346 pParam->base.reg_gen32 = USE_REG_EDI; … … 1359 1361 1360 1362 pParam->flags |= USE_POINTER_ES_BASED; 1361 if (pCpu->addrmode == CPUMODE_32BIT)1363 if (pCpu->addrmode == CPUMODE_32BIT) 1362 1364 { 1363 1365 pParam->base.reg_gen32 = USE_REG_EDI; … … 1386 1388 if (pCpu->lastprefix) 1387 1389 { 1388 switch (pCpu->lastprefix)1390 switch (pCpu->lastprefix) 1389 1391 { 1390 1392 case OP_OPSIZE: /* 0x66 */ … … 1456 1458 pOp = (PCOPCODE)&g_aMapX86_Group1[idx+reg]; 1457 1459 //little hack to make sure the ModRM byte is included in the returned size 1458 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1460 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1459 1461 { 1460 1462 size = sizeof(uint8_t); //ModRM byte … … 1472 1474 unsigned size = 0, modrm, reg; 1473 1475 1474 switch (pCpu->opcode)1476 switch (pCpu->opcode) 1475 1477 { 1476 1478 case 0xC0: … … 1497 1499 1498 1500 //little hack to make sure the ModRM byte is included in the returned size 1499 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1501 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1500 1502 { 1501 1503 size = sizeof(uint8_t); //ModRM byte … … 1519 1521 1520 1522 //little hack to make sure the ModRM byte is included in the returned size 1521 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1523 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1522 1524 { 1523 1525 size = sizeof(uint8_t); //ModRM byte … … 1540 1542 1541 1543 //little hack to make sure the ModRM byte is included in the returned size 1542 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1544 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1543 1545 { 1544 1546 size = sizeof(uint8_t); //ModRM byte … … 1561 1563 1562 1564 //little hack to make sure the ModRM byte is included in the returned size 1563 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1565 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1564 1566 { 1565 1567 size = sizeof(uint8_t); //ModRM byte … … 1594 1596 1595 1597 //little hack to make sure the ModRM byte is included in the returned size 1596 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1598 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1597 1599 { 1598 1600 #ifdef DEBUG_Sander /* bird, 2005-06-28: Alex is getting this during full installation of win2ksp4. */ … … 1619 1621 1620 1622 //little hack to make sure the ModRM byte is included in the returned size 1621 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1623 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1622 1624 { 1623 1625 size = sizeof(uint8_t); //ModRM byte … … 1652 1654 1653 1655 //little hack to make sure the ModRM byte is included in the returned size 1654 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1656 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1655 1657 { 1656 1658 size = sizeof(uint8_t); //ModRM byte … … 1673 1675 1674 1676 //little hack to make sure the ModRM byte is included in the returned size 1675 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1677 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1676 1678 { 1677 1679 size = sizeof(uint8_t); //ModRM byte … … 1694 1696 1695 1697 //little hack to make sure the ModRM byte is included in the returned size 1696 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1698 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1697 1699 { 1698 1700 size = sizeof(uint8_t); //ModRM byte … … 1715 1717 1716 1718 //little hack to make sure the ModRM byte is included in the returned size 1717 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1719 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1718 1720 { 1719 1721 size = sizeof(uint8_t); //ModRM byte … … 1733 1735 reg = MODRM_REG(modrm); 1734 1736 1735 if (pCpu->prefix & PREFIX_OPSIZE)1737 if (pCpu->prefix & PREFIX_OPSIZE) 1736 1738 { 1737 1739 reg += 8; //2nd table … … 1741 1743 1742 1744 //little hack to make sure the ModRM byte is included in the returned size 1743 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1745 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1744 1746 { 1745 1747 size = sizeof(uint8_t); //ModRM byte … … 1758 1760 modrm = DISReadByte(pCpu, lpszCodeBlock); 1759 1761 reg = MODRM_REG(modrm); 1760 if (pCpu->prefix & PREFIX_OPSIZE)1762 if (pCpu->prefix & PREFIX_OPSIZE) 1761 1763 { 1762 1764 reg += 8; //2nd table … … 1766 1768 1767 1769 //little hack to make sure the ModRM byte is included in the returned size 1768 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1770 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1769 1771 { 1770 1772 size = sizeof(uint8_t); //ModRM byte … … 1783 1785 modrm = DISReadByte(pCpu, lpszCodeBlock); 1784 1786 reg = MODRM_REG(modrm); 1785 if (pCpu->prefix & PREFIX_OPSIZE)1787 if (pCpu->prefix & PREFIX_OPSIZE) 1786 1788 { 1787 1789 reg += 8; //2nd table … … 1791 1793 1792 1794 //little hack to make sure the ModRM byte is included in the returned size 1793 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1795 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1794 1796 { 1795 1797 size = sizeof(uint8_t); //ModRM byte … … 1817 1819 1818 1820 //little hack to make sure the ModRM byte is included in the returned size 1819 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1821 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1820 1822 { 1821 1823 size = sizeof(uint8_t); //ModRM byte … … 1838 1840 1839 1841 //little hack to make sure the ModRM byte is included in the returned size 1840 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)1842 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1841 1843 { 1842 1844 size = sizeof(uint8_t); //ModRM byte … … 1865 1867 } 1866 1868 else 1867 if (subtype == OP_PARM_v || subtype == OP_PARM_NONE)1869 if (subtype == OP_PARM_v || subtype == OP_PARM_NONE) 1868 1870 { 1869 1871 subtype = (pCpu->opmode == CPUMODE_32BIT) ? OP_PARM_d : OP_PARM_w; 1870 1872 } 1871 1873 1872 switch (subtype)1874 switch (subtype) 1873 1875 { 1874 1876 case OP_PARM_b: … … 1910 1912 pParam->flags |= USE_REG_GEN16; 1911 1913 pParam->base.reg_gen16 = BaseModRMReg16[idx]; 1912 if (idx < 4)1914 if (idx < 4) 1913 1915 { 1914 1916 pParam->flags |= USE_INDEX; … … 1925 1927 #endif 1926 1928 #ifdef IN_RING3 1927 if (idx >= (int)ELEMENTS(szModRMSegReg))1929 if (idx >= (int)ELEMENTS(szModRMSegReg)) 1928 1930 { 1929 1931 Log(("disasmModRMSReg %d failed!!\n", idx)); … … 1967 1969 int subtype = OP_PARM_VSUBTYPE(pParam->param); 1968 1970 1969 if (subtype == OP_PARM_v)1971 if (subtype == OP_PARM_v) 1970 1972 { 1971 1973 subtype = (pCpu->opmode == CPUMODE_32BIT) ? OP_PARM_d : OP_PARM_w; 1972 1974 } 1973 1975 1974 switch (subtype)1976 switch (subtype) 1975 1977 { 1976 1978 case OP_PARM_a: //two words or dwords depending on operand size (bound only) … … 2015 2017 uint8_t DISReadByte(PDISCPUSTATE pCpu, RTUINTPTR pAddress) 2016 2018 { 2017 if (pCpu->pfnReadBytes)2019 if (pCpu->pfnReadBytes) 2018 2020 { 2019 2021 uint8_t temp = 0; … … 2021 2023 2022 2024 rc = pCpu->pfnReadBytes(pAddress, &temp, sizeof(temp), pCpu); 2023 if (VBOX_FAILURE(rc))2025 if (VBOX_FAILURE(rc)) 2024 2026 { 2025 2027 Log(("DISReadByte failed!!\n")); … … 2039 2041 uint16_t DISReadWord(PDISCPUSTATE pCpu, RTUINTPTR pAddress) 2040 2042 { 2041 if (pCpu->pfnReadBytes)2043 if (pCpu->pfnReadBytes) 2042 2044 { 2043 2045 uint16_t temp = 0; … … 2045 2047 2046 2048 rc = pCpu->pfnReadBytes(pAddress, (uint8_t*)&temp, sizeof(temp), pCpu); 2047 if (VBOX_FAILURE(rc))2049 if (VBOX_FAILURE(rc)) 2048 2050 { 2049 2051 Log(("DISReadWord failed!!\n")); … … 2063 2065 uint32_t DISReadDWord(PDISCPUSTATE pCpu, RTUINTPTR pAddress) 2064 2066 { 2065 if (pCpu->pfnReadBytes)2067 if (pCpu->pfnReadBytes) 2066 2068 { 2067 2069 uint32_t temp = 0; … … 2069 2071 2070 2072 rc = pCpu->pfnReadBytes(pAddress, (uint8_t*)&temp, sizeof(temp), pCpu); 2071 if (VBOX_FAILURE(rc))2073 if (VBOX_FAILURE(rc)) 2072 2074 { 2073 2075 Log(("DISReadDWord failed!!\n")); … … 2087 2089 uint64_t DISReadQWord(PDISCPUSTATE pCpu, RTUINTPTR pAddress) 2088 2090 { 2089 if (pCpu->pfnReadBytes)2091 if (pCpu->pfnReadBytes) 2090 2092 { 2091 2093 uint64_t temp = 0; … … 2093 2095 2094 2096 rc = pCpu->pfnReadBytes(pAddress, (uint8_t*)&temp, sizeof(temp), pCpu); 2095 if (VBOX_FAILURE(rc))2097 if (VBOX_FAILURE(rc)) 2096 2098 { 2097 2099 Log(("DISReadQWord %x failed!!\n", pAddress)); -
trunk/src/VBox/VMM/VMMAll/EMAll.cpp
r8100 r8149 1413 1413 return VERR_EM_INTERPRETER; 1414 1414 1415 rc = DISQueryParamRegPtr(pRegFrame, pCpu, &pCpu->param2, &pParamReg2, &cbSizeParamReg2); 1415 rc = DISQueryParamRegPtr(pRegFrame, pCpu, &pCpu->param2, (void **)&pParamReg2, &cbSizeParamReg2); 1416 Assert(cbSizeParamReg2 <= 4); 1416 1417 if(VBOX_FAILURE(rc)) 1417 1418 return VERR_EM_INTERPRETER;
Note:
See TracChangeset
for help on using the changeset viewer.

