VirtualBox

Ignore:
Timestamp:
Dec 11, 2023 3:20:48 PM (14 months ago)
Author:
vboxsync
Message:

VMM/IEM: IEM_MC_POP_Uxx -> IEM_MC_POP_GREG_Uxx, popping by register number instead of reference (pointer). bugref:10371

File:
1 edited

Legend:

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

    r102522 r102572  
    23522352    {
    23532353        case IEMMODE_16BIT:
    2354             IEM_MC_BEGIN(0, 1, 0, 0);
     2354            IEM_MC_BEGIN(0, 0, 0, 0);
    23552355            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    2356             IEM_MC_LOCAL(uint16_t *, pu16Dst);
    2357             IEM_MC_REF_GREG_U16(pu16Dst, iReg);
    2358             IEM_MC_POP_U16(pu16Dst);
     2356            IEM_MC_POP_GREG_U16(iReg);
    23592357            IEM_MC_ADVANCE_RIP_AND_FINISH();
    23602358            IEM_MC_END();
     
    23622360
    23632361        case IEMMODE_32BIT:
    2364             IEM_MC_BEGIN(0, 1, IEM_MC_F_MIN_386 | IEM_MC_F_NOT_64BIT, 0);
     2362            IEM_MC_BEGIN(0, 0, IEM_MC_F_MIN_386 | IEM_MC_F_NOT_64BIT, 0);
    23652363            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    2366             IEM_MC_LOCAL(uint32_t *, pu32Dst);
    2367             IEM_MC_REF_GREG_U32(pu32Dst, iReg);
    2368             IEM_MC_POP_U32(pu32Dst);
    2369             IEM_MC_CLEAR_HIGH_GREG_U64(iReg); /** @todo testcase*/
     2364            IEM_MC_POP_GREG_U32(iReg);
    23702365            IEM_MC_ADVANCE_RIP_AND_FINISH();
    23712366            IEM_MC_END();
     
    23732368
    23742369        case IEMMODE_64BIT:
    2375             IEM_MC_BEGIN(0, 1, IEM_MC_F_64BIT, 0);
     2370            IEM_MC_BEGIN(0, 0, IEM_MC_F_64BIT, 0);
    23762371            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    2377             IEM_MC_LOCAL(uint64_t *, pu64Dst);
    2378             IEM_MC_REF_GREG_U64(pu64Dst, iReg);
    2379             IEM_MC_POP_U64(pu64Dst);
     2372            IEM_MC_POP_GREG_U64(iReg);
    23802373            IEM_MC_ADVANCE_RIP_AND_FINISH();
    23812374            IEM_MC_END();
     
    24332426{
    24342427    IEMOP_MNEMONIC(pop_rSP, "pop rSP");
    2435     if (IEM_IS_64BIT_CODE(pVCpu))
    2436     {
    2437         if (pVCpu->iem.s.uRexB)
    2438             return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xSP);
    2439         pVCpu->iem.s.enmDefOpSize = IEMMODE_64BIT;
    2440         pVCpu->iem.s.enmEffOpSize = !(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
    2441     }
    2442 
    2443     /** @todo add testcase for this instruction. */
    2444     switch (pVCpu->iem.s.enmEffOpSize)
    2445     {
    2446         case IEMMODE_16BIT:
    2447             IEM_MC_BEGIN(0, 2, 0, 0);
    2448             IEMOP_HLP_DECODED_NL_1(OP_POP, IEMOPFORM_FIXED, OP_PARM_REG_ESP,
    2449                                    DISOPTYPE_HARMLESS | DISOPTYPE_X86_DEFAULT_64_OP_SIZE | DISOPTYPE_X86_REXB_EXTENDS_OPREG);
    2450             IEM_MC_LOCAL(uint16_t,    u16Dst);
    2451             IEM_MC_LOCAL(uint16_t *,  pu16Dst);
    2452             IEM_MC_REF_LOCAL(pu16Dst, u16Dst);
    2453             IEM_MC_POP_U16(pu16Dst); /** @todo not correct MC, fix later. */
    2454             IEM_MC_STORE_GREG_U16(X86_GREG_xSP, u16Dst);
    2455             IEM_MC_ADVANCE_RIP_AND_FINISH();
    2456             IEM_MC_END();
    2457             break;
    2458 
    2459         case IEMMODE_32BIT:
    2460             IEM_MC_BEGIN(0, 2, IEM_MC_F_MIN_386, 0);
    2461             IEMOP_HLP_DECODED_NL_1(OP_POP, IEMOPFORM_FIXED, OP_PARM_REG_ESP,
    2462                                    DISOPTYPE_HARMLESS | DISOPTYPE_X86_DEFAULT_64_OP_SIZE | DISOPTYPE_X86_REXB_EXTENDS_OPREG);
    2463             IEM_MC_LOCAL(uint32_t,    u32Dst);
    2464             IEM_MC_LOCAL(uint32_t *,  pu32Dst);
    2465             IEM_MC_REF_LOCAL(pu32Dst, u32Dst);
    2466             IEM_MC_POP_U32(pu32Dst);
    2467             IEM_MC_STORE_GREG_U32(X86_GREG_xSP, u32Dst);
    2468             IEM_MC_ADVANCE_RIP_AND_FINISH();
    2469             IEM_MC_END();
    2470             break;
    2471 
    2472         case IEMMODE_64BIT:
    2473             IEM_MC_BEGIN(0, 2, IEM_MC_F_64BIT, 0);
    2474             IEMOP_HLP_DECODED_NL_1(OP_POP, IEMOPFORM_FIXED, OP_PARM_REG_ESP,
    2475                                    DISOPTYPE_HARMLESS | DISOPTYPE_X86_DEFAULT_64_OP_SIZE | DISOPTYPE_X86_REXB_EXTENDS_OPREG);
    2476             IEM_MC_LOCAL(uint64_t,    u64Dst);
    2477             IEM_MC_LOCAL(uint64_t *,  pu64Dst);
    2478             IEM_MC_REF_LOCAL(pu64Dst, u64Dst);
    2479             IEM_MC_POP_U64(pu64Dst);
    2480             IEM_MC_STORE_GREG_U64(X86_GREG_xSP, u64Dst);
    2481             IEM_MC_ADVANCE_RIP_AND_FINISH();
    2482             IEM_MC_END();
    2483             break;
    2484 
    2485         IEM_NOT_REACHED_DEFAULT_CASE_RET();
    2486     }
     2428    return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xSP);
    24872429}
    24882430
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