VirtualBox

Changeset 42483 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jul 31, 2012 2:55:39 PM (12 years ago)
Author:
vboxsync
Message:

IEM: Working on new BIOS / NT...

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

Legend:

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

    r42453 r42483  
    836836    if (cbToTryRead > sizeof(pIemCpu->abOpcode))
    837837        cbToTryRead = sizeof(pIemCpu->abOpcode);
    838     /** @todo patch manager */
     838    /** @todo PATM: Read original, unpatched bytes? EMAll.cpp doesn't seem to be
     839     *        doing that. */
    839840    if (!pIemCpu->fByPassHandlers)
    840841        rc = PGMPhysRead(IEMCPU_TO_VM(pIemCpu), GCPhys, pIemCpu->abOpcode, cbToTryRead);
     
    32153216 * @param   pCtx                Where to get the current stack mode.
    32163217 */
    3217 DECLINLINE(void) iemRegAddToRspEx(PRTUINT64U pTmpRsp, uint8_t cbToAdd, PCCPUMCTX pCtx)
     3218DECLINLINE(void) iemRegAddToRspEx(PRTUINT64U pTmpRsp, uint16_t cbToAdd, PCCPUMCTX pCtx)
    32183219{
    32193220    if (pCtx->ss.Attr.n.u1Long)
     
    32323233 * @param   cbToSub             The number of bytes to subtract.
    32333234 * @param   pCtx                Where to get the current stack mode.
    3234  */
    3235 DECLINLINE(void) iemRegSubFromRspEx(PRTUINT64U pTmpRsp, uint8_t cbToSub, PCCPUMCTX pCtx)
     3235 * @remarks The @a cbToSub argument *MUST* be 16-bit, iemCImpl_enter is
     3236 *          expecting that.
     3237 */
     3238DECLINLINE(void) iemRegSubFromRspEx(PRTUINT64U pTmpRsp, uint16_t cbToSub, PCCPUMCTX pCtx)
    32363239{
    32373240    if (pCtx->ss.Attr.n.u1Long)
     
    46754678        rc = VINF_SUCCESS;
    46764679
    4677 #ifdef IEM_VERIFICATION_MODE
     4680#if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
    46784681    /*
    46794682     * Record the write(s).
     
    47864789        }
    47874790
    4788 #ifdef IEM_VERIFICATION_MODE
     4791#if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
    47894792        if (   !pIemCpu->fNoRem
    47904793            && (fAccess & (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_EXEC)) )
     
    48834886        }
    48844887
    4885 #ifdef IEM_VERIFICATION_MODE
     4888#if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
    48864889        if (   !pIemCpu->fNoRem
    48874890            && (fAccess & (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_EXEC)) )
     
    55905593
    55915594
    5592 #ifdef SOME_UNUSED_FUNCTION
    55935595/**
    55945596 * Pushes a dword onto the stack, using a temporary stack pointer.
     
    56215623    return rc;
    56225624}
    5623 #endif
    56245625
    56255626
     
    71607161#endif
    71617162#if 1 /* Auto enable DSL - fstp st0 stuff. */
    7162         &&  pOrgCtx->cs  == 0x23
     7163        &&  pOrgCtx->cs.Sel  == 0x23
    71637164        &&  pOrgCtx->rip == 0x804aff7
    71647165#endif
     
    74497450
    74507451    char szInstr1[256];
    7451     DBGFR3DisasInstrEx(pVM, pVCpu->idCpu, pCtx->cs, pCtx->rip - pIemCpu->offOpcode,
     7452    DBGFR3DisasInstrEx(pVM, pVCpu->idCpu, pCtx->cs.Sel, pCtx->rip - pIemCpu->offOpcode,
    74527453                       DBGF_DISAS_FLAGS_DEFAULT_MODE,
    74537454                       szInstr1, sizeof(szInstr1), NULL);
     
    76457646        do \
    76467647        { \
    7647             CHECK_FIELD(a_Sel); \
    7648             if (   pOrgCtx->a_Sel##Hid.Attr.u != pDebugCtx->a_Sel##Hid.Attr.u \
    7649                 && (pOrgCtx->a_Sel##Hid.Attr.u | X86_SEL_TYPE_ACCESSED) != pDebugCtx->a_Sel##Hid.Attr.u) \
    7650             { \
    7651                 RTAssertMsg2Weak("  %8sHid.Attr differs - iem=%02x - rem=%02x\n", #a_Sel, pDebugCtx->a_Sel##Hid.Attr.u, pOrgCtx->a_Sel##Hid.Attr.u); \
    7652                 cDiffs++; \
    7653             } \
    7654             CHECK_FIELD(a_Sel##Hid.u64Base); \
    7655             CHECK_FIELD(a_Sel##Hid.u32Limit); \
     7648            CHECK_FIELD(a_Sel.Sel); \
     7649            CHECK_FIELD(a_Sel.Attr.u); \
     7650            CHECK_FIELD(a_Sel.u64Base); \
     7651            CHECK_FIELD(a_Sel.u32Limit); \
     7652            CHECK_FIELD(a_Sel.fFlags); \
    76567653        } while (0)
    76577654
     
    77767773        CHECK_FIELD(idtr.cbIdt);
    77777774        CHECK_FIELD(idtr.pIdt);
    7778         CHECK_FIELD(ldtr);
    7779         CHECK_FIELD(ldtrHid.u64Base);
    7780         CHECK_FIELD(ldtrHid.u32Limit);
    7781         CHECK_FIELD(ldtrHid.Attr.u);
    7782         CHECK_FIELD(tr);
    7783         CHECK_FIELD(trHid.u64Base);
    7784         CHECK_FIELD(trHid.u32Limit);
    7785         CHECK_FIELD(trHid.Attr.u);
     7775        CHECK_SEL(ldtr);
     7776        CHECK_SEL(tr);
    77867777        CHECK_FIELD(SysEnter.cs);
    77877778        CHECK_FIELD(SysEnter.eip);
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r42453 r42483  
    909909        pCtx->cs.fFlags     = CPUMSELREG_FLAGS_VALID;
    910910        pCtx->cs.u64Base    = (uint32_t)uSel << 4;
    911         /** @todo REM reset the accessed bit (see on jmp far16 after disabling
    912          *        PE.  Check with VT-x and AMD-V. */
    913 #ifdef IEM_VERIFICATION_MODE
    914         pCtx->cs.Attr.u    &= ~X86_SEL_TYPE_ACCESSED;
    915 #endif
    916911        return VINF_SUCCESS;
    917912    }
     
    10921087        pCtx->cs.fFlags     = CPUMSELREG_FLAGS_VALID;
    10931088        pCtx->cs.u64Base    = (uint32_t)uSel << 4;
    1094         /** @todo Does REM reset the accessed bit here too? (See on jmp far16
    1095          *        after disabling PE.) Check with VT-x and AMD-V. */
    1096 #ifdef IEM_VERIFICATION_MODE
    1097         pCtx->cs.Attr.u    &= ~X86_SEL_TYPE_ACCESSED;
    1098 #endif
    10991089        return VINF_SUCCESS;
    11001090    }
     
    17141704
    17151705/**
     1706 * Implements enter.
     1707 *
     1708 * We're doing this in C because the instruction is insane, even for the
     1709 * u8NestingLevel=0 case dealing with the stack is tedious.
     1710 *
     1711 * @param   enmEffOpSize    The effective operand size.
     1712 */
     1713IEM_CIMPL_DEF_3(iemCImpl_enter, IEMMODE, enmEffOpSize, uint16_t, cbFrame, uint8_t, cParameters)
     1714{
     1715    PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     1716
     1717    /* Push RBP, saving the old value in TmpRbp. */
     1718    RTUINT64U       NewRsp; NewRsp.u = pCtx->rsp;
     1719    RTUINT64U       TmpRbp; TmpRbp.u = pCtx->rbp;
     1720    RTUINT64U       NewRbp;
     1721    VBOXSTRICTRC    rcStrict;
     1722    if (enmEffOpSize == IEMMODE_64BIT)
     1723    {
     1724        rcStrict = iemMemStackPushU64Ex(pIemCpu, TmpRbp.u, &NewRsp);
     1725        NewRbp = NewRsp;
     1726    }
     1727    else if (pCtx->ss.Attr.n.u1DefBig)
     1728    {
     1729        rcStrict = iemMemStackPushU32Ex(pIemCpu, TmpRbp.DWords.dw0, &NewRsp);
     1730        NewRbp = NewRsp;
     1731    }
     1732    else
     1733    {
     1734        rcStrict = iemMemStackPushU16Ex(pIemCpu, TmpRbp.Words.w0, &NewRsp);
     1735        NewRbp = NewRsp;
     1736    }
     1737    if (rcStrict != VINF_SUCCESS)
     1738        return rcStrict;
     1739
     1740    /* Copy the parameters (aka nesting levels by Intel). */
     1741    cParameters &= 0x1f;
     1742    if (cParameters > 0)
     1743    {
     1744        switch (enmEffOpSize)
     1745        {
     1746            case IEMMODE_16BIT:
     1747                if (pCtx->ss.Attr.n.u1DefBig)
     1748                    TmpRbp.DWords.dw0 -= 2;
     1749                else
     1750                    TmpRbp.Words.w0   -= 2;
     1751                do
     1752                {
     1753                    uint16_t u16Tmp;
     1754                    rcStrict = iemMemStackPopU16Ex(pIemCpu, &u16Tmp, &TmpRbp);
     1755                    if (rcStrict != VINF_SUCCESS)
     1756                        break;
     1757                    rcStrict = iemMemStackPushU16Ex(pIemCpu, u16Tmp, &NewRsp);
     1758                } while (--cParameters > 0 && rcStrict == VINF_SUCCESS);
     1759                break;
     1760
     1761            case IEMMODE_32BIT:
     1762                if (pCtx->ss.Attr.n.u1DefBig)
     1763                    TmpRbp.DWords.dw0 -= 4;
     1764                else
     1765                    TmpRbp.Words.w0   -= 4;
     1766                do
     1767                {
     1768                    uint32_t u32Tmp;
     1769                    rcStrict = iemMemStackPopU32Ex(pIemCpu, &u32Tmp, &TmpRbp);
     1770                    if (rcStrict != VINF_SUCCESS)
     1771                        break;
     1772                    rcStrict = iemMemStackPushU32Ex(pIemCpu, u32Tmp, &NewRsp);
     1773                } while (--cParameters > 0 && rcStrict == VINF_SUCCESS);
     1774                break;
     1775
     1776            case IEMMODE_64BIT:
     1777                TmpRbp.u -= 8;
     1778                do
     1779                {
     1780                    uint64_t u64Tmp;
     1781                    rcStrict = iemMemStackPopU64Ex(pIemCpu, &u64Tmp, &TmpRbp);
     1782                    if (rcStrict != VINF_SUCCESS)
     1783                        break;
     1784                    rcStrict = iemMemStackPushU64Ex(pIemCpu, u64Tmp, &NewRsp);
     1785                } while (--cParameters > 0 && rcStrict == VINF_SUCCESS);
     1786                break;
     1787
     1788            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     1789        }
     1790        if (rcStrict != VINF_SUCCESS)
     1791            return VINF_SUCCESS;
     1792
     1793        /* Push the new RBP */
     1794        if (enmEffOpSize == IEMMODE_64BIT)
     1795            rcStrict = iemMemStackPushU64Ex(pIemCpu, NewRbp.u, &NewRsp);
     1796        else if (pCtx->ss.Attr.n.u1DefBig)
     1797            rcStrict = iemMemStackPushU32Ex(pIemCpu, NewRbp.DWords.dw0, &NewRsp);
     1798        else
     1799            rcStrict = iemMemStackPushU16Ex(pIemCpu, NewRbp.Words.w0, &NewRsp);
     1800        if (rcStrict != VINF_SUCCESS)
     1801            return rcStrict;
     1802
     1803    }
     1804
     1805    /* Recalc RSP. */
     1806    iemRegSubFromRspEx(&NewRsp, cbFrame, pCtx);
     1807
     1808    /** @todo Should probe write access at the new RSP according to AMD. */
     1809
     1810    /* Commit it. */
     1811    pCtx->rbp = NewRbp.u;
     1812    pCtx->rsp = NewRsp.u;
     1813    iemRegAddToRip(pIemCpu, cbInstr);
     1814
     1815    return VINF_SUCCESS;
     1816}
     1817
     1818
     1819
     1820/**
    17161821 * Implements leave.
    17171822 *
     
    17281833    RTUINT64U       NewRsp;
    17291834    if (pCtx->ss.Attr.n.u1Long)
     1835        NewRsp.u = pCtx->rbp;
     1836    else if (pCtx->ss.Attr.n.u1DefBig)
     1837        NewRsp.u = pCtx->ebp;
     1838    else
    17301839    {
    17311840        /** @todo Check that LEAVE actually preserve the high EBP bits. */
     
    17331842        NewRsp.Words.w0 = pCtx->bp;
    17341843    }
    1735     else if (pCtx->ss.Attr.n.u1DefBig)
    1736         NewRsp.u = pCtx->ebp;
    1737     else
    1738         NewRsp.u = pCtx->rbp;
    17391844
    17401845    /* Pop RBP according to the operand size. */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r42437 r42483  
    1025210252
    1025310253/** Opcode 0xc8. */
    10254 FNIEMOP_STUB(iemOp_enter_Iw_Ib);
     10254FNIEMOP_DEF(iemOp_enter_Iw_Ib)
     10255{
     10256    IEMOP_MNEMONIC("enter Iw,Ib");
     10257    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
     10258    IEMOP_HLP_NO_LOCK_PREFIX();
     10259    uint16_t cbFrame;        IEM_OPCODE_GET_NEXT_U16(&cbFrame);
     10260    uint8_t  u8NestingLevel; IEM_OPCODE_GET_NEXT_U8(&u8NestingLevel);
     10261    return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_enter, pIemCpu->enmEffOpSize, cbFrame, u8NestingLevel);
     10262}
    1025510263
    1025610264
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