VirtualBox

Changeset 47327 in vbox


Ignore:
Timestamp:
Jul 22, 2013 10:11:09 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
87470
Message:

IEM: Implemented swapgs

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

Legend:

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

    r47326 r47327  
    73947394    { \
    73957395        if (pIemCpu->enmCpuMode == IEMMODE_64BIT) \
     7396            return IEMOP_RAISE_INVALID_OPCODE(); \
     7397    } while (0)
     7398
     7399/** The instruction is only available in 64-bit mode, throw #UD if we're not in
     7400 * 64-bit mode. */
     7401#define IEMOP_HLP_ONLY_64BIT() \
     7402    do \
     7403    { \
     7404        if (pIemCpu->enmCpuMode != IEMMODE_64BIT) \
    73967405            return IEMOP_RAISE_INVALID_OPCODE(); \
    73977406    } while (0)
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r47326 r47327  
    44184418
    44194419/**
     4420 * Implements 'SWAPGS'.
     4421 */
     4422IEM_CIMPL_DEF_0(iemCImpl_swapgs)
     4423{
     4424    Assert(pIemCpu->enmCpuMode == IEMMODE_64BIT); /* Caller checks this. */
     4425
     4426    /*
     4427     * Permission checks.
     4428     */
     4429    if (pIemCpu->uCpl != 0)
     4430    {
     4431        Log2(("swapgs: CPL != 0\n"));
     4432        return iemRaiseUndefinedOpcode(pIemCpu);
     4433    }
     4434
     4435    /*
     4436     * Do the job.
     4437     */
     4438    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     4439    uint64_t uOtherGsBase = pCtx->msrKERNELGSBASE;
     4440    pCtx->msrKERNELGSBASE = pCtx->gs.u64Base;
     4441    pCtx->gs.u64Base = uOtherGsBase;
     4442
     4443    iemRegAddToRip(pIemCpu, cbInstr);
     4444    return VINF_SUCCESS;
     4445}
     4446
     4447
     4448/**
    44204449 * Implements 'CPUID'.
    44214450 */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r47326 r47327  
    811811{
    812812    IEMOP_MNEMONIC("monitor");
    813     IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     813    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo Verify that monitor is allergic to lock prefixes. */
    814814    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_monitor, pIemCpu->iEffSeg);
    815815}
     
    819819FNIEMOP_DEF(iemOp_Grp7_mwait)
    820820{
    821     IEMOP_MNEMONIC("mwait");
     821    IEMOP_MNEMONIC("mwait"); /** @todo Verify that mwait is allergic to lock prefixes. */
    822822    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    823823    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_mwait);
     
    828828FNIEMOP_DEF_1(iemOp_Grp7_lgdt, uint8_t, bRm)
    829829{
     830    IEMOP_MNEMONIC("lgdt");
    830831    IEMOP_HLP_NO_LOCK_PREFIX();
    831832
     
    904905FNIEMOP_DEF_1(iemOp_Grp7_smsw, uint8_t, bRm)
    905906{
     907    IEMOP_MNEMONIC("smsw");
    906908    IEMOP_HLP_NO_LOCK_PREFIX();
    907909    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    960962    /* The operand size is effectively ignored, all is 16-bit and only the
    961963       lower 3-bits are used. */
     964    IEMOP_MNEMONIC("lmsw");
    962965    IEMOP_HLP_NO_LOCK_PREFIX();
    963966    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    986989FNIEMOP_DEF_1(iemOp_Grp7_invlpg, uint8_t, bRm)
    987990{
     991    IEMOP_MNEMONIC("invlpg");
    988992    IEMOP_HLP_NO_LOCK_PREFIX();
    989993    IEM_MC_BEGIN(1, 1);
     
    9991003FNIEMOP_DEF(iemOp_Grp7_swapgs)
    10001004{
    1001     NOREF(pIemCpu);
    1002     IEMOP_BITCH_ABOUT_STUB();
    1003     return VERR_IEM_INSTR_NOT_IMPLEMENTED;
     1005    IEMOP_MNEMONIC("swapgs");
     1006    IEMOP_HLP_NO_LOCK_PREFIX();
     1007    IEMOP_HLP_ONLY_64BIT();
     1008    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_swapgs);
    10041009}
    10051010
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r47326 r47327  
    9898#define IEMOP_HLP_NO_LOCK_PREFIX()                          do { } while (0)
    9999#define IEMOP_HLP_NO_64BIT()                                do { } while (0)
     100#define IEMOP_HLP_ONLY_64BIT()                              do { } while (0)
    100101#define IEMOP_HLP_64BIT_OP_SIZE()                           do { } while (0)
    101102#define IEMOP_HLP_DEFAULT_64BIT_OP_SIZE()                   do { } while (0)
Note: See TracChangeset for help on using the changeset viewer.

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