Changeset 105724 in vbox for trunk/src/VBox/Disassembler
- Timestamp:
- Aug 19, 2024 1:27:44 PM (8 months ago)
- svn:sync-xref-src-repo-rev:
- 164428
- Location:
- trunk/src/VBox/Disassembler
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Disassembler/Disasm.cpp
r101539 r105724 308 308 309 309 #ifdef VBOX_STRICT 310 pDis->Param1.uValue = UINT64_C(0xb1b1b1b1b1b1b1b1); 311 pDis->Param2.uValue = UINT64_C(0xb2b2b2b2b2b2b2b2); 312 pDis->Param3.uValue = UINT64_C(0xb3b3b3b3b3b3b3b3); 310 pDis->aParams[0].uValue = UINT64_C(0xb1b1b1b1b1b1b1b1); 311 pDis->aParams[1].uValue = UINT64_C(0xb2b2b2b2b2b2b2b2); 312 pDis->aParams[2].uValue = UINT64_C(0xb3b3b3b3b3b3b3b3); 313 pDis->aParams[3].uValue = UINT64_C(0xb4b4b4b4b4b4b4b4); 313 314 #endif 314 315 -
trunk/src/VBox/Disassembler/DisasmCore-armv8.cpp
r101539 r105724 301 301 302 302 /* Should contain the parameter type on input. */ 303 pDis-> Param1.armv8.fParam = pOp->Opc.fParam1;304 pDis-> Param2.armv8.fParam = pOp->Opc.fParam2;305 pDis-> Param3.armv8.fParam = pOp->Opc.fParam3;306 pDis-> Param4.armv8.fParam = pOp->Opc.fParam4;303 pDis->aParams[0].armv8.fParam = pOp->Opc.fParam1; 304 pDis->aParams[1].armv8.fParam = pOp->Opc.fParam2; 305 pDis->aParams[2].armv8.fParam = pOp->Opc.fParam3; 306 pDis->aParams[3].armv8.fParam = pOp->Opc.fParam4; 307 307 308 308 pDis->pCurInstr = &pOp->Opc; … … 318 318 int rc = VINF_SUCCESS; 319 319 if (pInsnClass->aParms[0].idxParse != kDisParmParseNop) 320 rc = g_apfnDisasm[pInsnClass->aParms[0].idxParse](pDis, u32Insn, pInsnClass, &pDis-> Param1, &pInsnClass->aParms[0], f64Bit);320 rc = g_apfnDisasm[pInsnClass->aParms[0].idxParse](pDis, u32Insn, pInsnClass, &pDis->aParams[0], &pInsnClass->aParms[0], f64Bit); 321 321 322 322 if ( pInsnClass->aParms[1].idxParse != kDisParmParseNop 323 323 && RT_SUCCESS(rc)) 324 rc = g_apfnDisasm[pInsnClass->aParms[1].idxParse](pDis, u32Insn, pInsnClass, &pDis-> Param2, &pInsnClass->aParms[1], f64Bit);324 rc = g_apfnDisasm[pInsnClass->aParms[1].idxParse](pDis, u32Insn, pInsnClass, &pDis->aParams[1], &pInsnClass->aParms[1], f64Bit); 325 325 326 326 if ( pInsnClass->aParms[2].idxParse != kDisParmParseNop 327 327 && RT_SUCCESS(rc)) 328 rc = g_apfnDisasm[pInsnClass->aParms[2].idxParse](pDis, u32Insn, pInsnClass, &pDis-> Param3, &pInsnClass->aParms[2], f64Bit);328 rc = g_apfnDisasm[pInsnClass->aParms[2].idxParse](pDis, u32Insn, pInsnClass, &pDis->aParams[2], &pInsnClass->aParms[2], f64Bit); 329 329 330 330 if ( pInsnClass->aParms[3].idxParse != kDisParmParseNop 331 331 && RT_SUCCESS(rc)) 332 rc = g_apfnDisasm[pInsnClass->aParms[3].idxParse](pDis, u32Insn, pInsnClass, &pDis-> Param4, &pInsnClass->aParms[3], f64Bit);332 rc = g_apfnDisasm[pInsnClass->aParms[3].idxParse](pDis, u32Insn, pInsnClass, &pDis->aParams[3], &pInsnClass->aParms[3], f64Bit); 333 333 334 334 /* If parameter parsing returned an invalid opcode error the encoding is invalid. */ … … 337 337 pDis->pCurInstr = &g_ArmV8A64InvalidOpcode[0]; 338 338 339 pDis-> Param1.armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam1;340 pDis-> Param2.armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam2;341 pDis-> Param3.armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam3;342 pDis-> Param4.armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam4;339 pDis->aParams[0].armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam1; 340 pDis->aParams[1].armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam2; 341 pDis->aParams[2].armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam3; 342 pDis->aParams[3].armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam4; 343 343 } 344 344 pDis->rc = rc; -
trunk/src/VBox/Disassembler/DisasmCore-x86-amd64.cpp
r103927 r105724 265 265 266 266 // Should contain the parameter type on input 267 pDis-> Param1.x86.fParam = pOp->fParam1;268 pDis-> Param2.x86.fParam = pOp->fParam2;269 pDis-> Param3.x86.fParam = pOp->fParam3;270 pDis-> Param4.x86.fParam = pOp->fParam4;267 pDis->aParams[0].x86.fParam = pOp->fParam1; 268 pDis->aParams[1].x86.fParam = pOp->fParam2; 269 pDis->aParams[2].x86.fParam = pOp->fParam3; 270 pDis->aParams[3].x86.fParam = pOp->fParam4; 271 271 272 272 /* Correct the operand size if the instruction is marked as forced or default 64 bits */ … … 293 293 if (pOp->idxParse1 != IDX_ParseNop) 294 294 { 295 offInstr = pDis->x86.pfnDisasmFnTable[pOp->idxParse1](offInstr, pOp, pDis, &pDis-> Param1);296 if (fFiltered == false) pDis-> Param1.x86.cb = DISGetParamSize(pDis, &pDis->Param1);295 offInstr = pDis->x86.pfnDisasmFnTable[pOp->idxParse1](offInstr, pOp, pDis, &pDis->aParams[0]); 296 if (fFiltered == false) pDis->aParams[0].x86.cb = DISGetParamSize(pDis, &pDis->aParams[0]); 297 297 } 298 298 299 299 if (pOp->idxParse2 != IDX_ParseNop) 300 300 { 301 offInstr = pDis->x86.pfnDisasmFnTable[pOp->idxParse2](offInstr, pOp, pDis, &pDis-> Param2);302 if (fFiltered == false) pDis-> Param2.x86.cb = DISGetParamSize(pDis, &pDis->Param2);301 offInstr = pDis->x86.pfnDisasmFnTable[pOp->idxParse2](offInstr, pOp, pDis, &pDis->aParams[1]); 302 if (fFiltered == false) pDis->aParams[1].x86.cb = DISGetParamSize(pDis, &pDis->aParams[1]); 303 303 } 304 304 305 305 if (pOp->idxParse3 != IDX_ParseNop) 306 306 { 307 offInstr = pDis->x86.pfnDisasmFnTable[pOp->idxParse3](offInstr, pOp, pDis, &pDis-> Param3);308 if (fFiltered == false) pDis-> Param3.x86.cb = DISGetParamSize(pDis, &pDis->Param3);307 offInstr = pDis->x86.pfnDisasmFnTable[pOp->idxParse3](offInstr, pOp, pDis, &pDis->aParams[2]); 308 if (fFiltered == false) pDis->aParams[2].x86.cb = DISGetParamSize(pDis, &pDis->aParams[2]); 309 309 } 310 310 311 311 if (pOp->idxParse4 != IDX_ParseNop) 312 312 { 313 offInstr = pDis->x86.pfnDisasmFnTable[pOp->idxParse4](offInstr, pOp, pDis, &pDis-> Param4);314 if (fFiltered == false) pDis-> Param4.x86.cb = DISGetParamSize(pDis, &pDis->Param4);313 offInstr = pDis->x86.pfnDisasmFnTable[pOp->idxParse4](offInstr, pOp, pDis, &pDis->aParams[3]); 314 if (fFiltered == false) pDis->aParams[3].x86.cb = DISGetParamSize(pDis, &pDis->aParams[3]); 315 315 } 316 316 // else simple one byte instruction … … 334 334 335 335 // Should contain the parameter type on input 336 pDis-> Param1.x86.fParam = fpop->fParam1;337 pDis-> Param2.x86.fParam = fpop->fParam2;336 pDis->aParams[0].x86.fParam = fpop->fParam1; 337 pDis->aParams[1].x86.fParam = fpop->fParam2; 338 338 } 339 339 else … … 1479 1479 1480 1480 if ( (pOp->fOpType & DISOPTYPE_X86_REXB_EXTENDS_OPREG) 1481 && pParam == &pDis-> Param1/* ugly assumption that it only applies to the first parameter */1481 && pParam == &pDis->aParams[0] /* ugly assumption that it only applies to the first parameter */ 1482 1482 && (pDis->x86.fPrefix & DISPREFIX_REX) 1483 1483 && (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_B)) … … 1510 1510 if ( pDis->uCpuMode == DISCPUMODE_64BIT 1511 1511 && (pOp->fOpType & DISOPTYPE_X86_REXB_EXTENDS_OPREG) 1512 && pParam == &pDis-> Param1/* ugly assumption that it only applies to the first parameter */1512 && pParam == &pDis->aParams[0] /* ugly assumption that it only applies to the first parameter */ 1513 1513 && (pDis->x86.fPrefix & DISPREFIX_REX)) 1514 1514 { … … 2452 2452 case OP_XCHG: 2453 2453 case OP_XOR: 2454 if (pDis-> Param1.fUse & (DISUSE_BASE | DISUSE_INDEX | DISUSE_DISPLACEMENT64 | DISUSE_DISPLACEMENT322455 | DISUSE_DISPLACEMENT16 | DISUSE_DISPLACEMENT8 | DISUSE_RIPDISPLACEMENT32))2454 if (pDis->aParams[0].fUse & ( DISUSE_BASE | DISUSE_INDEX | DISUSE_DISPLACEMENT64 | DISUSE_DISPLACEMENT32 2455 | DISUSE_DISPLACEMENT16 | DISUSE_DISPLACEMENT8 | DISUSE_RIPDISPLACEMENT32)) 2456 2456 return; 2457 2457 break; … … 2600 2600 { 2601 2601 #ifdef VBOX_STRICT /* poison */ 2602 pDis-> Param1.x86.Base.idxGenReg = 0xc1;2603 pDis-> Param2.x86.Base.idxGenReg = 0xc2;2604 pDis-> Param3.x86.Base.idxGenReg = 0xc3;2605 pDis-> Param1.x86.Index.idxGenReg = 0xc4;2606 pDis-> Param2.x86.Index.idxGenReg = 0xc5;2607 pDis-> Param3.x86.Index.idxGenReg = 0xc6;2608 pDis-> Param1.x86.uDisp.u64 = UINT64_C(0xd1d1d1d1d1d1d1d1);2609 pDis-> Param2.x86.uDisp.u64 = UINT64_C(0xd2d2d2d2d2d2d2d2);2610 pDis-> Param3.x86.uDisp.u64 = UINT64_C(0xd3d3d3d3d3d3d3d3);2611 pDis-> Param1.uValue= UINT64_C(0xb1b1b1b1b1b1b1b1);2612 pDis-> Param2.uValue= UINT64_C(0xb2b2b2b2b2b2b2b2);2613 pDis-> Param3.uValue= UINT64_C(0xb3b3b3b3b3b3b3b3);2614 pDis-> Param1.x86.uScale = 28;2615 pDis-> Param2.x86.uScale = 29;2616 pDis-> Param3.x86.uScale = 30;2602 pDis->aParams[0].x86.Base.idxGenReg = 0xc1; 2603 pDis->aParams[1].x86.Base.idxGenReg = 0xc2; 2604 pDis->aParams[2].x86.Base.idxGenReg = 0xc3; 2605 pDis->aParams[0].x86.Index.idxGenReg = 0xc4; 2606 pDis->aParams[1].x86.Index.idxGenReg = 0xc5; 2607 pDis->aParams[2].x86.Index.idxGenReg = 0xc6; 2608 pDis->aParams[0].x86.uDisp.u64 = UINT64_C(0xd1d1d1d1d1d1d1d1); 2609 pDis->aParams[1].x86.uDisp.u64 = UINT64_C(0xd2d2d2d2d2d2d2d2); 2610 pDis->aParams[2].x86.uDisp.u64 = UINT64_C(0xd3d3d3d3d3d3d3d3); 2611 pDis->aParams[0].uValue = UINT64_C(0xb1b1b1b1b1b1b1b1); 2612 pDis->aParams[1].uValue = UINT64_C(0xb2b2b2b2b2b2b2b2); 2613 pDis->aParams[2].uValue = UINT64_C(0xb3b3b3b3b3b3b3b3); 2614 pDis->aParams[0].x86.uScale = 28; 2615 pDis->aParams[1].x86.uScale = 29; 2616 pDis->aParams[2].x86.uScale = 30; 2617 2617 #endif 2618 2618 -
trunk/src/VBox/Disassembler/DisasmFormatArmV8.cpp
r101540 r105724 286 286 * Formatting context and associated macros. 287 287 */ 288 PCDISOPPARAM pParam = &pDis-> Param1;289 int iParam = 1;288 PCDISOPPARAM pParam = &pDis->aParams[0]; 289 uint32_t iParam = 0; 290 290 291 291 const char *pszFmt = pOp->pszOpcode; … … 401 401 pszFmt++; 402 402 403 switch (++iParam) 403 iParam++; 404 if (iParam >= RT_ELEMENTS(pDis->aParams)) 404 405 { 405 case 2: pParam = &pDis->Param2; break; 406 case 3: pParam = &pDis->Param3; break; 407 case 4: pParam = &pDis->Param4; break; 408 default: pParam = NULL; break; 406 AssertFailed(); 407 pParam = NULL; 409 408 } 409 else 410 pParam = &pDis->aParams[iParam]; 410 411 break; 411 412 } … … 424 425 Assert(*pszFmt != ' '); 425 426 PUT_C(' '); 426 switch (++iParam) 427 iParam++; 428 if (iParam >= RT_ELEMENTS(pDis->aParams)) 427 429 { 428 case 2: pParam = &pDis->Param2; break; 429 case 3: pParam = &pDis->Param3; break; 430 case 4: pParam = &pDis->Param4; break; 431 default: pParam = NULL; break; 430 AssertFailed(); 431 pParam = NULL; 432 432 } 433 else 434 pParam = &pDis->aParams[iParam]; 433 435 } 434 436 } -
trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp
r103928 r105724 642 642 if ( (*pszFmt == '#' && !(pDis->x86.bVexByte2 & DISPREFIX_VEX_F_W)) /** @todo check this*/ 643 643 || (*pszFmt == '@' && !VEXREG_IS256B(pDis->x86.bVexDestReg)) 644 || (*pszFmt == '&' && ( DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param1.fUse)645 || DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param2.fUse)646 || DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param3.fUse)647 || DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param4.fUse))))644 || (*pszFmt == '&' && ( DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[0].fUse) 645 || DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[1].fUse) 646 || DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[2].fUse) 647 || DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[3].fUse)))) 648 648 { 649 649 strncpy(pszFmtDst, pszFmt + 1, pszDelim - pszFmt - 1); … … 666 666 case OP_FLD: 667 667 if (pDis->x86.bOpCode == 0xdb) /* m80fp workaround. */ 668 *(int *)&pDis-> Param1.x86.fParam &= ~0x1f; /* make it pure OP_PARM_M */668 *(int *)&pDis->aParams[0].x86.fParam &= ~0x1f; /* make it pure OP_PARM_M */ 669 669 break; 670 670 case OP_LAR: /* hack w -> v, probably not correct. */ 671 *(int *)&pDis-> Param2.x86.fParam &= ~0x1f;672 *(int *)&pDis-> Param2.x86.fParam |= OP_PARM_v;671 *(int *)&pDis->aParams[1].x86.fParam &= ~0x1f; 672 *(int *)&pDis->aParams[2].x86.fParam |= OP_PARM_v; 673 673 break; 674 674 } … … 698 698 * Formatting context and associated macros. 699 699 */ 700 PCDISOPPARAM pParam = &pDis-> Param1;701 int iParam = 1;700 PCDISOPPARAM pParam = &pDis->aParams[0]; 701 uint32_t iParam = 0; 702 702 703 703 #define PUT_FAR() \ … … 787 787 */ 788 788 if ( (pDis->x86.fPrefix & DISPREFIX_SEG) 789 && !DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param1.fUse)790 && !DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param2.fUse)791 && !DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param3.fUse))789 && !DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[0].fUse) 790 && !DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[1].fUse) 791 && !DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[2].fUse)) 792 792 { 793 793 PUT_STR(s_szSegPrefix[pDis->x86.idxSegPrefix], 2); … … 1085 1085 { 1086 1086 int32_t offDisplacement; 1087 Assert(iParam == 1);1087 Assert(iParam == 0); 1088 1088 bool fPrefix = (fFlags & DIS_FMT_FLAGS_STRICT) 1089 1089 && pOp->uOpcode != OP_CALL … … 1287 1287 Assert(*pszFmt != ' '); 1288 1288 PUT_C(' '); 1289 switch (++iParam) 1289 iParam++; 1290 if (iParam >= RT_ELEMENTS(pDis->aParams)) 1290 1291 { 1291 case 2: pParam = &pDis->Param2; break; 1292 case 3: pParam = &pDis->Param3; break; 1293 case 4: pParam = &pDis->Param4; break; 1294 default: pParam = NULL; break; 1292 AssertFailed(); 1293 pParam = NULL; 1295 1294 } 1295 else 1296 pParam = &pDis->aParams[iParam]; 1296 1297 } 1297 1298 } … … 1478 1479 /* no effective address which it may apply to. */ 1479 1480 Assert((pDis->x86.fPrefix & DISPREFIX_SEG) || pDis->uCpuMode == DISCPUMODE_64BIT); 1480 if ( !DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param1.fUse)1481 && !DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param2.fUse)1482 && !DISUSE_IS_EFFECTIVE_ADDR(pDis-> Param3.fUse))1481 if ( !DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[0].fUse) 1482 && !DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[1].fUse) 1483 && !DISUSE_IS_EFFECTIVE_ADDR(pDis->aParams[2].fUse)) 1483 1484 return true; 1484 1485 … … 1689 1690 /* shl eax,1 will be assembled to the form without the immediate byte. */ 1690 1691 if ( pDis->pCurInstr->fParam2 == OP_PARM_Ib 1691 && (uint8_t)pDis-> Param2.uValue == 1)1692 && (uint8_t)pDis->aParams[1].uValue == 1) 1692 1693 { 1693 1694 switch (pDis->pCurInstr->uOpcode) -
trunk/src/VBox/Disassembler/testcase/tstDisasm-1.cpp
r101539 r105724 160 160 { 161 161 uint32_t cb2; 162 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis. Param1)) == s_gInstrs[i].cbParam1,162 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis.aParams[0])) == s_gInstrs[i].cbParam1, 163 163 ("%u: %#x vs %#x\n", i , cb2, s_gInstrs[i].cbParam1)); 164 164 #ifndef DIS_CORE_ONLY 165 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis. Param2)) == s_gInstrs[i].cbParam2,165 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis.aParams[1])) == s_gInstrs[i].cbParam2, 166 166 ("%u: %#x vs %#x (%s)\n", i , cb2, s_gInstrs[i].cbParam2, Dis.pCurInstr->pszOpcode)); 167 167 #else 168 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis. Param2)) == s_gInstrs[i].cbParam2,168 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis.aParams[1])) == s_gInstrs[i].cbParam2, 169 169 ("%u: %#x vs %#x\n", i , cb2, s_gInstrs[i].cbParam2)); 170 170 #endif 171 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis. Param3)) == s_gInstrs[i].cbParam3,171 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis.aParams[2])) == s_gInstrs[i].cbParam3, 172 172 ("%u: %#x vs %#x\n", i , cb2, s_gInstrs[i].cbParam3)); 173 173 }
Note:
See TracChangeset
for help on using the changeset viewer.