VirtualBox

Changeset 96852 in vbox


Ignore:
Timestamp:
Sep 26, 2022 6:06:05 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153756
Message:

IEM: Rotate the FPU stack when changing the FP TOS. Make sure stack adjustment is done before MMX instructions execute, not after.

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

Legend:

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

    r96811 r96852  
    84218421     */
    84228422    PX86XSAVEAREA pXState = &pVCpu->cpum.GstCtx.XState;
     8423
     8424    /* Rotate the stack to account for changed TOS. */
     8425    iemFpuRotateStackSetTop(&pXState->x87, 0);
     8426
    84238427    pXState->x87.FCW        = 0x37f;
    84248428    pXState->x87.FSW        = 0;
     
    93429346    if (rcStrict != VINF_SUCCESS)
    93439347        return rcStrict;
     9348
     9349    /* Rotate the stack to account for changed TOS. */
     9350    iemFpuRotateStackSetTop(pFpuCtx, 0);
    93449351
    93459352    /*
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96807 r96852  
    5656        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    5757        IEM_MC_PREPARE_FPU_USAGE();
     58        IEM_MC_FPU_TO_MMX_MODE();
     59
    5860        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    5961        IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm));
    6062        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
    6163        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    62         IEM_MC_FPU_TO_MMX_MODE();
     64
    6365        IEM_MC_ADVANCE_RIP();
    6466        IEM_MC_END();
     
    8183
    8284        IEM_MC_PREPARE_FPU_USAGE();
     85        IEM_MC_FPU_TO_MMX_MODE();
     86
    8387        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    8488        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
    8589        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    86         IEM_MC_FPU_TO_MMX_MODE();
    8790
    8891        IEM_MC_ADVANCE_RIP();
     
    116119        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    117120        IEM_MC_PREPARE_FPU_USAGE();
     121        IEM_MC_FPU_TO_MMX_MODE();
     122
    118123        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    119124        IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm));
    120125        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc);
    121126        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    122         IEM_MC_FPU_TO_MMX_MODE();
     127
    123128        IEM_MC_ADVANCE_RIP();
    124129        IEM_MC_END();
     
    141146
    142147        IEM_MC_PREPARE_FPU_USAGE();
     148        IEM_MC_FPU_TO_MMX_MODE();
     149
    143150        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    144151        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc);
    145152        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    146         IEM_MC_FPU_TO_MMX_MODE();
    147153
    148154        IEM_MC_ADVANCE_RIP();
     
    174180        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
    175181        IEM_MC_PREPARE_FPU_USAGE();
     182        IEM_MC_FPU_TO_MMX_MODE();
     183
    176184        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    177185        IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm));
    178186        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
    179187        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    180         IEM_MC_FPU_TO_MMX_MODE();
     188
    181189        IEM_MC_ADVANCE_RIP();
    182190        IEM_MC_END();
     
    199207
    200208        IEM_MC_PREPARE_FPU_USAGE();
     209        IEM_MC_FPU_TO_MMX_MODE();
     210
    201211        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    202212        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
    203213        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    204         IEM_MC_FPU_TO_MMX_MODE();
    205214
    206215        IEM_MC_ADVANCE_RIP();
     
    235244        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
    236245        IEM_MC_PREPARE_FPU_USAGE();
     246        IEM_MC_FPU_TO_MMX_MODE();
     247
    237248        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    238249        IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm));
    239250        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc);
    240251        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    241         IEM_MC_FPU_TO_MMX_MODE();
     252
    242253        IEM_MC_ADVANCE_RIP();
    243254        IEM_MC_END();
     
    260271
    261272        IEM_MC_PREPARE_FPU_USAGE();
     273        IEM_MC_FPU_TO_MMX_MODE();
     274
    262275        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    263276        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc);
    264277        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    265         IEM_MC_FPU_TO_MMX_MODE();
    266278
    267279        IEM_MC_ADVANCE_RIP();
     
    293305        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_EX(fSupported);
    294306        IEM_MC_PREPARE_FPU_USAGE();
     307        IEM_MC_FPU_TO_MMX_MODE();
     308
    295309        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    296310        IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm));
    297311        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
    298312        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    299         IEM_MC_FPU_TO_MMX_MODE();
     313
    300314        IEM_MC_ADVANCE_RIP();
    301315        IEM_MC_END();
     
    318332
    319333        IEM_MC_PREPARE_FPU_USAGE();
     334        IEM_MC_FPU_TO_MMX_MODE();
     335
    320336        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    321337        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
    322338        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    323         IEM_MC_FPU_TO_MMX_MODE();
    324339
    325340        IEM_MC_ADVANCE_RIP();
     
    466481        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    467482        IEM_MC_PREPARE_FPU_USAGE();
     483        IEM_MC_FPU_TO_MMX_MODE();
     484
    468485        IEM_MC_REF_MREG_U64(puDst,          IEM_GET_MODRM_REG_8(bRm));
    469486        IEM_MC_REF_MREG_U64_CONST(puSrc,    IEM_GET_MODRM_RM_8(bRm));
    470487        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc);
    471488        IEM_MC_MODIFIED_MREG_BY_REF(puDst);
    472         IEM_MC_FPU_TO_MMX_MODE();
     489
    473490        IEM_MC_ADVANCE_RIP();
    474491        IEM_MC_END();
     
    491508
    492509        IEM_MC_PREPARE_FPU_USAGE();
     510        IEM_MC_FPU_TO_MMX_MODE();
     511
    493512        IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm));
    494513        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc);
    495514        IEM_MC_MODIFIED_MREG_BY_REF(puDst);
    496         IEM_MC_FPU_TO_MMX_MODE();
    497515
    498516        IEM_MC_ADVANCE_RIP();
     
    648666        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    649667        IEM_MC_PREPARE_FPU_USAGE();
     668        IEM_MC_FPU_TO_MMX_MODE();
     669
    650670        IEM_MC_REF_MREG_U64(puDst,          IEM_GET_MODRM_REG_8(bRm));
    651671        IEM_MC_REF_MREG_U64_CONST(puSrc,    IEM_GET_MODRM_RM_8(bRm));
    652672        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc);
    653673        IEM_MC_MODIFIED_MREG_BY_REF(puDst);
    654         IEM_MC_FPU_TO_MMX_MODE();
     674
    655675        IEM_MC_ADVANCE_RIP();
    656676        IEM_MC_END();
     
    673693
    674694        IEM_MC_PREPARE_FPU_USAGE();
     695        IEM_MC_FPU_TO_MMX_MODE();
     696
    675697        IEM_MC_REF_MREG_U64(puDst,              IEM_GET_MODRM_REG_8(bRm));
    676698        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc);
    677699        IEM_MC_MODIFIED_MREG_BY_REF(puDst);
    678         IEM_MC_FPU_TO_MMX_MODE();
    679700
    680701        IEM_MC_ADVANCE_RIP();
     
    57695790            IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    57705791            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     5792            IEM_MC_FPU_TO_MMX_MODE();
    57715793
    57725794            IEM_MC_FETCH_GREG_U64(u64Tmp, IEM_GET_MODRM_RM(pVCpu, bRm));
    57735795            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp);
    5774             IEM_MC_FPU_TO_MMX_MODE();
    57755796
    57765797            IEM_MC_ADVANCE_RIP();
     
    57885809            IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    57895810            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     5811            IEM_MC_FPU_TO_MMX_MODE();
    57905812
    57915813            IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    57925814            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp);
    5793             IEM_MC_FPU_TO_MMX_MODE();
    57945815
    57955816            IEM_MC_ADVANCE_RIP();
     
    58215842            IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    58225843            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     5844            IEM_MC_FPU_TO_MMX_MODE();
    58235845
    58245846            IEM_MC_FETCH_GREG_U32_ZX_U64(u64Tmp, IEM_GET_MODRM_RM(pVCpu, bRm));
    58255847            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp);
    5826             IEM_MC_FPU_TO_MMX_MODE();
    58275848
    58285849            IEM_MC_ADVANCE_RIP();
     
    58405861            IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    58415862            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     5863            IEM_MC_FPU_TO_MMX_MODE();
    58425864
    58435865            IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    58445866            IEM_MC_STORE_MREG_U32_ZX_U64(IEM_GET_MODRM_REG_8(bRm), u32Tmp);
    5845             IEM_MC_FPU_TO_MMX_MODE();
    58465867
    58475868            IEM_MC_ADVANCE_RIP();
     
    59836004        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    59846005        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     6006        IEM_MC_FPU_TO_MMX_MODE();
    59856007
    59866008        IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_RM_8(bRm));
    59876009        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp);
    5988         IEM_MC_FPU_TO_MMX_MODE();
    59896010
    59906011        IEM_MC_ADVANCE_RIP();
     
    60046025        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    60056026        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     6027        IEM_MC_FPU_TO_MMX_MODE();
    60066028
    60076029        IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    60086030        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp);
    6009         IEM_MC_FPU_TO_MMX_MODE();
    60106031
    60116032        IEM_MC_ADVANCE_RIP();
     
    61366157        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
    61376158        IEM_MC_PREPARE_FPU_USAGE();
     6159        IEM_MC_FPU_TO_MMX_MODE();
     6160
    61386161        IEM_MC_REF_MREG_U64(pDst,       IEM_GET_MODRM_REG_8(bRm));
    61396162        IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm));
    61406163        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pshufw_u64, pDst, pSrc, bEvilArg);
    61416164        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    6142         IEM_MC_FPU_TO_MMX_MODE();
     6165
    61436166        IEM_MC_ADVANCE_RIP();
    61446167        IEM_MC_END();
     
    61606183        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    61616184        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
    6162 
    61636185        IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     6186
    61646187        IEM_MC_PREPARE_FPU_USAGE();
     6188        IEM_MC_FPU_TO_MMX_MODE();
     6189
    61656190        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    61666191        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pshufw_u64, pDst, pSrc, bEvilArg);
    61676192        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    6168         IEM_MC_FPU_TO_MMX_MODE();
    61696193
    61706194        IEM_MC_ADVANCE_RIP();
     
    62876311        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    62886312        IEM_MC_PREPARE_FPU_USAGE();
     6313        IEM_MC_FPU_TO_MMX_MODE();
     6314
    62896315        IEM_MC_REF_MREG_U64(pDst,       IEM_GET_MODRM_RM_8(bRm));
    62906316        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, bShiftArg);
    62916317        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    6292         IEM_MC_FPU_TO_MMX_MODE();
     6318
    62936319        IEM_MC_ADVANCE_RIP();
    62946320        IEM_MC_END();
     
    68946920            IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    68956921            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     6922            IEM_MC_FPU_TO_MMX_MODE();
    68966923
    68976924            IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_REG_8(bRm));
    68986925            IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Tmp);
    6899             IEM_MC_FPU_TO_MMX_MODE();
    69006926
    69016927            IEM_MC_ADVANCE_RIP();
     
    69136939            IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    69146940            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     6941            IEM_MC_FPU_TO_MMX_MODE();
    69156942
    69166943            IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_REG_8(bRm));
    69176944            IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp);
    6918             IEM_MC_FPU_TO_MMX_MODE();
    69196945
    69206946            IEM_MC_ADVANCE_RIP();
     
    69466972            IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    69476973            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     6974            IEM_MC_FPU_TO_MMX_MODE();
    69486975
    69496976            IEM_MC_FETCH_MREG_U32(u32Tmp, IEM_GET_MODRM_REG_8(bRm));
    69506977            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), u32Tmp);
    6951             IEM_MC_FPU_TO_MMX_MODE();
    69526978
    69536979            IEM_MC_ADVANCE_RIP();
     
    69656991            IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    69666992            IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     6993            IEM_MC_FPU_TO_MMX_MODE();
    69676994
    69686995            IEM_MC_FETCH_MREG_U32(u32Tmp, IEM_GET_MODRM_REG_8(bRm));
    69696996            IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u32Tmp);
    6970             IEM_MC_FPU_TO_MMX_MODE();
    69716997
    69726998            IEM_MC_ADVANCE_RIP();
     
    71587184        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    71597185        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     7186        IEM_MC_FPU_TO_MMX_MODE();
     7187
    71607188        IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_REG_8(bRm));
    71617189        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM_8(bRm), u64Tmp);
    7162         IEM_MC_FPU_TO_MMX_MODE();
     7190
    71637191        IEM_MC_ADVANCE_RIP();
    71647192        IEM_MC_END();
     
    71777205        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    71787206        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     7207        IEM_MC_FPU_TO_MMX_MODE();
    71797208
    71807209        IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_REG_8(bRm));
    71817210        IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp);
    7182         IEM_MC_FPU_TO_MMX_MODE();
    71837211
    71847212        IEM_MC_ADVANCE_RIP();
     
    1219312221        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    1219412222        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     12223        IEM_MC_FPU_TO_MMX_MODE();
    1219512224
    1219612225        IEM_MC_FETCH_MREG_U64(uSrc, IEM_GET_MODRM_RM_8(bRm));
    1219712226        IEM_MC_STORE_XREG_U64_ZX_U128(IEM_GET_MODRM_REG(pVCpu, bRm), uSrc);
    12198         IEM_MC_FPU_TO_MMX_MODE();
    1219912227
    1220012228        IEM_MC_ADVANCE_RIP();
     
    1224512273        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    1224612274        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     12275        IEM_MC_FPU_TO_MMX_MODE();
    1224712276
    1224812277        IEM_MC_FETCH_XREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
    1224912278        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), uSrc);
    12250         IEM_MC_FPU_TO_MMX_MODE();
    1225112279
    1225212280        IEM_MC_ADVANCE_RIP();
     
    1228412312        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
    1228512313        IEM_MC_PREPARE_FPU_USAGE();
     12314        IEM_MC_FPU_TO_MMX_MODE();
     12315
    1228612316        IEM_MC_REF_GREG_U64(puDst,          IEM_GET_MODRM_REG_8(bRm));
    1228712317        IEM_MC_REF_MREG_U64_CONST(puSrc,    IEM_GET_MODRM_RM_8(bRm));
    1228812318        IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_pmovmskb_u64, puDst, puSrc);
    12289         IEM_MC_FPU_TO_MMX_MODE();
     12319
    1229012320        IEM_MC_ADVANCE_RIP();
    1229112321        IEM_MC_END();
     
    1264212672        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    1264312673        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     12674        IEM_MC_FPU_TO_MMX_MODE();
    1264412675
    1264512676        IEM_MC_FETCH_MREG_U64(uSrc, IEM_GET_MODRM_REG_8(bRm));
    1264612677        IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    12647         IEM_MC_FPU_TO_MMX_MODE();
    1264812678
    1264912679        IEM_MC_ADVANCE_RIP();
  • trunk/src/VBox/VMM/include/IEMInline.h

    r96723 r96852  
    21522152
    21532153/**
     2154 * Rotates the stack registers when setting new TOS.
     2155 *
     2156 * @param   pFpuCtx             The FPU context.
     2157 * @param   iNewTop             New TOS value.
     2158 * @remarks We only do this to speed up fxsave/fxrstor which
     2159 *          arrange the FP registers in stack order.
     2160 *          MUST be done before writing the new TOS (FSW).
     2161 */
     2162DECLINLINE(void) iemFpuRotateStackSetTop(PX86FXSTATE pFpuCtx, uint16_t iNewTop)
     2163{
     2164    uint16_t iOldTop = X86_FSW_TOP_GET(pFpuCtx->FSW);
     2165    RTFLOAT80U ar80Temp[8];
     2166
     2167    if (iOldTop == iNewTop)
     2168        return;
     2169
     2170    /* Unscrew the stack and get it into 'native' order. */
     2171    ar80Temp[0] = pFpuCtx->aRegs[(8 - iOldTop + 0) & X86_FSW_TOP_SMASK].r80;
     2172    ar80Temp[1] = pFpuCtx->aRegs[(8 - iOldTop + 1) & X86_FSW_TOP_SMASK].r80;
     2173    ar80Temp[2] = pFpuCtx->aRegs[(8 - iOldTop + 2) & X86_FSW_TOP_SMASK].r80;
     2174    ar80Temp[3] = pFpuCtx->aRegs[(8 - iOldTop + 3) & X86_FSW_TOP_SMASK].r80;
     2175    ar80Temp[4] = pFpuCtx->aRegs[(8 - iOldTop + 4) & X86_FSW_TOP_SMASK].r80;
     2176    ar80Temp[5] = pFpuCtx->aRegs[(8 - iOldTop + 5) & X86_FSW_TOP_SMASK].r80;
     2177    ar80Temp[6] = pFpuCtx->aRegs[(8 - iOldTop + 6) & X86_FSW_TOP_SMASK].r80;
     2178    ar80Temp[7] = pFpuCtx->aRegs[(8 - iOldTop + 7) & X86_FSW_TOP_SMASK].r80;
     2179
     2180    /* Now rotate the stack to the new position. */
     2181    pFpuCtx->aRegs[0].r80 = ar80Temp[(iNewTop + 0) & X86_FSW_TOP_SMASK];
     2182    pFpuCtx->aRegs[1].r80 = ar80Temp[(iNewTop + 1) & X86_FSW_TOP_SMASK];
     2183    pFpuCtx->aRegs[2].r80 = ar80Temp[(iNewTop + 2) & X86_FSW_TOP_SMASK];
     2184    pFpuCtx->aRegs[3].r80 = ar80Temp[(iNewTop + 3) & X86_FSW_TOP_SMASK];
     2185    pFpuCtx->aRegs[4].r80 = ar80Temp[(iNewTop + 4) & X86_FSW_TOP_SMASK];
     2186    pFpuCtx->aRegs[5].r80 = ar80Temp[(iNewTop + 5) & X86_FSW_TOP_SMASK];
     2187    pFpuCtx->aRegs[6].r80 = ar80Temp[(iNewTop + 6) & X86_FSW_TOP_SMASK];
     2188    pFpuCtx->aRegs[7].r80 = ar80Temp[(iNewTop + 7) & X86_FSW_TOP_SMASK];
     2189}
     2190
     2191
     2192/**
    21542193 * Updates the FPU exception status after FCW is changed.
    21552194 *
     
    22012240                uTag = 2; /* Must be special. */
    22022241
    2203             u16Ftw |= uTag << (iReg * 2); /* empty */
     2242            u16Ftw |= uTag << (iReg * 2);
    22042243        }
    22052244    }
  • trunk/src/VBox/VMM/include/IEMMc.h

    r96789 r96852  
    416416/** Switches the FPU state to MMX mode (FSW.TOS=0, FTW=0) if necessary. */
    417417#define IEM_MC_FPU_TO_MMX_MODE() do { \
     418        iemFpuRotateStackSetTop(&pVCpu->cpum.GstCtx.XState.x87, 0); \
    418419        pVCpu->cpum.GstCtx.XState.x87.FSW &= ~X86_FSW_TOP_MASK; \
    419420        pVCpu->cpum.GstCtx.XState.x87.FTW  = 0xff; \
    420421    } while (0)
    421422
    422 /** Switches the FPU state from MMX mode (FTW=0xffff). */
     423/** Switches the FPU state from MMX mode (FSW.TOS=0, FTW=0xffff). */
    423424#define IEM_MC_FPU_FROM_MMX_MODE() do { \
     425        iemFpuRotateStackSetTop(&pVCpu->cpum.GstCtx.XState.x87, 0); \
     426        pVCpu->cpum.GstCtx.XState.x87.FSW &= ~X86_FSW_TOP_MASK; \
    424427        pVCpu->cpum.GstCtx.XState.x87.FTW  = 0; \
    425428    } while (0)
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