Changeset 8333
- Timestamp:
- 04/23/08 16:42:17 (9 months ago)
- Files:
-
- trunk/include/VBox/dis.h (modified) (1 diff)
- trunk/src/VBox/Disassembler/Disasm.cpp (modified) (1 diff)
- trunk/src/VBox/Disassembler/DisasmCore.cpp (modified) (23 diffs)
- trunk/src/VBox/VMM/PATM/PATMPatch.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/include/VBox/dis.h
r8299 r8333 412 412 OP_PARAMETER param3; 413 413 414 /** ModRM byte. */ 415 uint32_t ModRM; 416 /** scalar, index, base byte. */ 417 uint32_t SIB; 414 /** ModRM fields. */ 415 union 416 { 417 /* Bitfield view */ 418 struct 419 { 420 unsigned Rm : 4; 421 unsigned Reg : 4; 422 unsigned Mod : 2; 423 } Bits; 424 /* unsigned view */ 425 unsigned u; 426 } ModRM; 427 428 /** SIB fields. */ 429 union 430 { 431 /* Bitfield view */ 432 struct 433 { 434 unsigned Base : 4; 435 unsigned Index : 4; 436 unsigned Scale : 2; 437 } Bits; 438 /* unsigned view */ 439 unsigned u; 440 } SIB; 418 441 419 442 int32_t disp; trunk/src/VBox/Disassembler/Disasm.cpp
r8299 r8333 126 126 pCpu->addrmode = pCpu->mode; 127 127 pCpu->opmode = pCpu->mode; 128 pCpu->ModRM = 0;129 pCpu->SIB = 0;128 pCpu->ModRM.u = 0; 129 pCpu->SIB.u = 0; 130 130 pCpu->lastprefix = 0; 131 131 pCpu->param1.parval = 0; trunk/src/VBox/Disassembler/DisasmCore.cpp
r8299 r8333 65 65 #endif 66 66 67 static unsigned QueryModRM(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, int*pSibInc = NULL);68 static unsigned QueryModRM_SizeOnly(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, int*pSibInc = NULL);67 static unsigned QueryModRM(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, unsigned *pSibInc = NULL); 68 static unsigned QueryModRM_SizeOnly(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, unsigned *pSibInc = NULL); 69 69 static void UseSIB(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu); 70 70 static unsigned ParseSIB_SizeOnly(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu); … … 176 176 pCpu->addrmode = pCpu->mode; 177 177 pCpu->opmode = pCpu->mode; 178 pCpu->ModRM = 0;179 pCpu->SIB = 0;178 pCpu->ModRM.u = 0; 179 pCpu->SIB.u = 0; 180 180 pCpu->param1.parval = 0; 181 181 pCpu->param2.parval = 0; … … 223 223 pCpu->addrmode = enmCpuMode; 224 224 pCpu->opmode = enmCpuMode; 225 pCpu->ModRM = 0;226 pCpu->SIB = 0;225 pCpu->ModRM.u = 0; 226 pCpu->SIB.u = 0; 227 227 pCpu->param1.parval = 0; 228 228 pCpu->param2.parval = 0; … … 410 410 int index; 411 411 const OPCODE *fpop; 412 unsigned size = 0 ;413 414 pCpu->ModRM = DISReadByte(pCpu, lpszCodeBlock);412 unsigned size = 0, ModRM; 413 414 ModRM = DISReadByte(pCpu, lpszCodeBlock); 415 415 416 416 index = pCpu->opcode - 0xD8; 417 if ( pCpu->ModRM <= 0xBF)418 { 419 fpop = &(g_paMapX86_FP_Low[index])[MODRM_REG( pCpu->ModRM)];417 if (ModRM <= 0xBF) 418 { 419 fpop = &(g_paMapX86_FP_Low[index])[MODRM_REG(ModRM)]; 420 420 pCpu->pCurInstr = (PCOPCODE)fpop; 421 421 … … 423 423 pCpu->param1.parval = fpop->param1; 424 424 pCpu->param2.parval = fpop->param2; 425 426 /* 427 * Apply filter to instruction type to determine if a full disassembly is required. 428 * @note Multibyte opcodes are always marked harmless until the final byte. 429 */ 430 if ((fpop->optype & pCpu->uFilter) == 0) 431 { 432 pCpu->pfnDisasmFnTable = pfnCalcSize; 433 } 434 else 435 { 436 /* Not filtered out -> full disassembly */ 437 pCpu->pfnDisasmFnTable = pfnFullDisasm; 438 } 439 440 // Little hack to make sure the ModRM byte is included in the returned size 441 if (fpop->idxParse1 != IDX_ParseModRM && fpop->idxParse2 != IDX_ParseModRM) 442 size = sizeof(uint8_t); //ModRM byte 443 444 if (fpop->idxParse1 != IDX_ParseNop) 445 size += pCpu->pfnDisasmFnTable[fpop->idxParse1](lpszCodeBlock+size, (PCOPCODE)fpop, pParam, pCpu); 446 447 if (fpop->idxParse2 != IDX_ParseNop) 448 size += pCpu->pfnDisasmFnTable[fpop->idxParse2](lpszCodeBlock+size, (PCOPCODE)fpop, pParam, pCpu); 449 } 450 else 451 { 452 size = sizeof(uint8_t); //ModRM byte only 453 fpop = &(g_paMapX86_FP_High[index])[pCpu->ModRM - 0xC0]; 425 } 426 else 427 { 428 fpop = &(g_paMapX86_FP_High[index])[ModRM - 0xC0]; 454 429 pCpu->pCurInstr = (PCOPCODE)fpop; 455 456 /* 457 * Apply filter to instruction type to determine if a full disassembly is required. 458 * @note Multibyte opcodes are always marked harmless until the final byte. 459 */ 460 if ((fpop->optype & pCpu->uFilter) == 0) 461 { 462 pCpu->pfnDisasmFnTable = pfnCalcSize; 463 } 464 else 465 { 466 /* Not filtered out -> full disassembly */ 467 pCpu->pfnDisasmFnTable = pfnFullDisasm; 468 } 469 } 430 } 431 432 /* 433 * Apply filter to instruction type to determine if a full disassembly is required. 434 * @note Multibyte opcodes are always marked harmless until the final byte. 435 */ 436 if ((fpop->optype & pCpu->uFilter) == 0) 437 { 438 pCpu->pfnDisasmFnTable = pfnCalcSize; 439 } 440 else 441 { 442 /* Not filtered out -> full disassembly */ 443 pCpu->pfnDisasmFnTable = pfnFullDisasm; 444 } 445 446 // Little hack to make sure the ModRM byte is included in the returned size 447 if (fpop->idxParse1 != IDX_ParseModRM && fpop->idxParse2 != IDX_ParseModRM) 448 size = sizeof(uint8_t); //ModRM byte 449 450 if (fpop->idxParse1 != IDX_ParseNop) 451 size += pCpu->pfnDisasmFnTable[fpop->idxParse1](lpszCodeBlock+size, (PCOPCODE)fpop, pParam, pCpu); 452 453 if (fpop->idxParse2 != IDX_ParseNop) 454 size += pCpu->pfnDisasmFnTable[fpop->idxParse2](lpszCodeBlock+size, (PCOPCODE)fpop, pParam, pCpu); 470 455 471 456 // Store the opcode format string for disasmPrintf … … 488 473 void UseSIB(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 489 474 { 490 intscale, base, index;475 unsigned scale, base, index; 491 476 char szTemp[32]; 492 477 szTemp[0] = '\0'; 493 478 494 scale = SIB_SCALE(pCpu->SIB);495 base = SIB_BASE(pCpu->SIB);496 index = SIB_INDEX(pCpu->SIB);479 scale = pCpu->SIB.Bits.Scale; 480 base = pCpu->SIB.Bits.Base; 481 index = pCpu->SIB.Bits.Index; 497 482 498 483 if (szSIBIndexReg[index]) … … 507 492 } 508 493 509 if (base == 5 && MODRM_MOD(pCpu->ModRM)== 0)494 if (base == 5 && pCpu->ModRM.Bits.Mod == 0) 510 495 disasmAddStringF(szTemp, sizeof(szTemp), "%s%s", szSIBIndexReg[index], szSIBScale[scale]); 511 496 else … … 514 499 else 515 500 { 516 if (base != 5 || MODRM_MOD(pCpu->ModRM)!= 0)501 if (base != 5 || pCpu->ModRM.Bits.Mod != 0) 517 502 disasmAddStringF(szTemp, sizeof(szTemp), "%s", szSIBBaseReg[base]); 518 503 } 519 504 520 if (base == 5 && MODRM_MOD(pCpu->ModRM)== 0)505 if (base == 5 && pCpu->ModRM.Bits.Mod == 0) 521 506 { 522 507 // [scaled index] + disp32 … … 540 525 unsigned ParseSIB(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 541 526 { 542 unsigned size = sizeof(uint8_t), base; 543 544 pCpu->SIB = DISReadByte(pCpu, lpszCodeBlock); 527 unsigned size = sizeof(uint8_t); 528 unsigned SIB; 529 530 SIB = DISReadByte(pCpu, lpszCodeBlock); 545 531 lpszCodeBlock += size; 546 532 547 base = SIB_BASE(pCpu->SIB); 548 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0) 549 {//additional 32 bits displacement 533 pCpu->SIB.Bits.Base = SIB_BASE(SIB); 534 pCpu->SIB.Bits.Index = SIB_INDEX(SIB); 535 pCpu->SIB.Bits.Scale = SIB_SCALE(SIB); 536 537 if (pCpu->prefix & PREFIX_REX) 538 { 539 pCpu->SIB.Bits.Base |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_B)) << 3); 540 pCpu->SIB.Bits.Index |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_X)) << 3); 541 } 542 543 if ( pCpu->SIB.Bits.Base == 5 544 && pCpu->ModRM.Bits.Mod == 0) 545 { 546 /* Additional 32 bits displacement. No change in long mode. */ 550 547 pCpu->disp = DISReadDWord(pCpu, lpszCodeBlock); 551 548 size += sizeof(int32_t); … … 557 554 unsigned ParseSIB_SizeOnly(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 558 555 { 559 unsigned size = sizeof(uint8_t), base; 560 561 pCpu->SIB = DISReadByte(pCpu, lpszCodeBlock); 556 unsigned size = sizeof(uint8_t); 557 unsigned SIB; 558 559 SIB = DISReadByte(pCpu, lpszCodeBlock); 562 560 lpszCodeBlock += size; 563 561 564 base = SIB_BASE(pCpu->SIB); 565 if (base == 5 && MODRM_MOD(pCpu->ModRM) == 0) 566 {//additional 32 bits displacement 562 pCpu->SIB.Bits.Base = SIB_BASE(SIB); 563 pCpu->SIB.Bits.Index = SIB_INDEX(SIB); 564 pCpu->SIB.Bits.Scale = SIB_SCALE(SIB); 565 566 if (pCpu->prefix & PREFIX_REX) 567 { 568 /* REX.B extends the Base field. */ 569 pCpu->SIB.Bits.Base |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_B)) << 3); 570 /* REX.X extends the Index field. */ 571 pCpu->SIB.Bits.Index |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_X)) << 3); 572 } 573 574 if ( pCpu->SIB.Bits.Base == 5 575 && pCpu->ModRM.Bits.Mod == 0) 576 { 577 /* Additional 32 bits displacement. No change in long mode. */ 567 578 size += sizeof(int32_t); 568 579 } … … 576 587 unsigned UseModRM(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu) 577 588 { 578 int reg = MODRM_REG(pCpu->ModRM);579 int rm = MODRM_RM(pCpu->ModRM);580 int mod = MODRM_MOD(pCpu->ModRM);581 int vtype = OP_PARM_VTYPE(pParam->param);589 int vtype = OP_PARM_VTYPE(pParam->param); 590 unsigned reg = pCpu->ModRM.Bits.Reg; 591 unsigned mod = pCpu->ModRM.Bits.Mod; 592 unsigned rm = pCpu->ModRM.Bits.Rm; 582 593 583 594 switch (vtype) … … 777 788 // Query the size of the ModRM parameters and fetch the immediate data (if any) 778 789 //***************************************************************************** 779 unsigned QueryModRM(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, int*pSibInc)780 { 781 int mod, rm,sibinc;790 unsigned QueryModRM(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, unsigned *pSibInc) 791 { 792 unsigned sibinc; 782 793 unsigned size = 0; 783 784 rm = MODRM_RM(pCpu->ModRM);785 mod = MODRM_MOD(pCpu->ModRM);794 unsigned reg = pCpu->ModRM.Bits.Reg; 795 unsigned mod = pCpu->ModRM.Bits.Mod; 796 unsigned rm = pCpu->ModRM.Bits.Rm; 786 797 787 798 if (!pSibInc) 788 {789 799 pSibInc = &sibinc; 790 }791 800 792 801 *pSibInc = 0; 793 802 794 if (pCpu->addrmode == CPUMODE_32BIT) 795 {//32 bits addressing mode 803 if (pCpu->addrmode != CPUMODE_16BIT) 804 { 805 Assert(pCpu->addrmode == CPUMODE_32BIT || pCpu->addrmode == CPUMODE_64BIT); 806 807 /* 808 * Note: displacements in long mode are 8 or 32 bits and sign-extended to 64 bits 809 */ 796 810 if (mod != 3 && rm == 4) 797 { //SIB byte follows ModRM811 { /* SIB byte follows ModRM */ 798 812 *pSibInc = ParseSIB(lpszCodeBlock, pOp, pParam, pCpu); 799 813 lpszCodeBlock += *pSibInc; … … 803 817 switch (mod) 804 818 { 805 case 0: / /effective address806 if (rm == 5) { //32 bits displacement819 case 0: /* Effective address */ 820 if (rm == 5) { /* 32 bits displacement */ 807 821 pCpu->disp = DISReadDWord(pCpu, lpszCodeBlock); 808 822 size += sizeof(int32_t); 809 823 } 810 / /else register address811 break; 812 813 case 1: / /effective address + 8 bits displacement824 /* else register address */ 825 break; 826 827 case 1: /* Effective address + 8 bits displacement */ 814 828 pCpu->disp = (int8_t)DISReadByte(pCpu, lpszCodeBlock); 815 829 size += sizeof(char); 816 830 break; 817 831 818 case 2: / /effective address + 32 bits displacement832 case 2: /* Effective address + 32 bits displacement */ 819 833 pCpu->disp = DISReadDWord(pCpu, lpszCodeBlock); 820 834 size += sizeof(int32_t); 821 835 break; 822 836 823 case 3: //registers 824 break; 825 } 826 } 827 else 828 {//16 bits addressing mode 837 case 3: /* registers */ 838 break; 839 } 840 } 841 else 842 { 843 /* 16 bits mode */ 829 844 switch (mod) 830 845 { 831 case 0: / /effective address846 case 0: /* Effective address */ 832 847 if (rm == 6) { 833 848 pCpu->disp = DISReadWord(pCpu, lpszCodeBlock); 834 849 size += sizeof(uint16_t); 835 850 } 836 break; 837 838 case 1: //effective address + 8 bits displacement 851 /* else register address */ 852 break; 853 854 case 1: /* Effective address + 8 bits displacement */ 839 855 pCpu->disp = (int8_t)DISReadByte(pCpu, lpszCodeBlock); 840 856 size += sizeof(char); 841 857 break; 842 858 843 case 2: / /effective address + 16 bits displacement859 case 2: /* Effective address + 32 bits displacement */ 844 860 pCpu->disp = (int16_t)DISReadWord(pCpu, lpszCodeBlock); 845 861 size += sizeof(uint16_t); 846 862 break; 847 863 848 case 3: / /registers864 case 3: /* registers */ 849 865 break; 850 866 } … … 855 871 // Query the size of the ModRM parameters and fetch the immediate data (if any) 856 872 //***************************************************************************** 857 unsigned QueryModRM_SizeOnly(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, int*pSibInc)858 { 859 int mod, rm,sibinc;873 unsigned QueryModRM_SizeOnly(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, unsigned *pSibInc) 874 { 875 unsigned sibinc; 860 876 unsigned size = 0; 861 862 rm = MODRM_RM(pCpu->ModRM);863 mod = MODRM_MOD(pCpu->ModRM);877 unsigned reg = pCpu->ModRM.Bits.Reg; 878 unsigned mod = pCpu->ModRM.Bits.Mod; 879 unsigned rm = pCpu->ModRM.Bits.Rm; 864 880 865 881 if (!pSibInc) 866 {867 882 pSibInc = &sibinc; 868 }869 883 870 884 *pSibInc = 0; 871 885 872 if (pCpu->addrmode == CPUMODE_32BIT) 873 {//32 bits addressing mode 886 if (pCpu->addrmode != CPUMODE_16BIT) 887 { 888 Assert(pCpu->addrmode == CPUMODE_32BIT || pCpu->addrmode == CPUMODE_64BIT); 889 /* 890 * Note: displacements in long mode are 8 or 32 bits and sign-extended to 64 bits 891 */ 874 892 if (mod != 3 && rm == 4) 875 { //SIB byte follows ModRM893 { /* SIB byte follows ModRM */ 876 894 *pSibInc = ParseSIB_SizeOnly(lpszCodeBlock, pOp, pParam, pCpu); 877 895 lpszCodeBlock += *pSibInc; … … 882 900 { 883 901 case 0: //effective address 884 if (rm == 5) { //32 bits displacement902 if (rm == 5) { /* 32 bits displacement */ 885 903 size += sizeof(int32_t); 886 904 } 887 / /else register address888 break; 889 890 case 1: / /effective address + 8 bits displacement905 /* else register address */ 906 break; 907 908 case 1: /* Effective address + 8 bits displacement */ 891 909 size += sizeof(char); 892 910 break; 893 911 894 case 2: / /effective address + 32 bits displacement912 case 2: /* Effective address + 32 bits displacement */ 895 913 size += sizeof(int32_t); 896 914 break; 897 915 898 case 3: //registers 899 break; 900 } 901 } 902 else 903 {//16 bits addressing mode 916 case 3: /* registers */ 917 break; 918 } 919 } 920 else 921 { 922 /* 16 bits mode */ 904 923 switch (mod) 905 924 { … … 908 927 size += sizeof(uint16_t); 909 928 } 910 break; 911 912 case 1: //effective address + 8 bits displacement 929 /* else register address */ 930 break; 931 932 case 1: /* Effective address + 8 bits displacement */ 913 933 size += sizeof(char); 914 934 break; 915 935 916 case 2: / /effective address + 16 bits displacement936 case 2: /* Effective address + 32 bits displacement */ 917 937 size += sizeof(uint16_t); 918 938 break; 919 939 920 case 3: / /registers940 case 3: /* registers */ 921 941 break; 922 942 } … … 936 956 { 937 957 unsigned size = sizeof(uint8_t); //ModRM byte 938 int sibinc;939 940 pCpu->ModRM= DISReadByte(pCpu, lpszCodeBlock);958 unsigned sibinc, ModRM; 959 960 ModRM = DISReadByte(pCpu, lpszCodeBlock); 941 961 lpszCodeBlock += sizeof(uint8_t); 942 962 963 pCpu->ModRM.Bits.Rm = MODRM_RM(ModRM); 964 pCpu->ModRM.Bits.Mod = MODRM_MOD(ModRM); 965 pCpu->ModRM.Bits.Reg = MODRM_REG(ModRM); 966 967 if (pCpu->prefix & PREFIX_REX) 968 { 969 /* REX.R extends the Reg field. */ 970 pCpu->ModRM.Bits.Reg |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_R)) << 3); 971 972 /* REX.B extends the Rm field if there is no SIB byte. */ 973 if ( pCpu->ModRM.Bits.Mod != 3 974 && pCpu->ModRM.Bits.Rm == 4) 975 { 976 pCpu->ModRM.Bits.Rm |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_B)) << 3); 977 } 978 } 943 979 size += QueryModRM(lpszCodeBlock, pOp, pParam, pCpu, &sibinc); 944 980 lpszCodeBlock += sibinc; … … 953 989 { 954 990 unsigned size = sizeof(uint8_t); //ModRM byte 955 int sibinc;956 957 pCpu->ModRM= DISReadByte(pCpu, lpszCodeBlock);991 unsigned sibinc, ModRM; 992 993 ModRM = DISReadByte(pCpu, lpszCodeBlock); 958 994 lpszCodeBlock += sizeof(uint8_t); 995 996 pCpu->ModRM.Bits.Rm = MODRM_RM(ModRM); 997 pCpu->ModRM.Bits.Mod = MODRM_MOD(ModRM); 998 pCpu->ModRM.Bits.Reg = MODRM_REG(ModRM); 999 1000 if (pCpu->prefix & PREFIX_REX) 1001 { 1002 /* REX.R extends the Reg field. */ 1003 pCpu->ModRM.Bits.Reg |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_R)) << 3); 1004 1005 /* REX.B extends the Rm field if there is no SIB byte. */ 1006 if ( pCpu->ModRM.Bits.Mod != 3 1007 && pCpu->ModRM.Bits.Rm == 4) 1008 { 1009 pCpu->ModRM.Bits.Rm |= ((!!(pCpu->prefix_rex & PREFIX_REX_FLAGS_B)) << 3); 1010 } 1011 } 959 1012 960 1013 size += QueryModRM_SizeOnly(lpszCodeBlock, pOp, pParam, pCpu, &sibinc); … … 1573 1626 #endif 1574 1627 1575 pCpu->ModRM = DISReadByte(pCpu, lpszCodeBlock); 1628 unsigned ModRM = DISReadByte(pCpu, lpszCodeBlock); 1629 pCpu->ModRM.Bits.Rm = MODRM_RM(ModRM); 1630 pCpu->ModRM.Bits.Mod = MODRM_MOD(ModRM); 1631 pCpu->ModRM.Bits.Reg = MODRM_REG(ModRM); 1576 1632 1577 1633 modrmsize = QueryModRM(lpszCodeBlock+sizeof(uint8_t), pOp, pParam, pCpu); … … 1803 1859 } 1804 1860 //***************************************************************************** 1805 const char *szModRMReg8[] = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"}; 1806 const char *szModRMReg16[] = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"}; 1807 const char *szModRMReg32[] = {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"}; 1861 #if !defined(DIS_CORE_ONLY) && defined(LOG_ENABLED) 1862 const char *szModRMReg8[] = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"}; 1863 const char *szModRMReg16[] = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"}; 1864 const char *szModRMReg32[] = {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"}; 1865 const char *szModRMReg64[] = {"RAX", "RCX", "RDX", "RBX", "RSP", "RBP", "RSI", "RDI", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15"}; 1866 const char *szModRMReg1616[8] = {"BX+SI", "BX+DI", "BP+SI", "BP+DI", "SI", "DI", "BP", "BX"}; 1867 #endif 1868 const char *szModRMSegReg[6] = {"ES", "CS", "SS", "DS", "FS", "GS"}; 1869 const int BaseModRMReg16[8] = { USE_REG_BX, USE_REG_BX, USE_REG_BP, USE_REG_BP, USE_REG_SI, USE_REG_DI, USE_REG_BP, USE_REG_BX}; 1870 const int IndexModRMReg16[4] = { USE_REG_SI, USE_REG_DI, USE_REG_SI, USE_REG_DI}; 1808 1871 //***************************************************************************** 1809 1872 void disasmModRMReg(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam, int fRegAddr) … … 1811 1874 int subtype, type, mod; 1812 1875 1813 mod = MODRM_MOD(pCpu->ModRM);1876 mod = pCpu->ModRM.Bits.Mod; 1814 1877 1815 1878 type = OP_PARM_VTYPE(pParam->param); … … 1852 1915 } 1853 1916 //***************************************************************************** 1854 const char *szModRMReg1616[8] = {"BX+SI", "BX+DI", "BP+SI", "BP+DI", "SI", "DI", "BP", "BX"};1855 int BaseModRMReg16[8] = { USE_REG_BX, USE_REG_BX, USE_REG_BP, USE_REG_BP, USE_REG_SI, USE_REG_DI, USE_REG_BP, USE_REG_BX};1856 int IndexModRMReg16[4] = { USE_REG_SI, USE_REG_DI, USE_REG_SI, USE_REG_DI};1857 1917 //***************************************************************************** 1858 1918 void disasmModRMReg16(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam) … … 1868 1928 } 1869 1929 //***************************************************************************** 1870 const char *szModRMSegReg[6] = {"ES", "CS", "SS", "DS", "FS", "GS"};1871 1930 //***************************************************************************** 1872 1931 void disasmModRMSReg(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam) trunk/src/VBox/VMM/PATM/PATMPatch.cpp
r8234 r8333 703 703 pPB[offset++] = DISQuerySegPrefixByte(pCpu); 704 704 pPB[offset++] = 0xFF; // push r/m32 705 pPB[offset++] = MAKE_MODRM( MODRM_MOD(pCpu->ModRM), 6 /* group 5 */, MODRM_RM(pCpu->ModRM));705 pPB[offset++] = MAKE_MODRM(pCpu->ModRM.Bits.Mod, 6 /* group 5 */, pCpu->ModRM.Bits.Rm); 706 706 i = 2; /* standard offset of modrm bytes */ 707 707 if (pCpu->prefix & PREFIX_OPSIZE) … … 800 800 801 801 pPB[offset++] = 0xFF; // push r/m32 802 pPB[offset++] = MAKE_MODRM( MODRM_MOD(pCpu->ModRM), 6 /* group 5 */, MODRM_RM(pCpu->ModRM));802 pPB[offset++] = MAKE_MODRM(pCpu->ModRM.Bits.Mod, 6 /* group 5 */, pCpu->ModRM.Bits.Rm); 803 803 i = 2; /* standard offset of modrm bytes */ 804 804 if (pCpu->prefix & PREFIX_OPSIZE) … … 1394 1394 pPB[offset++] = 0x8D; // lea edx, dword ptr [dest] 1395 1395 // duplicate and modify modrm byte and additional bytes if present (e.g. direct address) 1396 pPB[offset++] = MAKE_MODRM( MODRM_MOD(pCpu->ModRM), USE_REG_EDX, MODRM_RM(pCpu->ModRM));1396 pPB[offset++] = MAKE_MODRM(pCpu->ModRM.Bits.Mod, USE_REG_EDX, pCpu->ModRM.Bits.Rm); 1397 1397 1398 1398 i = 3; /* standard offset of modrm bytes */ … … 1489 1489 pPB[offset++] = 0x8D; // lea edx, dword ptr [dest] 1490 1490 // duplicate and modify modrm byte and additional bytes if present (e.g. direct address) 1491 pPB[offset++] = MAKE_MODRM( MODRM_MOD(pCpu->ModRM), USE_REG_EDX, MODRM_RM(pCpu->ModRM));1491 pPB[offset++] = MAKE_MODRM(pCpu->ModRM.Bits.Mod, USE_REG_EDX, pCpu->ModRM.Bits.Rm); 1492 1492 1493 1493 i = 3; /* standard offset of modrm bytes */

