VirtualBox

Ignore:
Timestamp:
Jun 6, 2023 2:56:14 PM (18 months ago)
Author:
vboxsync
Message:

VMM/IEM: Added iemRegGRegStoreUxx inline helpers and replaced all the ugly casting around iemGRegRef. Fixed SMSW not clearing high 32-bits and made it set unused bits for the 32-bit operand size too if in 386-mode. bugref:10369

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp

    r100061 r100084  
    49544954        {
    49554955            case IEMMODE_16BIT:
    4956                 *(uint16_t *)iemGRegRef(pVCpu, iGReg) = offSeg;
     4956                iemGRegStoreU16(pVCpu, iGReg, offSeg);
    49574957                break;
    49584958            case IEMMODE_32BIT:
    49594959            case IEMMODE_64BIT:
    4960                 *(uint64_t *)iemGRegRef(pVCpu, iGReg) = offSeg;
     4960                iemGRegStoreU64(pVCpu, iGReg, offSeg);
    49614961                break;
    49624962            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    55295529    switch (enmEffOpSize)
    55305530    {
    5531         case IEMMODE_16BIT: *(uint16_t *)iemGRegRef(pVCpu, iGReg) = pVCpu->cpum.GstCtx.ldtr.Sel; break;
    5532         case IEMMODE_32BIT: *(uint64_t *)iemGRegRef(pVCpu, iGReg) = pVCpu->cpum.GstCtx.ldtr.Sel; break;
    5533         case IEMMODE_64BIT: *(uint64_t *)iemGRegRef(pVCpu, iGReg) = pVCpu->cpum.GstCtx.ldtr.Sel; break;
     5531        case IEMMODE_16BIT:
     5532            iemGRegStoreU16(pVCpu, iGReg, pVCpu->cpum.GstCtx.ldtr.Sel);
     5533            break;
     5534        case IEMMODE_32BIT:
     5535        case IEMMODE_64BIT:
     5536            iemGRegStoreU64(pVCpu, iGReg, pVCpu->cpum.GstCtx.ldtr.Sel);
     5537            break;
    55345538        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    55355539    }
     
    57115715    switch (enmEffOpSize)
    57125716    {
    5713         case IEMMODE_16BIT: *(uint16_t *)iemGRegRef(pVCpu, iGReg) = pVCpu->cpum.GstCtx.tr.Sel; break;
    5714         case IEMMODE_32BIT: *(uint64_t *)iemGRegRef(pVCpu, iGReg) = pVCpu->cpum.GstCtx.tr.Sel; break;
    5715         case IEMMODE_64BIT: *(uint64_t *)iemGRegRef(pVCpu, iGReg) = pVCpu->cpum.GstCtx.tr.Sel; break;
     5717        case IEMMODE_16BIT:
     5718            iemGRegStoreU16(pVCpu, iGReg, pVCpu->cpum.GstCtx.tr.Sel);
     5719            break;
     5720        case IEMMODE_32BIT:
     5721        case IEMMODE_64BIT:
     5722            iemGRegStoreU64(pVCpu, iGReg, pVCpu->cpum.GstCtx.tr.Sel);
     5723            break;
    57165724        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    57175725    }
     
    58605868    /* Store it. */
    58615869    if (IEM_IS_64BIT_CODE(pVCpu))
    5862         *(uint64_t *)iemGRegRef(pVCpu, iGReg) = crX;
     5870        iemGRegStoreU64(pVCpu, iGReg, crX);
    58635871    else
    5864         *(uint64_t *)iemGRegRef(pVCpu, iGReg) = (uint32_t)crX;
     5872        iemGRegStoreU64(pVCpu, iGReg, (uint32_t)crX);
    58655873
    58665874    return iemRegAddToRipAndFinishingClearingRF(pVCpu, cbInstr);
     
    58935901        case IEMMODE_16BIT:
    58945902            if (IEM_GET_TARGET_CPU(pVCpu) > IEMTARGETCPU_386)
    5895                 *(uint16_t *)iemGRegRef(pVCpu, iGReg) = (uint16_t)u64GuestCr0;
     5903                iemGRegStoreU16(pVCpu, iGReg, (uint16_t)u64GuestCr0);
     5904            /* Unused bits are set on 386 and older CPU: */
    58965905            else if (IEM_GET_TARGET_CPU(pVCpu) >= IEMTARGETCPU_386)
    5897                 *(uint16_t *)iemGRegRef(pVCpu, iGReg) = (uint16_t)u64GuestCr0 | 0xffe0;
     5906                iemGRegStoreU16(pVCpu, iGReg, (uint16_t)u64GuestCr0 | 0xffe0);
    58985907            else
    5899                 *(uint16_t *)iemGRegRef(pVCpu, iGReg) = (uint16_t)u64GuestCr0 | 0xfff0;
     5908                iemGRegStoreU16(pVCpu, iGReg, (uint16_t)u64GuestCr0 | 0xfff0);
    59005909            break;
    59015910
     5911/** @todo testcase for bits 31:16. We're not doing that correctly. */
     5912
    59025913        case IEMMODE_32BIT:
    5903             *(uint32_t *)iemGRegRef(pVCpu, iGReg) = (uint32_t)u64GuestCr0;
     5914            if (IEM_GET_TARGET_CPU(pVCpu) >= IEMTARGETCPU_386)
     5915                iemGRegStoreU32(pVCpu, iGReg, (uint32_t)u64GuestCr0);
     5916            else /** @todo test this! */
     5917                iemGRegStoreU32(pVCpu, iGReg, (uint32_t)u64GuestCr0 | UINT32_C(0x7fffffe0)); /* Unused bits are set on 386. */
    59045918            break;
    59055919
    59065920        case IEMMODE_64BIT:
    5907             *(uint64_t *)iemGRegRef(pVCpu, iGReg) = u64GuestCr0;
     5921            iemGRegStoreU64(pVCpu, iGReg, u64GuestCr0);
    59085922            break;
    59095923
     
    66546668
    66556669    if (IEM_IS_64BIT_CODE(pVCpu))
    6656         *(uint64_t *)iemGRegRef(pVCpu, iGReg) = drX;
     6670        iemGRegStoreU64(pVCpu, iGReg, drX);
    66576671    else
    6658         *(uint64_t *)iemGRegRef(pVCpu, iGReg) = (uint32_t)drX;
     6672        iemGRegStoreU32(pVCpu, iGReg, (uint32_t)drX);
    66596673
    66606674    return iemRegAddToRipAndFinishingClearingRF(pVCpu, cbInstr);
     
    68276841     * (different on 386/486) is exceedingly rare.
    68286842     */
    6829     uint64_t trX;
     6843    uint32_t trX;
    68306844    switch (iTrReg)
    68316845    {
     
    68396853    }
    68406854
    6841     *(uint64_t *)iemGRegRef(pVCpu, iGReg) = (uint32_t)trX;
     6855    iemGRegStoreU32(pVCpu, iGReg, trX);
    68426856
    68436857    return iemRegAddToRipAndFinishingClearingRF(pVCpu, cbInstr);
     
    68736887     * Read the new value from the source register.
    68746888     */
    6875     uint64_t uNewTrX;
    6876     if (IEM_IS_64BIT_CODE(pVCpu)) /** @todo err... 64-bit 386? */
    6877         uNewTrX = iemGRegFetchU64(pVCpu, iGReg);
    6878     else
    6879         uNewTrX = iemGRegFetchU32(pVCpu, iGReg);
     6889    uint32_t uNewTrX = iemGRegFetchU32(pVCpu, iGReg);
    68806890
    68816891    /*
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