VirtualBox

Changeset 9774 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 17, 2008 2:55:50 PM (17 years ago)
Author:
vboxsync
Message:

IOM updates for 64 bits mode.

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/IOMInternal.h

    r9387 r9774  
    519519
    520520/* Disassembly helpers used in IOMAll.cpp & IOMAllMMIO.cpp */
    521 bool iomGetRegImmData(PDISCPUSTATE pCpu, PCOP_PARAMETER pParam, PCPUMCTXCORE pRegFrame, uint32_t *pu32Data, unsigned *pcbSize);
    522 bool iomSaveDataToReg(PDISCPUSTATE pCpu, PCOP_PARAMETER pParam, PCPUMCTXCORE pRegFrame, unsigned u32Data);
     521bool iomGetRegImmData(PDISCPUSTATE pCpu, PCOP_PARAMETER pParam, PCPUMCTXCORE pRegFrame, uint64_t *pu64Data, unsigned *pcbSize);
     522bool iomSaveDataToReg(PDISCPUSTATE pCpu, PCOP_PARAMETER pParam, PCPUMCTXCORE pRegFrame, uint64_t u32Data);
    523523
    524524__END_DECLS
  • trunk/src/VBox/VMM/VMMAll/IOMAll.cpp

    r9280 r9774  
    7777 * @param   pParam              Pointer to parameter of instruction to proccess.
    7878 * @param   pRegFrame           Pointer to CPUMCTXCORE guest structure.
    79  * @param   pu32Data            Where to store retrieved data.
    80  * @param   pcbSize             Where to store the size of data (1, 2, 4).
    81  */
    82 bool iomGetRegImmData(PDISCPUSTATE pCpu, PCOP_PARAMETER pParam, PCPUMCTXCORE pRegFrame, uint32_t *pu32Data, unsigned *pcbSize)
     79 * @param   pu64Data            Where to store retrieved data.
     80 * @param   pcbSize             Where to store the size of data (1, 2, 4, 8).
     81 */
     82bool iomGetRegImmData(PDISCPUSTATE pCpu, PCOP_PARAMETER pParam, PCPUMCTXCORE pRegFrame, uint64_t *pu64Data, unsigned *pcbSize)
    8383{
    8484    if (pParam->flags & (USE_BASE | USE_INDEX | USE_SCALE | USE_DISPLACEMENT8 | USE_DISPLACEMENT16 | USE_DISPLACEMENT32))
    8585    {
    8686        *pcbSize  = 0;
    87         *pu32Data = 0;
     87        *pu64Data = 0;
    8888        return false;
    8989    }
     
    9292    {
    9393        *pcbSize  = 4;
    94         DISFetchReg32(pRegFrame, pParam->base.reg_gen, pu32Data);
     94        DISFetchReg32(pRegFrame, pParam->base.reg_gen, (uint32_t *)pu64Data);
    9595        return true;
    9696    }
     
    9999    {
    100100        *pcbSize  = 2;
    101         DISFetchReg16(pRegFrame, pParam->base.reg_gen, (uint16_t *)pu32Data);
     101        DISFetchReg16(pRegFrame, pParam->base.reg_gen, (uint16_t *)pu64Data);
    102102        return true;
    103103    }
     
    106106    {
    107107        *pcbSize  = 1;
    108         DISFetchReg8(pRegFrame, pParam->base.reg_gen, (uint8_t *)pu32Data);
     108        DISFetchReg8(pRegFrame, pParam->base.reg_gen, (uint8_t *)pu64Data);
    109109        return true;
    110110    }
     
    112112    if (pParam->flags & USE_REG_GEN64)
    113113    {
    114         AssertFailed();
    115114        *pcbSize  = 8;
    116         ///DISFetchReg64(pRegFrame, pParam->base.reg_gen, pu32Data);
     115        DISFetchReg64(pRegFrame, pParam->base.reg_gen, pu64Data);
    117116        return true;
    118117    }
     
    120119    if (pParam->flags & (USE_IMMEDIATE64))
    121120    {
    122         AssertFailed();
    123121        *pcbSize  = 8;
    124         *pu32Data = (uint32_t)pParam->parval;
     122        *pu64Data = pParam->parval;
    125123        return true;
    126124    }
     
    129127    {
    130128        *pcbSize  = 4;
    131         *pu32Data = (uint32_t)pParam->parval;
     129        *pu64Data = (uint32_t)pParam->parval;
    132130        return true;
    133131    }
     
    136134    {
    137135        *pcbSize  = 2;
    138         *pu32Data = (uint16_t)pParam->parval;
     136        *pu64Data = (uint16_t)pParam->parval;
    139137        return true;
    140138    }
     
    143141    {
    144142        *pcbSize  = 1;
    145         *pu32Data = (uint8_t)pParam->parval;
     143        *pu64Data = (uint8_t)pParam->parval;
    146144        return true;
    147145    }
     
    150148    {
    151149        *pcbSize  = 2;
    152         DISFetchRegSeg(pRegFrame, pParam->base.reg_seg, (RTSEL *)pu32Data);
     150        DISFetchRegSeg(pRegFrame, pParam->base.reg_seg, (RTSEL *)pu64Data);
    153151        return true;
    154152    } /* Else - error. */
     
    156154    AssertFailed();
    157155    *pcbSize  = 0;
    158     *pu32Data = 0;
     156    *pu64Data = 0;
    159157    return false;
    160158}
     
    169167 * @param   pParam              Pointer to parameter of instruction to proccess.
    170168 * @param   pRegFrame           Pointer to CPUMCTXCORE guest structure.
    171  * @param   u32Data             8/16/32 bit data to store.
    172  */
    173 bool iomSaveDataToReg(PDISCPUSTATE pCpu, PCOP_PARAMETER pParam, PCPUMCTXCORE pRegFrame, unsigned u32Data)
    174 {
    175     if (pParam->flags & (USE_BASE | USE_INDEX | USE_SCALE | USE_DISPLACEMENT8 | USE_DISPLACEMENT16 | USE_DISPLACEMENT32 | USE_IMMEDIATE8 | USE_IMMEDIATE16 | USE_IMMEDIATE32 | USE_IMMEDIATE32_SX8 | USE_IMMEDIATE16_SX8))
     169 * @param   u64Data             8/16/32/64 bit data to store.
     170 */
     171bool iomSaveDataToReg(PDISCPUSTATE pCpu, PCOP_PARAMETER pParam, PCPUMCTXCORE pRegFrame, uint64_t u64Data)
     172{
     173    if (pParam->flags & (USE_BASE | USE_INDEX | USE_SCALE | USE_DISPLACEMENT8 | USE_DISPLACEMENT16 | USE_DISPLACEMENT32 | USE_DISPLACEMENT64 | USE_IMMEDIATE8 | USE_IMMEDIATE16 | USE_IMMEDIATE32 | USE_IMMEDIATE32_SX8 | USE_IMMEDIATE16_SX8))
    176174    {
    177175        return false;
     
    180178    if (pParam->flags & USE_REG_GEN32)
    181179    {
    182         DISWriteReg32(pRegFrame, pParam->base.reg_gen, u32Data);
     180        DISWriteReg32(pRegFrame, pParam->base.reg_gen, (uint32_t)u64Data);
     181        return true;
     182    }
     183
     184    if (pParam->flags & USE_REG_GEN64)
     185    {
     186        DISWriteReg64(pRegFrame, pParam->base.reg_gen, u64Data);
    183187        return true;
    184188    }
     
    186190    if (pParam->flags & USE_REG_GEN16)
    187191    {
    188         DISWriteReg16(pRegFrame, pParam->base.reg_gen, (uint16_t)u32Data);
     192        DISWriteReg16(pRegFrame, pParam->base.reg_gen, (uint16_t)u64Data);
    189193        return true;
    190194    }
     
    192196    if (pParam->flags & USE_REG_GEN8)
    193197    {
    194         DISWriteReg8(pRegFrame, pParam->base.reg_gen, (uint8_t)u32Data);
     198        DISWriteReg8(pRegFrame, pParam->base.reg_gen, (uint8_t)u64Data);
    195199        return true;
    196200    }
     
    198202    if (pParam->flags & USE_REG_SEG)
    199203    {
    200         DISWriteRegSeg(pRegFrame, pParam->base.reg_seg, (RTSEL)u32Data);
     204        DISWriteRegSeg(pRegFrame, pParam->base.reg_seg, (RTSEL)u64Data);
    201205        return true;
    202206    }
     
    875879     * And get the register size from the first parameter.
    876880     */
    877     uint32_t    uPort = 0;
     881    uint64_t    uPort = 0;
    878882    unsigned    cbSize = 0;
    879883    bool fRc = iomGetRegImmData(pCpu, &pCpu->param2, pRegFrame, &uPort, &cbSize);
     
    934938     * And get the register size and value from the second parameter.
    935939     */
    936     uint32_t    uPort = 0;
     940    uint64_t    uPort = 0;
    937941    unsigned    cbSize = 0;
    938942    bool fRc = iomGetRegImmData(pCpu, &pCpu->param1, pRegFrame, &uPort, &cbSize);
     
    942946    if (rc == VINF_SUCCESS)
    943947    {
    944         uint32_t    u32Data = 0;
    945         fRc = iomGetRegImmData(pCpu, &pCpu->param2, pRegFrame, &u32Data, &cbSize);
     948        uint64_t u64Data = 0;
     949        fRc = iomGetRegImmData(pCpu, &pCpu->param2, pRegFrame, &u64Data, &cbSize);
    946950        AssertMsg(fRc, ("Failed to get reg value!\n")); NOREF(fRc);
    947951
     
    949953         * Attempt to write to the port.
    950954         */
    951         rc = IOMIOPortWrite(pVM, uPort, u32Data, cbSize);
     955        rc = IOMIOPortWrite(pVM, uPort, u64Data, cbSize);
    952956        AssertMsg(rc == VINF_SUCCESS || rc == VINF_IOM_HC_IOPORT_WRITE || (rc >= VINF_EM_FIRST && rc <= VINF_EM_LAST) || VBOX_FAILURE(rc), ("%Vrc\n", rc));
    953957    }
  • trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp

    r9764 r9774  
    235235     */
    236236    unsigned cb = 0;
    237     uint32_t u32Data  = 0;
    238     bool fRc = iomGetRegImmData(pCpu, &pCpu->param2, pRegFrame, &u32Data, &cb);
     237    uint64_t u64Data  = 0;
     238    bool fRc = iomGetRegImmData(pCpu, &pCpu->param2, pRegFrame, &u64Data, &cb);
    239239    AssertMsg(fRc, ("Failed to get reg/imm port number!\n")); NOREF(fRc);
    240240
    241     int rc = iomMMIODoWrite(pVM, pRange, GCPhysFault, &u32Data, cb);
     241    int rc = iomMMIODoWrite(pVM, pRange, GCPhysFault, &u64Data, cb);
    242242    if (rc == VINF_SUCCESS)
    243243        iomMMIOStatLength(pVM, cb);
     
    702702     */
    703703    unsigned cb = 0;
    704     uint32_t uData1;
    705     uint32_t uData2;
     704    uint64_t uData1;
     705    uint64_t uData2;
    706706    int rc;
    707707    if (iomGetRegImmData(pCpu, &pCpu->param1, pRegFrame, &uData1, &cb))
     
    748748{
    749749    unsigned    cb = 0;
    750     uint32_t    uData1;
    751     uint32_t    uData2;
     750    uint64_t    uData1;
     751    uint64_t    uData2;
    752752    bool        fAndWrite;
    753753    int         rc;
     
    778778    {
    779779        /* Emulate AND and update guest flags. */
    780         uint32_t eflags = EMEmulateAnd(&uData1, uData2, cb);
     780        uint32_t eflags = EMEmulateAnd((uint32_t *)&uData1, uData2, cb);
    781781        if (fAndWrite)
    782782            /* Store result to MMIO. */
     
    822822
    823823    unsigned    cb = 0;
    824     uint32_t    uData1;
    825     uint32_t    uData2;
     824    uint64_t    uData1;
     825    uint64_t    uData2;
    826826    int         rc;
    827827
     
    845845    {
    846846        /* Emulate TEST (=AND without write back) and update guest EFLAGS. */
    847         uint32_t eflags = EMEmulateAnd(&uData1, uData2, cb);
     847        uint32_t eflags = EMEmulateAnd((uint32_t *)&uData1, uData2, cb);
    848848        pRegFrame->eflags.u32 = (pRegFrame->eflags.u32 & ~(X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF))
    849849                              | (eflags                &  (X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF));
     
    878878    int         rc;
    879879    unsigned    cb = 0;
    880     uint32_t    uData1;
    881     uint32_t    uData2;
     880    uint64_t    uData1;
     881    uint64_t    uData2;
    882882    if (iomGetRegImmData(pCpu, &pCpu->param1, pRegFrame, &uData1, &cb))
    883883    {
     
    15621562     * And get the I/O register size from the opcode / prefix.
    15631563     */
    1564     uint32_t    Port = 0;
     1564    uint64_t    Port = 0;
    15651565    unsigned    cb = 0;
    15661566    bool fRc = iomGetRegImmData(pCpu, &pCpu->param1, pRegFrame, &Port, &cb);
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