VirtualBox

Changeset 7285 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 5, 2008 7:46:32 AM (17 years ago)
Author:
vboxsync
Message:

added DISQueryParamRegPtr to return a pointer to a register which is modified by an interpreted instruction

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r7138 r7285  
    173173#define DIS_READ_REG32(p, idx)       (*(uint32_t *)((char *)(p) + g_aReg32Index[idx]))
    174174#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]))
    175176
    176177/**
     
    195196#define DIS_READ_REG16(p, idx)          (*(uint16_t *)((char *)(p) + g_aReg16Index[idx]))
    196197#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]))
    197199
    198200/**
     
    217219#define DIS_READ_REG8(p, idx)           (*(uint8_t *)((char *)(p) + g_aReg8Index[idx]))
    218220#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]))
    219222
    220223/**
     
    558561
    559562/**
    560  * Returns the value of the specified 16 bits general purpose register
     563 * Returns the value of the specified 32 bits general purpose register
    561564 *
    562565 */
     
    566569
    567570    *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 */
     578DISDECL(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 */
     590DISDECL(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 */
     602DISDECL(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);
    568607    return VINF_SUCCESS;
    569608}
     
    848887    return VINF_SUCCESS;
    849888}
     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 */
     907DISDECL(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}
    850944//*****************************************************************************
    851945//*****************************************************************************
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette