Changeset 92809 in vbox
- Timestamp:
- Dec 8, 2021 10:50:51 AM (3 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
include/VBox/dis.h (modified) (2 diffs)
-
include/VBox/disopcode.h (modified) (1 diff)
-
src/VBox/Disassembler/DisasmInternal.h (modified) (2 diffs)
-
src/VBox/Disassembler/testcase/Makefile.kmk (modified) (1 diff)
-
src/VBox/Disassembler/testcase/tstDisasm-1.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/dis.h
r92805 r92809 485 485 486 486 487 #if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && defined(DIS_CORE_ONLY) 488 # define DISOPCODE_BITFIELD(a_cBits) : a_cBits 489 #else 490 # define DISOPCODE_BITFIELD(a_cBits) 491 #endif 492 487 493 /** 488 494 * Opcode descriptor. 489 495 */ 490 #if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && defined(DIS_CORE_ONLY) 491 # pragma pack(1) 492 #endif 496 #if !defined(DIS_CORE_ONLY) || defined(DOXYGEN_RUNNING) 493 497 typedef struct DISOPCODE 494 498 { 495 #ifndef DIS_CORE_ONLY 499 # define DISOPCODE_FORMAT 0 500 /** Mnemonic and operand formatting. */ 496 501 const char *pszOpcode; 497 #endif498 502 /** Parameter \#1 parser index. */ 499 503 uint8_t idxParse1; … … 515 519 /** Parameter \#4 info, @see grp_dis_opparam. */ 516 520 uint16_t fParam4; 517 #if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || !defined(DIS_CORE_ONLY)518 521 /** padding unused */ 519 522 uint16_t uPadding; 520 #endif521 523 /** Operand type flags, DISOPTYPE_XXX. */ 522 524 uint32_t fOpType; 523 525 } DISOPCODE; 524 #if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && defined(DIS_CORE_ONLY) 526 #else 527 # pragma pack(1) 528 typedef struct DISOPCODE 529 { 530 #if 1 /*!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64) - probably not worth it for ~4K, costs 2-3% speed. */ 531 /* 16 bytes (trick is to make sure the bitfields doesn't cross dwords): */ 532 # define DISOPCODE_FORMAT 16 533 uint32_t fOpType; 534 uint16_t uOpcode; 535 uint8_t idxParse1; 536 uint8_t idxParse2; 537 uint32_t fParam1 : 12; /* 1st dword: 12+12+8 = 0x20 (32) */ 538 uint32_t fParam2 : 12; 539 uint32_t idxParse3 : 8; 540 uint32_t fParam3 : 12; /* 2nd dword: 12+12+8 = 0x20 (32) */ 541 uint32_t fParam4 : 12; 542 uint32_t idxParse4 : 8; 543 #else /* 15 bytes: */ 544 # define DISOPCODE_FORMAT 15 545 uint64_t uOpcode : 10; /* 1st qword: 10+12+12+12+6+6+6 = 0x40 (64) */ 546 uint64_t idxParse1 : 6; 547 uint64_t idxParse2 : 6; 548 uint64_t idxParse3 : 6; 549 uint64_t fParam1 : 12; 550 uint64_t fParam2 : 12; 551 uint64_t fParam3 : 12; 552 uint32_t fOpType; 553 uint16_t fParam4; 554 uint8_t idxParse4; 555 #endif 556 } DISOPCODE; 525 557 # pragma pack() 558 AssertCompile(sizeof(DISOPCODE) == DISOPCODE_FORMAT); 526 559 #endif 527 560 /** Pointer to const opcode. */ -
trunk/include/VBox/disopcode.h
r82968 r92809 807 807 }; 808 808 AssertCompile(OP_LOCK == 7); 809 AssertCompile(OP_END_OF_OPCODES < 1024 /* see 15 byte DISOPCODE variant */); 809 810 /** @} */ 810 811 -
trunk/src/VBox/Disassembler/DisasmInternal.h
r92805 r92809 82 82 IDX_ParseMax 83 83 }; 84 AssertCompile(IDX_ParseMax < 64 /* Packed DISOPCODE assumption. */); 84 85 /** @} */ 85 86 … … 194 195 * @internal 195 196 */ 196 #if ndef DIS_CORE_ONLY197 #if DISOPCODE_FORMAT == 0 197 198 # define OP(pszOpcode, idxParse1, idxParse2, idxParse3, opcode, param1, param2, param3, optype) \ 198 199 { pszOpcode, idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, 0, 0, optype } 199 200 # define OPVEX(pszOpcode, idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, optype) \ 200 201 { pszOpcode, idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, 0, optype | DISOPTYPE_SSE } 201 #elif defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64) 202 203 #elif DISOPCODE_FORMAT == 16 202 204 # define OP(pszOpcode, idxParse1, idxParse2, idxParse3, opcode, param1, param2, param3, optype) \ 203 { idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, 0, optype}205 { optype, opcode, idxParse1, idxParse2, param1, param2, idxParse3, param3, 0, 0 } 204 206 # define OPVEX(pszOpcode, idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, optype) \ 205 { idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, optype | DISOPTYPE_SSE} 207 { optype | DISOPTYPE_SSE, opcode, idxParse1, idxParse2, param1, param2, idxParse3, param3, param4, idxParse4 } 208 209 #elif DISOPCODE_FORMAT == 15 210 # define OP(pszOpcode, idxParse1, idxParse2, idxParse3, opcode, param1, param2, param3, optype) \ 211 { opcode, idxParse1, idxParse2, idxParse3, param1, param2, param3, optype, 0, 0 } 212 # define OPVEX(pszOpcode, idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, optype) \ 213 { opcode, idxParse1, idxParse2, idxParse3, param1, param2, param3, optype | DISOPTYPE_SSE, param4, idxParse4 } 206 214 #else 207 # define OP(pszOpcode, idxParse1, idxParse2, idxParse3, opcode, param1, param2, param3, optype) \ 208 { idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, 0, 0, optype } 209 # define OPVEX(pszOpcode, idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, optype) \ 210 { idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, 0, optype | DISOPTYPE_SSE} 215 # error Unsupported DISOPCODE_FORMAT value 211 216 #endif 212 217 -
trunk/src/VBox/Disassembler/testcase/Makefile.kmk
r87281 r92809 30 30 tstDisasm-1_LIBS = \ 31 31 $(PATH_STAGE_LIB)/DisasmR3$(VBOX_SUFF_LIB) \ 32 $(LIB_RUNTIME) 33 34 PROGRAMS += tstDisasmCore-1 35 tstDisasmCore-1_EXTENDS = tstDisasm-1 36 tstDisasmCore-1_DEFS = IN_DIS DIS_CORE_ONLY 37 tstDisasmCore-1_LIBS = \ 38 $(PATH_STAGE_LIB)/DisasmCoreR3$(VBOX_SUFF_LIB) \ 32 39 $(LIB_RUNTIME) 33 40 endif -
trunk/src/VBox/Disassembler/testcase/tstDisasm-1.cpp
r82968 r92809 42 42 for (size_t off = 0; off < cbInstrs;) 43 43 { 44 DISSTATE Dis; 45 uint32_t cb = 1; 46 #ifndef DIS_CORE_ONLY 44 47 uint32_t const cErrBefore = RTTestIErrorCount(); 45 uint32_t cb = 1;46 DISSTATE Dis;47 48 char szOutput[256] = {0}; 48 49 int rc = DISInstrToStr(&pabInstrs[off], enmDisCpuMode, &Dis, &cb, szOutput, sizeof(szOutput)); … … 84 85 RTTESTI_CHECK_MSG(cbOnly == cb, ("%#x vs %#x\n", cbOnly, cb)); 85 86 87 #else /* DIS_CORE_ONLY */ 88 int rc = DISInstr(&pabInstrs[off], enmDisCpuMode, &Dis, &cb); 89 RTTESTI_CHECK_RC(rc, VINF_SUCCESS); 90 RTTESTI_CHECK(cb == Dis.cbInstr); 91 #endif /* DIS_CORE_ONLY */ 92 86 93 off += cb; 87 94 } … … 145 152 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis.Param1)) == s_gInstrs[i].cbParam1, 146 153 ("%u: %#x vs %#x\n", i , cb2, s_gInstrs[i].cbParam1)); 154 #ifndef DIS_CORE_ONLY 147 155 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis.Param2)) == s_gInstrs[i].cbParam2, 148 156 ("%u: %#x vs %#x (%s)\n", i , cb2, s_gInstrs[i].cbParam2, Dis.pCurInstr->pszOpcode)); 157 #else 158 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis.Param2)) == s_gInstrs[i].cbParam2, 159 ("%u: %#x vs %#x\n", i , cb2, s_gInstrs[i].cbParam2)); 160 #endif 149 161 RTTESTI_CHECK_MSG((cb2 = DISGetParamSize(&Dis, &Dis.Param3)) == s_gInstrs[i].cbParam3, 150 162 ("%u: %#x vs %#x\n", i , cb2, s_gInstrs[i].cbParam3));
Note:
See TracChangeset
for help on using the changeset viewer.

