VirtualBox

Changeset 70643 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jan 19, 2018 12:19:32 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
120373
Message:

VMM/IEM: Fix incorrect register decoding and added canonical address checks in fsgsbase instructions emulation.

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

Legend:

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

    r70613 r70643  
    1127411274            return iemRaiseUndefinedOpcode(pVCpu); \
    1127511275    } while (0)
     11276#define IEM_MC_MAYBE_RAISE_NON_CANONICAL_ADDR_GP0(a_u64Addr) \
     11277    do { \
     11278        if (!IEM_IS_CANONICAL(a_u64Addr)) \
     11279            return iemRaiseGeneralProtectionFault0(pVCpu); \
     11280    } while (0)
    1127611281
    1127711282
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r70612 r70643  
    69996999        IEM_MC_ARG(uint64_t, u64Dst, 0);
    70007000        IEM_MC_FETCH_SREG_BASE_U64(u64Dst, X86_SREG_FS);
    7001         IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Dst);
     7001        IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Dst);
    70027002        IEM_MC_ADVANCE_RIP();
    70037003        IEM_MC_END();
     
    70097009        IEM_MC_ARG(uint32_t, u32Dst, 0);
    70107010        IEM_MC_FETCH_SREG_BASE_U32(u32Dst, X86_SREG_FS);
    7011         IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Dst);
     7011        IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Dst);
    70127012        IEM_MC_ADVANCE_RIP();
    70137013        IEM_MC_END();
     
    70277027        IEM_MC_ARG(uint64_t, u64Dst, 0);
    70287028        IEM_MC_FETCH_SREG_BASE_U64(u64Dst, X86_SREG_GS);
    7029         IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Dst);
     7029        IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Dst);
    70307030        IEM_MC_ADVANCE_RIP();
    70317031        IEM_MC_END();
     
    70377037        IEM_MC_ARG(uint32_t, u32Dst, 0);
    70387038        IEM_MC_FETCH_SREG_BASE_U32(u32Dst, X86_SREG_GS);
    7039         IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Dst);
     7039        IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Dst);
    70407040        IEM_MC_ADVANCE_RIP();
    70417041        IEM_MC_END();
     
    70547054        IEM_MC_MAYBE_RAISE_FSGSBASE_XCPT();
    70557055        IEM_MC_ARG(uint64_t, u64Dst, 0);
    7056         IEM_MC_FETCH_GREG_U64(u64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     7056        IEM_MC_FETCH_GREG_U64(u64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     7057        IEM_MC_MAYBE_RAISE_NON_CANONICAL_ADDR_GP0(u64Dst);
    70577058        IEM_MC_STORE_SREG_BASE_U64(X86_SREG_FS, u64Dst);
    70587059        IEM_MC_ADVANCE_RIP();
     
    70647065        IEM_MC_MAYBE_RAISE_FSGSBASE_XCPT();
    70657066        IEM_MC_ARG(uint32_t, u32Dst, 0);
    7066         IEM_MC_FETCH_GREG_U32(u32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     7067        IEM_MC_FETCH_GREG_U32(u32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    70677068        IEM_MC_STORE_SREG_BASE_U64(X86_SREG_FS, u32Dst);
    70687069        IEM_MC_ADVANCE_RIP();
     
    70827083        IEM_MC_MAYBE_RAISE_FSGSBASE_XCPT();
    70837084        IEM_MC_ARG(uint64_t, u64Dst, 0);
    7084         IEM_MC_FETCH_GREG_U64(u64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     7085        IEM_MC_FETCH_GREG_U64(u64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     7086        IEM_MC_MAYBE_RAISE_NON_CANONICAL_ADDR_GP0(u64Dst);
    70857087        IEM_MC_STORE_SREG_BASE_U64(X86_SREG_GS, u64Dst);
    70867088        IEM_MC_ADVANCE_RIP();
     
    70927094        IEM_MC_MAYBE_RAISE_FSGSBASE_XCPT();
    70937095        IEM_MC_ARG(uint32_t, u32Dst, 0);
    7094         IEM_MC_FETCH_GREG_U32(u32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     7096        IEM_MC_FETCH_GREG_U32(u32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    70957097        IEM_MC_STORE_SREG_BASE_U64(X86_SREG_GS, u32Dst);
    70967098        IEM_MC_ADVANCE_RIP();
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r70612 r70643  
    363363    do { AssertCompile(RT_IS_POWER_OF_TWO(a_cbAlign)); CHK_TYPE(RTGCPTR,  a_EffAddr); } while (0)
    364364#define IEM_MC_MAYBE_RAISE_FSGSBASE_XCPT()              do {} while (0)
     365#define IEM_MC_MAYBE_RAISE_NON_CANONICAL_ADDR_GP0(a_u64Addr)    do {} while (0)
    365366
    366367#define IEM_MC_LOCAL(a_Type, a_Name) \
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