VirtualBox

Changeset 14870 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 1, 2008 3:28:54 PM (16 years ago)
Author:
vboxsync
Message:

Cleaning up.

Location:
trunk/src/VBox/VMM
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/CPUMInternal.h

    r14859 r14870  
    378378
    379379DECLASM(int)      CPUMHandleLazyFPUAsm(PCPUMCPU pCPUM);
    380 DECLASM(int)      CPUMSaveGuestRestoreHostFPUStateAsm(PCPUMCPU pCPUM);
    381 DECLASM(int)      CPUMRestoreHostFPUStateAsm(PCPUMCPU pCPUM);
    382 DECLASM(void)     CPUMLoadFPUAsm(PCPUMCTX pCtx);
    383 DECLASM(void)     CPUMSaveFPUAsm(PCPUMCTX pCtx);
    384 DECLASM(void)     CPUMLoadXMMAsm(PCPUMCTX pCtx);
    385 DECLASM(void)     CPUMSaveXMMAsm(PCPUMCTX pCtx);
    386 DECLASM(void)     CPUMSetFCW(uint16_t u16FCW);
    387 DECLASM(uint16_t) CPUMGetFCW();
    388 DECLASM(void)     CPUMSetMXCSR(uint32_t u32MXCSR);
    389 DECLASM(uint32_t) CPUMGetMXCSR();
     380
     381#ifdef IN_RING0
     382DECLASM(int)      CPUMR0SaveGuestRestoreHostFPUState(PCPUMCPU pCPUM);
     383DECLASM(int)      CPUMR0RestoreHostFPUState(PCPUMCPU pCPUM);
     384DECLASM(void)     CPUMR0LoadFPU(PCPUMCTX pCtx);
     385DECLASM(void)     CPUMR0SaveFPU(PCPUMCTX pCtx);
     386DECLASM(void)     CPUMR0LoadXMM(PCPUMCTX pCtx);
     387DECLASM(void)     CPUMR0SaveXMM(PCPUMCTX pCtx);
     388DECLASM(void)     CPUMR0SetFCW(uint16_t u16FCW);
     389DECLASM(uint16_t) CPUMR0GetFCW();
     390DECLASM(void)     CPUMR0SetMXCSR(uint32_t u32MXCSR);
     391DECLASM(uint32_t) CPUMR0GetMXCSR();
     392#endif
    390393
    391394__END_DECLS
  • trunk/src/VBox/VMM/Makefile.kmk

    r14833 r14870  
    418418VMMR0_SOURCES   = \
    419419        VMMR0/CPUMR0.cpp \
     420        VMMR0/CPUMR0A.asm \
    420421        VMMR0/DBGFR0.cpp \
    421422        VMMR0/GMMR0.cpp \
  • trunk/src/VBox/VMM/VMMAll/CPUMAllA.asm

    r14859 r14870  
    202202
    203203
    204 ;;
    205 ; Restores the host's FPU/XMM state
    206 ;
    207 ; @returns  0
    208 ; @param    pCPUMCPU  x86:[esp+4] GCC:rdi MSC:rcx     CPUMCPU pointer
    209 ;
    210 align 16
    211 BEGINPROC CPUMSaveGuestRestoreHostFPUStateAsm
    212 %ifdef RT_ARCH_AMD64
    213  %ifdef RT_OS_WINDOWS
    214     mov     xDX, rcx
    215  %else
    216     mov     xDX, rdi
    217  %endif
    218 %else
    219     mov     xDX, dword [esp + 4]
    220 %endif
    221 
    222     ; Restore FPU if guest has used it.
    223     ; Using fxrstor should ensure that we're not causing unwanted exception on the host.
    224     test    dword [xDX + CPUMCPU.fUseFlags], CPUM_USED_FPU
    225     jz short gth_fpu_no
    226 
    227     mov     xAX, cr0
    228     mov     xCX, xAX                    ; save old CR0
    229     and     xAX, ~(X86_CR0_TS | X86_CR0_EM)
    230     mov     cr0, xAX
    231 
    232     fxsave  [xDX + CPUMCPU.Guest.fpu]
    233     fxrstor [xDX + CPUMCPU.Host.fpu]
    234 
    235     mov     cr0, xCX                    ; and restore old CR0 again
    236     and     dword [xDX + CPUMCPU.fUseFlags], ~CPUM_USED_FPU
    237 gth_fpu_no:
    238     xor     eax, eax
    239     ret
    240 ENDPROC   CPUMSaveGuestRestoreHostFPUStateAsm
    241 
    242 ;;
    243 ; Sets the host's FPU/XMM state
    244 ;
    245 ; @returns  0
    246 ; @param    pCPUMCPU  x86:[esp+4] GCC:rdi MSC:rcx     CPUMCPU pointer
    247 ;
    248 align 16
    249 BEGINPROC CPUMRestoreHostFPUStateAsm
    250 %ifdef RT_ARCH_AMD64
    251  %ifdef RT_OS_WINDOWS
    252     mov     xDX, rcx
    253  %else
    254     mov     xDX, rdi
    255  %endif
    256 %else
    257     mov     xDX, dword [esp + 4]
    258 %endif
    259 
    260     ; Restore FPU if guest has used it.
    261     ; Using fxrstor should ensure that we're not causing unwanted exception on the host.
    262     test    dword [xDX + CPUMCPU.fUseFlags], CPUM_USED_FPU
    263     jz short gth_fpu_no_2
    264 
    265     mov     xAX, cr0
    266     mov     xCX, xAX                    ; save old CR0
    267     and     xAX, ~(X86_CR0_TS | X86_CR0_EM)
    268     mov     cr0, xAX
    269 
    270     fxrstor [xDX + CPUMCPU.Host.fpu]
    271 
    272     mov     cr0, xCX                    ; and restore old CR0 again
    273     and     dword [xDX + CPUMCPU.fUseFlags], ~CPUM_USED_FPU
    274 gth_fpu_no_2:
    275     xor     eax, eax
    276     ret
    277 ENDPROC   CPUMRestoreHostFPUStateAsm
    278 
    279 ;;
    280 ; Restores the guest's FPU/XMM state
    281 ;
    282 ; @param    pCtx  x86:[esp+4] GCC:rdi MSC:rcx     CPUMCTX pointer
    283 ;
    284 align 16
    285 BEGINPROC   CPUMLoadFPUAsm
    286 %ifdef RT_ARCH_AMD64
    287  %ifdef RT_OS_WINDOWS
    288     mov     xDX, rcx
    289  %else
    290     mov     xDX, rdi
    291  %endif
    292 %else
    293     mov     xDX, dword [esp + 4]
    294 %endif
    295     fxrstor [xDX + CPUMCTX.fpu]
    296     ret
    297 ENDPROC     CPUMLoadFPUAsm
    298 
    299 
    300 ;;
    301 ; Restores the guest's FPU/XMM state
    302 ;
    303 ; @param    pCtx  x86:[esp+4] GCC:rdi MSC:rcx     CPUMCTX pointer
    304 ;
    305 align 16
    306 BEGINPROC   CPUMSaveFPUAsm
    307 %ifdef RT_ARCH_AMD64
    308  %ifdef RT_OS_WINDOWS
    309     mov     xDX, rcx
    310  %else
    311     mov     xDX, rdi
    312  %endif
    313 %else
    314     mov     xDX, dword [esp + 4]
    315 %endif
    316     fxsave  [xDX + CPUMCTX.fpu]
    317     ret
    318 ENDPROC CPUMSaveFPUAsm
    319 
    320 
    321 ;;
    322 ; Restores the guest's XMM state
    323 ;
    324 ; @param    pCtx  x86:[esp+4] GCC:rdi MSC:rcx     CPUMCTX pointer
    325 ;
    326 align 16
    327 BEGINPROC   CPUMLoadXMMAsm
    328 %ifdef RT_ARCH_AMD64
    329  %ifdef RT_OS_WINDOWS
    330     mov     xDX, rcx
    331  %else
    332     mov     xDX, rdi
    333  %endif
    334 %else
    335     mov     xDX, dword [esp + 4]
    336 %endif
    337     movdqa  xmm0, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*0]
    338     movdqa  xmm1, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*1]
    339     movdqa  xmm2, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*2]
    340     movdqa  xmm3, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*3]
    341     movdqa  xmm4, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*4]
    342     movdqa  xmm5, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*5]
    343     movdqa  xmm6, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*6]
    344     movdqa  xmm7, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*7]
    345 
    346 %ifdef RT_ARCH_AMD64
    347     test qword [xDX + CPUMCTX.msrEFER], MSR_K6_EFER_LMA
    348     jz CPUMLoadXMMAsm_done
    349 
    350     movdqa  xmm8, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*8]
    351     movdqa  xmm9, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*9]
    352     movdqa  xmm10, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*10]
    353     movdqa  xmm11, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*11]
    354     movdqa  xmm12, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*12]
    355     movdqa  xmm13, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*13]
    356     movdqa  xmm14, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*14]
    357     movdqa  xmm15, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*15]
    358 CPUMLoadXMMAsm_done:
    359 %endif
    360 
    361     ret
    362 ENDPROC     CPUMLoadXMMAsm
    363 
    364 
    365 ;;
    366 ; Restores the guest's XMM state
    367 ;
    368 ; @param    pCtx  x86:[esp+4] GCC:rdi MSC:rcx     CPUMCTX pointer
    369 ;
    370 align 16
    371 BEGINPROC   CPUMSaveXMMAsm
    372 %ifdef RT_ARCH_AMD64
    373  %ifdef RT_OS_WINDOWS
    374     mov     xDX, rcx
    375  %else
    376     mov     xDX, rdi
    377  %endif
    378 %else
    379     mov     xDX, dword [esp + 4]
    380 %endif
    381     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*0], xmm0
    382     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*1], xmm1
    383     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*2], xmm2
    384     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*3], xmm3
    385     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*4], xmm4
    386     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*5], xmm5
    387     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*6], xmm6
    388     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*7], xmm7
    389 
    390 %ifdef RT_ARCH_AMD64
    391     test qword [xDX + CPUMCTX.msrEFER], MSR_K6_EFER_LMA
    392     jz CPUMSaveXMMAsm_done
    393 
    394     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*8], xmm8
    395     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*9], xmm9
    396     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*10], xmm10
    397     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*11], xmm11
    398     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*12], xmm12
    399     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*13], xmm13
    400     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*14], xmm14
    401     movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*15], xmm15
    402 
    403 CPUMSaveXMMAsm_done:
    404 %endif
    405     ret
    406 ENDPROC     CPUMSaveXMMAsm
    407 
    408 
    409 ;;
    410 ; Set the FPU control word; clearing exceptions first
    411 ;
    412 ; @param  u16FCW    x86:[esp+4] GCC:rdi MSC:rcx     New FPU control word
    413 align 16
    414 BEGINPROC CPUMSetFCW
    415 %ifdef RT_ARCH_AMD64
    416  %ifdef RT_OS_WINDOWS
    417     mov     xAX, rcx
    418  %else
    419     mov     xAX, rdi
    420  %endif
    421 %else
    422     mov     xAX, dword [esp + 4]
    423 %endif
    424     fnclex
    425     push    xAX
    426     fldcw   [xSP]
    427     pop     xAX
    428     ret
    429 ENDPROC   CPUMSetFCW
    430 
    431 
    432 ;;
    433 ; Get the FPU control word
    434 ;
    435 align 16
    436 BEGINPROC CPUMGetFCW
    437     fnstcw  [xSP - 8]
    438     mov     ax, word [xSP - 8]
    439     ret
    440 ENDPROC   CPUMGetFCW
    441 
    442 
    443 ;;
    444 ; Set the MXCSR;
    445 ;
    446 ; @param  u32MXCSR    x86:[esp+4] GCC:rdi MSC:rcx     New MXCSR
    447 align 16
    448 BEGINPROC CPUMSetMXCSR
    449 %ifdef RT_ARCH_AMD64
    450  %ifdef RT_OS_WINDOWS
    451     mov     xAX, rcx
    452  %else
    453     mov     xAX, rdi
    454  %endif
    455 %else
    456     mov     xAX, dword [esp + 4]
    457 %endif
    458     push    xAX
    459     ldmxcsr [xSP]
    460     pop     xAX
    461     ret
    462 ENDPROC   CPUMSetMXCSR
    463 
    464 
    465 ;;
    466 ; Get the MXCSR
    467 ;
    468 align 16
    469 BEGINPROC CPUMGetMXCSR
    470     stmxcsr [xSP - 8]
    471     mov     eax, dword [xSP - 8]
    472     ret
    473 ENDPROC   CPUMGetMXCSR
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r14859 r14870  
    20762076}
    20772077
    2078 
    2079 /**
    2080  * Restore host FPU/XMM state
    2081  *
    2082  * @returns VBox status code.
    2083  * @param   pVM         VM handle.
    2084  * @param   pVCpu       VMCPU handle
    2085  */
    2086 VMMDECL(int) CPUMSaveGuestRestoreHostFPUState(PVM pVM, PVMCPU pVCpu)
    2087 {
    2088     Assert(pVM->cpum.s.CPUFeatures.edx.u1FXSR);
    2089     return CPUMSaveGuestRestoreHostFPUStateAsm(&pVCpu->cpum.s);
    2090 }
    2091 
    2092 /**
    2093  * Set host FPU/XMM state
    2094  *
    2095  * @returns VBox status code.
    2096  * @param   pVM         VM handle.
    2097  * @param   pVCpu       VMCPU handle
    2098  */
    2099 VMMDECL(int) CPUMRestoreHostFPUState(PVM pVM, PVMCPU pVCpu)
    2100 {
    2101     Assert(pVM->cpum.s.CPUFeatures.edx.u1FXSR);
    2102     return CPUMRestoreHostFPUStateAsm(&pVCpu->cpum.s);
    2103 }
    2104 
    21052078#endif /* !IN_RING3 */
    21062079
  • trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp

    r14859 r14870  
    216216            pVCpu->cpum.s.Host.fpu.MXCSR = CPUMGetMXCSR();
    217217
    218         CPUMLoadFPUAsm(pCtx);
     218        CPUMR0LoadFPU(pCtx);
    219219
    220220        /*
     
    231231            {
    232232                /* fxrstor doesn't restore the XMM state! */
    233                 CPUMLoadXMMAsm(pCtx);
     233                CPUMR0LoadXMM(pCtx);
    234234                pVCpu->cpum.s.fUseFlags |= CPUM_MANUAL_XMM_RESTORE;
    235235            }
     
    262262        Assert(!(pVCpu->cpum.s.fUseFlags & CPUM_SYNC_FPU_STATE));
    263263        HWACCMR0SaveFPUState(pVM, pVCpu, pCtx);
    264         CPUMRestoreHostFPUState(pVCpu);
     264        CPUMR0RestoreHostFPUState(&pVCpu->cpum.s);
    265265    }
    266266    else
     
    276276            ASMWrMsr(MSR_K6_EFER, oldMsrEFERHost & ~MSR_K6_EFER_FFXSR);
    277277        }
    278         CPUMSaveGuestRestoreHostFPUState(pVM, pVCpu);
     278        CPUMR0SaveGuestRestoreHostFPUState(&pVCpu->cpum.s);
    279279
    280280        /* Restore EFER MSR */
     
    283283
    284284#else  /* CPUM_CAN_HANDLE_NM_TRAPS_IN_KERNEL_MODE */
    285         CPUMSaveFPUAsm(pCtx);
     285        CPUMR0SaveFPU(pCtx);
    286286        if (pVCpu->cpum.s.fUseFlags & CPUM_MANUAL_XMM_RESTORE)
    287287        {
    288288            /* fxsave doesn't save the XMM state! */
    289             CPUMSaveXMMAsm(pCtx);
     289            CPUMR0SaveXMM(pCtx);
    290290        }
    291291
     
    294294         * We don't want the guest to be able to trigger floating point/SSE exceptions on the host.
    295295         */
    296         CPUMSetFCW(pVCpu->cpum.s.Host.fpu.FCW);
     296        CPUMR0SetFCW(pVCpu->cpum.s.Host.fpu.FCW);
    297297        if (pVM->cpum.s.CPUFeatures.edx.u1SSE)
    298             CPUMSetMXCSR(pVCpu->cpum.s.Host.fpu.MXCSR);
     298            CPUMR0SetMXCSR(pVCpu->cpum.s.Host.fpu.MXCSR);
    299299#endif /* CPUM_CAN_HANDLE_NM_TRAPS_IN_KERNEL_MODE */
    300300    }
     
    396396}
    397397
     398
  • trunk/src/VBox/VMM/VMMR0/HWACCMR0.cpp

    r14859 r14870  
    10021002#if HC_ARCH_BITS == 32 && defined(VBOX_WITH_64_BITS_GUESTS)
    10031003/**
    1004  * Save guest FPU/XMM state
     1004 * Save guest FPU/XMM state (64 bits guest mode & 32 bits host only)
    10051005 *
    10061006 * @returns VBox status code.
     
    10111011VMMR0DECL(int)   HWACCMR0SaveFPUState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
    10121012{
     1013    if (pVM->hwaccm.s.vmx.fSupported)
     1014    {
     1015    }
     1016    else
     1017    {
     1018    }
    10131019    return VINF_SUCCESS;
    10141020}
     
    10251031VMMR0DECL(int)   HWACCMR0SaveDebugState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, bool fDR6)
    10261032{
     1033    if (pVM->hwaccm.s.vmx.fSupported)
     1034    {
     1035    }
     1036    else
     1037    {
     1038    }
    10271039    return VINF_SUCCESS;
    10281040}
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