VirtualBox

Changeset 42641 in vbox for trunk


Ignore:
Timestamp:
Aug 6, 2012 11:17:02 PM (12 years ago)
Author:
vboxsync
Message:

IEM: Implemented WRMSR. Fixed mixed up src/dst in XADD.

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

Legend:

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

    r42633 r42641  
    73847384#if 1 /* NT4SP1 - xadd early boot. */
    73857385            || (pOrgCtx->cs.Sel == 8 && pOrgCtx->rip == 0x8019cf0f)
     7386#endif
     7387#if 1 /* NT4SP1 - wrmsr (intel MSR). */
     7388            || (pOrgCtx->cs.Sel == 8 && pOrgCtx->rip == 0x8011a6d4)
    73867389#endif
    73877390           )
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r42621 r42641  
    36943694
    36953695/**
     3696 * Implements WRMSR.
     3697 */
     3698IEM_CIMPL_DEF_0(iemCImpl_wrmsr)
     3699{
     3700    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     3701
     3702    /*
     3703     * Check preconditions.
     3704     */
     3705    if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_MSR))
     3706        return iemRaiseUndefinedOpcode(pIemCpu);
     3707    if (pIemCpu->uCpl != 0)
     3708        return iemRaiseGeneralProtectionFault0(pIemCpu);
     3709
     3710    /*
     3711     * Do the job.
     3712     */
     3713    RTUINT64U uValue;
     3714    uValue.au32[0] = pCtx->eax;
     3715    uValue.au32[1] = pCtx->edx;
     3716
     3717    int rc = CPUMSetGuestMsr(IEMCPU_TO_VMCPU(pIemCpu), pCtx->ecx, uValue.u);
     3718    if (rc != VINF_SUCCESS)
     3719    {
     3720        AssertMsgReturn(rc == VERR_CPUM_RAISE_GP_0, ("%Rrc\n", rc), VERR_IPE_UNEXPECTED_STATUS);
     3721        return iemRaiseGeneralProtectionFault0(pIemCpu);
     3722    }
     3723
     3724    iemRegAddToRip(pIemCpu, cbInstr);
     3725    return VINF_SUCCESS;
     3726}
     3727
     3728
     3729/**
    36963730 * Implements 'IN eAX, port'.
    36973731 *
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r42633 r42641  
    14881488/** Opcode 0x0f 0x2f. */
    14891489FNIEMOP_STUB(iemOp_comiss_Vss_Wss__comisd_Vsd_Wsd);
     1490
     1491
    14901492/** Opcode 0x0f 0x30. */
    1491 FNIEMOP_STUB(iemOp_wrmsr);
     1493FNIEMOP_DEF(iemOp_wrmsr)
     1494{
     1495    IEMOP_MNEMONIC("wrmsr");
     1496    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1497    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_wrmsr);
     1498}
    14921499
    14931500
     
    14961503{
    14971504    IEMOP_MNEMONIC("rdtsc");
    1498     IEMOP_HLP_NO_LOCK_PREFIX();
     1505    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    14991506    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdtsc);
    15001507}
     
    15051512{
    15061513    IEMOP_MNEMONIC("rdmsr");
    1507     IEMOP_HLP_NO_LOCK_PREFIX();
     1514    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    15081515    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdmsr);
    15091516}
     
    46034610        IEM_MC_ARG(uint32_t *, pEFlags, 2);
    46044611
    4605         IEM_MC_REF_GREG_U8(pu8Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    4606         IEM_MC_REF_GREG_U8(pu8Reg, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4612        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4613        IEM_MC_REF_GREG_U8(pu8Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    46074614        IEM_MC_REF_EFLAGS(pEFlags);
    46084615        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u8, pu8Dst, pu8Reg, pEFlags);
     
    46254632        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
    46264633        IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    4627         IEM_MC_FETCH_GREG_U8(u8RegCopy, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4634        IEM_MC_FETCH_GREG_U8(u8RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    46284635        IEM_MC_REF_LOCAL(pu8Reg, u8RegCopy);
    46294636        IEM_MC_FETCH_EFLAGS(EFlags);
     
    46354642        IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
    46364643        IEM_MC_COMMIT_EFLAGS(EFlags);
    4637         IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8RegCopy);
     4644        IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u8RegCopy);
    46384645        IEM_MC_ADVANCE_RIP();
    46394646        IEM_MC_END();
     
    46654672                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    46664673
    4667                 IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    4668                 IEM_MC_REF_GREG_U16(pu16Reg, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4674                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4675                IEM_MC_REF_GREG_U16(pu16Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    46694676                IEM_MC_REF_EFLAGS(pEFlags);
    46704677                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u16, pu16Dst, pu16Reg, pEFlags);
     
    46804687                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    46814688
    4682                 IEM_MC_REF_GREG_U32(pu32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    4683                 IEM_MC_REF_GREG_U32(pu32Reg, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4689                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4690                IEM_MC_REF_GREG_U32(pu32Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    46844691                IEM_MC_REF_EFLAGS(pEFlags);
    46854692                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u32, pu32Dst, pu32Reg, pEFlags);
     
    46954702                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    46964703
    4697                 IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    4698                 IEM_MC_REF_GREG_U64(pu64Reg, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4704                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4705                IEM_MC_REF_GREG_U64(pu64Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    46994706                IEM_MC_REF_EFLAGS(pEFlags);
    47004707                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u64, pu64Dst, pu64Reg, pEFlags);
     
    47244731                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
    47254732                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    4726                 IEM_MC_FETCH_GREG_U16(u16RegCopy, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4733                IEM_MC_FETCH_GREG_U16(u16RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    47274734                IEM_MC_REF_LOCAL(pu16Reg, u16RegCopy);
    47284735                IEM_MC_FETCH_EFLAGS(EFlags);
     
    47344741                IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
    47354742                IEM_MC_COMMIT_EFLAGS(EFlags);
    4736                 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16RegCopy);
     4743                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16RegCopy);
    47374744                IEM_MC_ADVANCE_RIP();
    47384745                IEM_MC_END();
     
    47494756                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
    47504757                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    4751                 IEM_MC_FETCH_GREG_U32(u32RegCopy, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4758                IEM_MC_FETCH_GREG_U32(u32RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    47524759                IEM_MC_REF_LOCAL(pu32Reg, u32RegCopy);
    47534760                IEM_MC_FETCH_EFLAGS(EFlags);
     
    47594766                IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
    47604767                IEM_MC_COMMIT_EFLAGS(EFlags);
    4761                 IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32RegCopy);
     4768                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32RegCopy);
    47624769                IEM_MC_ADVANCE_RIP();
    47634770                IEM_MC_END();
     
    47744781                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
    47754782                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    4776                 IEM_MC_FETCH_GREG_U64(u64RegCopy, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4783                IEM_MC_FETCH_GREG_U64(u64RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    47774784                IEM_MC_REF_LOCAL(pu64Reg, u64RegCopy);
    47784785                IEM_MC_FETCH_EFLAGS(EFlags);
     
    47844791                IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
    47854792                IEM_MC_COMMIT_EFLAGS(EFlags);
    4786                 IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64RegCopy);
     4793                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64RegCopy);
    47874794                IEM_MC_ADVANCE_RIP();
    47884795                IEM_MC_END();
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