VirtualBox

Changeset 61382 in vbox


Ignore:
Timestamp:
Jun 1, 2016 6:30:46 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107693
Message:

IEM: Some FPU fixes.

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

Legend:

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

    r61143 r61382  
    53945394    {
    53955395        pFpuCtx->DS    = 0;
    5396         pFpuCtx->FPUDP = (uint32_t)GCPtrEff | ((uint32_t)sel << 4);
     5396        pFpuCtx->FPUDP = (uint32_t)GCPtrEff + ((uint32_t)sel << 4);
    53975397    }
    53985398    else
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r61031 r61382  
    64886488    {
    64896489        /** @todo Testcase: what is stored in the "gray" areas? (figure 8-9 and 8-10) */
    6490         uPtr.pu16[0*2] = pSrcX87->FCW;
    6491         uPtr.pu16[1*2] = pSrcX87->FSW;
    6492         uPtr.pu16[2*2] = iemFpuCalcFullFtw(pSrcX87);
     6490        uPtr.pu16[0*2]   = pSrcX87->FCW;
     6491        uPtr.pu16[0*2+1] = 0xffff;  /* (0xffff observed on intel skylake.) */
     6492        uPtr.pu16[1*2]   = pSrcX87->FSW;
     6493        uPtr.pu16[1*2+1] = 0xffff;
     6494        uPtr.pu16[2*2]   = iemFpuCalcFullFtw(pSrcX87);
     6495        uPtr.pu16[2*2+1] = 0xffff;
    64936496        if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
    64946497        {
    6495             uPtr.pu16[3*2]  = (uint16_t)pSrcX87->FPUIP;
    6496             uPtr.pu32[4]    = ((pSrcX87->FPUIP & UINT32_C(0xffff0000)) >> 4) | pSrcX87->FOP;
    6497             uPtr.pu16[5*2]  = (uint16_t)pSrcX87->FPUDP;
    6498             uPtr.pu32[6]    = (pSrcX87->FPUDP  & UINT32_C(0xffff0000)) >> 4;
     6498            uPtr.pu16[3*2]   = (uint16_t)pSrcX87->FPUIP;
     6499            uPtr.pu32[4]     = ((pSrcX87->FPUIP & UINT32_C(0xffff0000)) >> 4) | pSrcX87->FOP;
     6500            uPtr.pu16[5*2]   = (uint16_t)pSrcX87->FPUDP;
     6501            uPtr.pu32[6]     = (pSrcX87->FPUDP  & UINT32_C(0xffff0000)) >> 4;
    64996502        }
    65006503        else
    65016504        {
    6502             uPtr.pu32[3]    = pSrcX87->FPUIP;
    6503             uPtr.pu16[4*2]  = pSrcX87->CS;
    6504             uPtr.pu16[4*2+1]= pSrcX87->FOP;
    6505             uPtr.pu32[5]    = pSrcX87->FPUDP;
    6506             uPtr.pu16[6*2]  = pSrcX87->DS;
     6505            uPtr.pu32[3]     = pSrcX87->FPUIP;
     6506            uPtr.pu16[4*2]   = pSrcX87->CS;
     6507            uPtr.pu16[4*2+1] = pSrcX87->FOP;
     6508            uPtr.pu32[5]     = pSrcX87->FPUDP;
     6509            uPtr.pu16[6*2]   = pSrcX87->DS;
     6510            uPtr.pu16[6*2+1] = 0xffff;
    65076511        }
    65086512    }
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r61107 r61382  
    1361813618    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1361913619    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     13620    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    1362013621    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    1362113622    IEM_MC_CALL_CIMPL_3(iemCImpl_fldenv, enmEffOpSize, iEffSeg, GCPtrEffSrc);
     
    1363513636    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1363613637    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     13638    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    1363713639    IEM_MC_FETCH_MEM_U16(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
    1363813640    IEM_MC_CALL_CIMPL_1(iemCImpl_fldcw, u16Fsw);
     
    1365313655    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1365413656    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     13657    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    1365513658    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    1365613659    IEM_MC_CALL_CIMPL_3(iemCImpl_fnstenv, enmEffOpSize, iEffSeg, GCPtrEffDst);
     
    1499114994    IEM_MC_BEGIN(0,0);
    1499214995    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     14996    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    1499314997    IEM_MC_CLEAR_FSW_EX();
    1499414998    IEM_MC_ADVANCE_RIP();
     
    1552915533    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1553015534    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     15535    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    1553115536    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    1553215537    IEM_MC_CALL_CIMPL_3(iemCImpl_frstor, enmEffOpSize, iEffSeg, GCPtrEffSrc);
     
    1554715552    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1554815553    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     15554    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    1554915555    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    1555015556    IEM_MC_CALL_CIMPL_3(iemCImpl_fnsave, enmEffOpSize, iEffSeg, GCPtrEffDst);
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