Changeset 7285 in vbox for trunk/src/VBox
- Timestamp:
- Mar 5, 2008 7:46:32 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Disassembler/DisasmCore.cpp
r7138 r7285 173 173 #define DIS_READ_REG32(p, idx) (*(uint32_t *)((char *)(p) + g_aReg32Index[idx])) 174 174 #define DIS_WRITE_REG32(p, idx, val) (*(uint32_t *)((char *)(p) + g_aReg32Index[idx]) = val) 175 #define DIS_PTR_REG32(p, idx) ( (uint32_t *)((char *)(p) + g_aReg32Index[idx])) 175 176 176 177 /** … … 195 196 #define DIS_READ_REG16(p, idx) (*(uint16_t *)((char *)(p) + g_aReg16Index[idx])) 196 197 #define DIS_WRITE_REG16(p, idx, val) (*(uint16_t *)((char *)(p) + g_aReg16Index[idx]) = val) 198 #define DIS_PTR_REG16(p, idx) ( (uint16_t *)((char *)(p) + g_aReg16Index[idx])) 197 199 198 200 /** … … 217 219 #define DIS_READ_REG8(p, idx) (*(uint8_t *)((char *)(p) + g_aReg8Index[idx])) 218 220 #define DIS_WRITE_REG8(p, idx, val) (*(uint8_t *)((char *)(p) + g_aReg8Index[idx]) = val) 221 #define DIS_PTR_REG8(p, idx) ( (uint8_t *)((char *)(p) + g_aReg8Index[idx])) 219 222 220 223 /** … … 558 561 559 562 /** 560 * Returns the value of the specified 16bits general purpose register563 * Returns the value of the specified 32 bits general purpose register 561 564 * 562 565 */ … … 566 569 567 570 *pVal = DIS_READ_REG32(pCtx, reg32); 571 return VINF_SUCCESS; 572 } 573 574 /** 575 * Returns the pointer to the specified 8 bits general purpose register 576 * 577 */ 578 DISDECL(int) DISPtrReg8(PCPUMCTXCORE pCtx, uint32_t reg8, uint8_t **ppReg) 579 { 580 AssertReturn(reg8 < ELEMENTS(g_aReg8Index), VERR_INVALID_PARAMETER); 581 582 *ppReg = DIS_PTR_REG8(pCtx, reg8); 583 return VINF_SUCCESS; 584 } 585 586 /** 587 * Returns the pointer to the specified 16 bits general purpose register 588 * 589 */ 590 DISDECL(int) DISPtrReg16(PCPUMCTXCORE pCtx, uint32_t reg16, uint16_t **ppReg) 591 { 592 AssertReturn(reg16 < ELEMENTS(g_aReg16Index), VERR_INVALID_PARAMETER); 593 594 *ppReg = DIS_PTR_REG16(pCtx, reg16); 595 return VINF_SUCCESS; 596 } 597 598 /** 599 * Returns the pointer to the specified 32 bits general purpose register 600 * 601 */ 602 DISDECL(int) DISPtrReg32(PCPUMCTXCORE pCtx, uint32_t reg32, uint32_t **ppReg) 603 { 604 AssertReturn(reg32 < ELEMENTS(g_aReg32Index), VERR_INVALID_PARAMETER); 605 606 *ppReg = DIS_PTR_REG32(pCtx, reg32); 568 607 return VINF_SUCCESS; 569 608 } … … 848 887 return VINF_SUCCESS; 849 888 } 889 890 /** 891 * Returns the pointer to a register of the parameter in pParam. We need this 892 * pointer when an interpreted instruction updates a register as a side effect. 893 * In CMPXCHG we know that only [r/e]ax is updated, but with XADD this could 894 * be every register. 895 * 896 * @returns VBox error code 897 * @param pCtx CPU context structure pointer 898 * @param pCpu Pointer to cpu structure which have DISCPUSTATE::mode 899 * set correctly. 900 * @param pParam Pointer to the parameter to parse 901 * @param pReg Pointer to parameter value (OUT) 902 * @param cbsize Parameter size (OUT) 903 * 904 * @note Currently doesn't handle FPU/XMM/MMX/3DNow! parameters correctly!! 905 * 906 */ 907 DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, POP_PARAMETER pParam, uint32_t **ppReg, size_t *pcbSize) 908 { 909 if(pParam->flags & (USE_REG_GEN8|USE_REG_GEN16|USE_REG_GEN32|USE_REG_FP|USE_REG_MMX|USE_REG_XMM|USE_REG_CR|USE_REG_DBG|USE_REG_SEG|USE_REG_TEST)) 910 { 911 if(pParam->flags & USE_REG_GEN8) 912 { 913 uint8_t *pu8Reg; 914 if(VBOX_SUCCESS(DISPtrReg8(pCtx, pParam->base.reg_gen8, &pu8Reg))) 915 { 916 *pcbSize = sizeof(uint8_t); 917 *ppReg = (uint32_t*)pu8Reg; 918 return VINF_SUCCESS; 919 } 920 } 921 else if(pParam->flags & USE_REG_GEN16) 922 { 923 uint16_t *pu16Reg; 924 if(VBOX_SUCCESS(DISPtrReg16(pCtx, pParam->base.reg_gen16, &pu16Reg))) 925 { 926 *pcbSize = sizeof(uint16_t); 927 *ppReg = (uint32_t*)pu16Reg; 928 return VINF_SUCCESS; 929 } 930 } 931 else if(pParam->flags & USE_REG_GEN32) 932 { 933 uint32_t *pu32Reg; 934 if(VBOX_SUCCESS(DISPtrReg32(pCtx, pParam->base.reg_gen32, &pu32Reg))) 935 { 936 *pcbSize = sizeof(uint32_t); 937 *ppReg = pu32Reg; 938 return VINF_SUCCESS; 939 } 940 } 941 } 942 return VERR_INVALID_PARAMETER; 943 } 850 944 //***************************************************************************** 851 945 //*****************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.