VirtualBox

Changeset 1164 in vbox


Ignore:
Timestamp:
Mar 2, 2007 2:50:04 PM (18 years ago)
Author:
vboxsync
Message:

Even more v86 corrections

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/EM.cpp

    r1156 r1164  
    13851385                        cbUnit = Cpu.opmode == CPUMODE_32BIT ? 4 : 2;
    13861386
    1387                     RTGCPTR GCPtrDst = pCtx->edi;
     1387                    RTGCPTR  GCPtrDst = pCtx->edi;
     1388                    uint32_t cpl = (pRegFrame->eflags.Bits.u1VM) ? 3 : (pCtx->ss & X86_SEL_RPL);
     1389
    13881390                    /* Access verification first; we can't recover from traps inside this instruction, as the port read cannot be repeated. */
    13891391                    rc = PGMVerifyAccess(pVM, GCPtrDst, cTransfers * cbUnit,
    1390                                          X86_PTE_RW | (((pCtx->ss & X86_SEL_RPL) == 3) ? X86_PTE_US : 0));
     1392                                         X86_PTE_RW | ((cpl == 3) ? X86_PTE_US : 0));
    13911393                    if (rc != VINF_SUCCESS)
    13921394                    {
     
    14521454                        cbUnit = Cpu.opmode == CPUMODE_32BIT ? 4 : 2;
    14531455
    1454                     RTGCPTR GCPtrSrc = pCtx->esi;
     1456                    RTGCPTR  GCPtrSrc = pCtx->esi;
     1457                    uint32_t cpl = (pRegFrame->eflags.Bits.u1VM) ? 3 : (pCtx->ss & X86_SEL_RPL);
     1458
    14551459                    /* Access verification first; we currently can't recover properly from traps inside this instruction */
    1456                     rc = PGMVerifyAccess(pVM, GCPtrSrc, cTransfers * cbUnit, (((pCtx->ss & X86_SEL_RPL) == 3) ? X86_PTE_US : 0));
     1460                    rc = PGMVerifyAccess(pVM, GCPtrSrc, cTransfers * cbUnit, ((cpl == 3) ? X86_PTE_US : 0));
    14571461                    if (rc != VINF_SUCCESS)
    14581462                    {
     
    15421546    /** Scan kernel code that traps; we might not get another chance. */
    15431547    if (    (pCtx->ss & X86_SEL_RPL) <= 1
    1544         &&  pCtx->eflags.Bits.u1VM == 0)
     1548        &&  !pCtx->eflags.Bits.u1VM)
    15451549    {
    15461550        Assert(!PATMIsPatchGCAddr(pVM, pCtx->eip));
     
    19551959#endif
    19561960        if (    (pCtx->ss & X86_SEL_RPL) == 0
     1961            &&  !pCtx->eflags.Bits.u1VM
    19571962            &&  SELMIsSelector32Bit(pVM, pCtx->cs, &pCtx->csHid))
    19581963        {
     
    25242529         */
    25252530        if (    (pCtx->ss & X86_SEL_RPL) <= 1
    2526             &&  pCtx->eflags.Bits.u1VM == 0
     2531            &&  !pCtx->eflags.Bits.u1VM
    25272532            && !PATMIsPatchGCAddr(pVM, pCtx->eip))
    25282533        {
     
    28882893
    28892894    unsigned uSS = pCtx->ss;
    2890     if ((uSS & X86_SEL_RPL) == 3)
     2895    if (    pCtx->eflags.Bits.u1VM
     2896        ||  (uSS & X86_SEL_RPL) == 3)
    28912897    {
    28922898        if (!EMIsRawRing3Enabled(pVM))
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