VirtualBox

Changeset 87412 in vbox


Ignore:
Timestamp:
Jan 25, 2021 10:58:45 AM (4 years ago)
Author:
vboxsync
Message:

VMM/HMVMX: Renamed VMXR0StartVM64 to hmR0VMXStartVM and reduced the number of parameters (also for the SSE wrapper).

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMR0A.asm

    r87411 r87412  
    569569; @returns      eax
    570570;
     571; @param        pVM             msc:rcx
     572; @param        pVCpu           msc:rdx         The cross context virtual CPU structure of the calling EMT.
     573; @param        fResumeVM       msc:r8l
     574; @param        pfnStartVM      msc:r9
     575;
     576; Old:
    571577; @param        fResumeVM       msc:rcx
    572578; @param        pCtx            msc:rdx
     
    594600
    595601        ; Spill input parameters.
    596         mov     [xBP + 010h], rcx       ; fResumeVM
    597         mov     [xBP + 018h], rdx       ; pCtx
    598         mov     [xBP + 020h], r8        ; pvUnused
    599         mov     [xBP + 028h], r9        ; pVM
     602        mov     [xBP + 010h], rcx       ; pVM
     603        mov     [xBP + 018h], rdx       ; pVCpu
     604        mov     [xBP + 020h], r8        ; fResumeVM
     605        mov     [xBP + 028h], r9        ; pfnStartVM
    600606
    601607        ; Ask CPUM whether we've started using the FPU yet.
    602         mov     rcx, [xBP + 30h]        ; pVCpu
     608        mov     rcx, [xBP + 018h]       ; pVCpu
    603609        call    NAME(CPUMIsGuestFPUStateActive)
    604610        test    al, al
     
    606612
    607613        ; No need to mess with XMM registers just call the start routine and return.
    608         mov     r11, [xBP + 38h]        ; pfnStartVM
    609         mov     r10, [xBP + 30h]        ; pVCpu
    610         mov     [xSP + 020h], r10
    611         mov     rcx, [xBP + 010h]       ; fResumeVM
    612         mov     rdx, [xBP + 018h]       ; pCtx
    613         mov     r8,  [xBP + 020h]       ; pvUnused
    614         mov     r9,  [xBP + 028h]       ; pVM
    615         call    r11
     614        mov     r9,  [xBP + 028h]       ; pfnStartVM
     615        mov     rcx, [xBP + 010h]       ; pVM
     616        mov     rdx, [xBP + 018h]       ; pVCpu
     617        mov     r8,  [xBP + 020h]       ; fResume
     618        call    r9
    616619
    617620        leave
     
    633636        stmxcsr [rsp + 040h + 0a0h]
    634637
    635         mov     r10, [xBP + 018h]       ; pCtx
    636         mov     eax, [r10 + CPUMCTX.fXStateMask]
     638        mov     r10, [xBP + 018h]       ; pVCpu
     639        mov     eax, [r10 + VMCPU.cpum.GstCtx + CPUMCTX.fXStateMask]
    637640        test    eax, eax
    638641        jz      .guest_fpu_state_manually
     
    643646        and     eax, CPUM_VOLATILE_XSAVE_GUEST_COMPONENTS
    644647        xor     edx, edx
    645         mov     r10, [r10 + CPUMCTX.pXStateR0]
     648        mov     r10, [r10 + VMCPU.cpum.GstCtx + CPUMCTX.pXStateR0]
    646649        xrstor  [r10]
    647650
    648651        ; Make the call (same as in the other case).
    649         mov     r11, [xBP + 38h]        ; pfnStartVM
    650         mov     r10, [xBP + 30h]        ; pVCpu
    651         mov     [xSP + 020h], r10
    652         mov     rcx, [xBP + 010h]       ; fResumeVM
    653         mov     rdx, [xBP + 018h]       ; pCtx
    654         mov     r8,  [xBP + 020h]       ; pvUnused
    655         mov     r9,  [xBP + 028h]       ; pVM
    656         call    r11
     652        mov     r9,  [xBP + 028h]       ; pfnStartVM
     653        mov     rcx, [xBP + 010h]       ; pVM
     654        mov     rdx, [xBP + 018h]       ; pVCpu
     655        mov     r8,  [xBP + 020h]       ; fResume
     656        call    r9
    657657
    658658        mov     r11d, eax               ; save return value (xsave below uses eax)
    659659
    660660        ; Save the guest XMM registers.
    661         mov     r10, [xBP + 018h]       ; pCtx
    662         mov     eax, [r10 + CPUMCTX.fXStateMask]
     661        mov     r10, [xBP + 018h]       ; pVCpu
     662        mov     eax, [r10 + VMCPU.cpum.GstCtx + CPUMCTX.fXStateMask]
    663663        and     eax, CPUM_VOLATILE_XSAVE_GUEST_COMPONENTS
    664664        xor     edx, edx
    665         mov     r10, [r10 + CPUMCTX.pXStateR0]
     665        mov     r10, [r10 + VMCPU.cpum.GstCtx + CPUMCTX.pXStateR0]
    666666        xsave  [r10]
    667667
     
    689689.guest_fpu_state_manually:
    690690        ; Load the full guest XMM register state.
    691         mov     r10, [r10 + CPUMCTX.pXStateR0]
     691        mov     r10, [r10 + VMCPU.cpum.GstCtx + CPUMCTX.pXStateR0]
    692692        movdqa  xmm0,  [r10 + XMM_OFF_IN_X86FXSTATE + 000h]
    693693        movdqa  xmm1,  [r10 + XMM_OFF_IN_X86FXSTATE + 010h]
     
    709709
    710710        ; Make the call (same as in the other case).
    711         mov     r11, [xBP + 38h]        ; pfnStartVM
    712         mov     r10, [xBP + 30h]        ; pVCpu
    713         mov     [xSP + 020h], r10
    714         mov     rcx, [xBP + 010h]       ; fResumeVM
    715         mov     rdx, [xBP + 018h]       ; pCtx
    716         mov     r8,  [xBP + 020h]       ; pvUnused
    717         mov     r9,  [xBP + 028h]       ; pVM
    718         call    r11
     711        mov     r9,  [xBP + 028h]       ; pfnStartVM
     712        mov     rcx, [xBP + 010h]       ; pVM
     713        mov     rdx, [xBP + 018h]       ; pVCpu
     714        mov     r8,  [xBP + 020h]       ; fResume
     715        call    r9
    719716
    720717        ; Save the guest XMM registers.
    721         mov     r10, [xBP + 018h]       ; pCtx
    722         mov     r10, [r10 + CPUMCTX.pXStateR0]
     718        mov     r10, [xBP + 018h]       ; pVCpu
     719        mov     r10, [r10 + VMCPU.cpum.GstCtx + CPUMCTX.pXStateR0]
    723720        stmxcsr [r10 + X86FXSTATE.MXCSR]
    724721        movdqa  [r10 + XMM_OFF_IN_X86FXSTATE + 000h], xmm0
     
    758755 %endif
    759756
     757    ; Save the guest state.
    760758    push    xDI
    761759 %ifndef VMX_SKIP_TR
     
    846844;
    847845; @returns VBox status code
    848 ; @param    fResume    msc:rcx, gcc:rdi       Whether to use vmlauch/vmresume.
    849 ; @param    pCtx       msc:rdx, gcc:rsi       Pointer to the guest-CPU context.
    850 ; @param    pvUnused   msc:r8,  gcc:rdx       Unused argument.
    851 ; @param    pVM        msc:r9,  gcc:rcx       The cross context VM structure.
    852 ; @param    pVCpu      msc:[ebp+30], gcc:r8   The cross context virtual CPU structure of the calling EMT.
    853 ;
    854 ALIGNCODE(16)
    855 BEGINPROC VMXR0StartVM64
     846; @param    pVM        msc:rcx, gcc:rdi       The cross context VM structure. (unused)
     847; @param    pVCpu      msc:rdx, gcc:rsi       The cross context virtual CPU structure of the calling EMT.
     848; @param    fResume    msc:r8l, gcc:dl        Whether to use vmlauch/vmresume.
     849;
     850ALIGNCODE(64)
     851BEGINPROC hmR0VMXStartVM
    856852    push    xBP
    857853    mov     xBP, xSP
     
    861857
    862858    ; Save all general purpose host registers.
    863 %assign cbFrame 0
     859%assign cbFrame 8
    864860    PUSH_CALLEE_PRESERVED_REGISTERS
    865861    SEH64_END_PROLOGUE
     
    872868
    873869    ;
    874     ; Unify the input parameter registers.
     870    ; Unify the input parameter registers: rsi=pVCpu, bl=fResume, rdi=&pVCpu->cpum.GstCtx;
    875871    ;
    876872%ifdef ASM_CALL64_GCC
    877     ; fResume already in rdi
    878     ; pCtx    already in rsi
    879     mov     rbx, rdx        ; pvUnused
     873    mov     ebx, edx        ; fResume
    880874%else
    881     mov     rdi, rcx        ; fResume
    882     mov     rsi, rdx        ; pCtx
    883     mov     rbx, r8         ; pvUnused
     875    mov     rsi, rdx        ; pVCpu
     876    mov     ebx, r8d        ; fResume
    884877%endif
     878    lea     rdi, [rsi + VMCPU.cpum.GstCtx]
    885879
    886880    ;
     
    888882    ; Note! Trashes rdx and rcx.
    889883    ;
    890 %ifdef ASM_CALL64_MSC
    891     mov     rax, [xBP + 30h]            ; pVCpu
    892 %else
    893     mov     rax, r8                     ; pVCpu
    894 %endif
    895     test    byte [xAX + VMCPU.hm + HMCPU.fLoadSaveGuestXcr0], 1
     884    test    byte [rsi + VMCPU.hm + HMCPU.fLoadSaveGuestXcr0], 1
    896885    jz      .xcr0_before_skip
    897886
     
    901890    push    xAX
    902891
    903     mov     eax, [xSI + CPUMCTX.aXcr]   ; load the guest one
    904     mov     edx, [xSI + CPUMCTX.aXcr + 4]
     892    mov     eax, [rdi + CPUMCTX.aXcr]   ; load the guest one
     893    mov     edx, [rdi + CPUMCTX.aXcr + 4]
    905894    xor     ecx, ecx                    ; paranoia
    906895    xsetbv
     
    920909
    921910    ; Save the pCtx pointer.
    922     push    xSI
     911    push    rdi
    923912
    924913    ; Save host LDTR.
     
    944933
    945934    ; Load CR2 if necessary (may be expensive as writing CR2 is a synchronizing instruction).
    946     mov     rbx, qword [xSI + CPUMCTX.cr2]
     935    mov     rcx, qword [rdi + CPUMCTX.cr2]
    947936    mov     rdx, cr2
    948     cmp     rbx, rdx
     937    cmp     rcx, rdx
    949938    je      .skip_cr2_write
    950     mov     cr2, rbx
     939    mov     cr2, rcx
    951940
    952941.skip_cr2_write:
     
    957946
    958947    ; Fight spectre and similar.
    959     INDIRECT_BRANCH_PREDICTION_AND_L1_CACHE_BARRIER xSI, CPUMCTX_WSF_IBPB_ENTRY, CPUMCTX_WSF_L1D_ENTRY, CPUMCTX_WSF_MDS_ENTRY
     948    INDIRECT_BRANCH_PREDICTION_AND_L1_CACHE_BARRIER rdi, CPUMCTX_WSF_IBPB_ENTRY, CPUMCTX_WSF_L1D_ENTRY, CPUMCTX_WSF_MDS_ENTRY
     949
     950    ; Resume or start VM?
     951    cmp     bl, 0                   ; fResume
    960952
    961953    ; Load guest general purpose registers.
    962     mov     rax, qword [xSI + CPUMCTX.eax]
    963     mov     rbx, qword [xSI + CPUMCTX.ebx]
    964     mov     rcx, qword [xSI + CPUMCTX.ecx]
    965     mov     rdx, qword [xSI + CPUMCTX.edx]
    966     mov     rbp, qword [xSI + CPUMCTX.ebp]
    967     mov     r8,  qword [xSI + CPUMCTX.r8]
    968     mov     r9,  qword [xSI + CPUMCTX.r9]
    969     mov     r10, qword [xSI + CPUMCTX.r10]
    970     mov     r11, qword [xSI + CPUMCTX.r11]
    971     mov     r12, qword [xSI + CPUMCTX.r12]
    972     mov     r13, qword [xSI + CPUMCTX.r13]
    973     mov     r14, qword [xSI + CPUMCTX.r14]
    974     mov     r15, qword [xSI + CPUMCTX.r15]
    975 
    976     ; Resume or start VM?
    977     cmp     xDI, 0                  ; fResume
    978 
    979     ; Load guest rdi & rsi.
    980     mov     rdi, qword [xSI + CPUMCTX.edi]
    981     mov     rsi, qword [xSI + CPUMCTX.esi]
     954    mov     rax, qword [rdi + CPUMCTX.eax]
     955    mov     rbx, qword [rdi + CPUMCTX.ebx]
     956    mov     rcx, qword [rdi + CPUMCTX.ecx]
     957    mov     rdx, qword [rdi + CPUMCTX.edx]
     958    mov     rbp, qword [rdi + CPUMCTX.ebp]
     959    mov     rsi, qword [rdi + CPUMCTX.esi]
     960    mov     r8,  qword [rdi + CPUMCTX.r8]
     961    mov     r9,  qword [rdi + CPUMCTX.r9]
     962    mov     r10, qword [rdi + CPUMCTX.r10]
     963    mov     r11, qword [rdi + CPUMCTX.r11]
     964    mov     r12, qword [rdi + CPUMCTX.r12]
     965    mov     r13, qword [rdi + CPUMCTX.r13]
     966    mov     r14, qword [rdi + CPUMCTX.r14]
     967    mov     r15, qword [rdi + CPUMCTX.r15]
     968    mov     rdi, qword [rdi + CPUMCTX.edi]
    982969
    983970    je      .vmlaunch64_launch
     
    986973    jc      near .vmxstart64_invalid_vmcs_ptr
    987974    jz      near .vmxstart64_start_failed
    988     jmp     .vmlaunch64_done;      ; here if vmresume detected a failure
     975    jmp     .vmlaunch64_done        ; here if vmresume detected a failure
    989976
    990977.vmlaunch64_launch:
     
    992979    jc      near .vmxstart64_invalid_vmcs_ptr
    993980    jz      near .vmxstart64_start_failed
    994     jmp     .vmlaunch64_done;      ; here if vmlaunch detected a failure
    995 
    996 ALIGNCODE(16)
     981    jmp     .vmlaunch64_done        ; here if vmlaunch detected a failure
     982
     983ALIGNCODE(64)
    997984.vmlaunch64_done:
    998985    RESTORE_STATE_VM64
     
    10131000    mov     eax, VERR_VMX_UNABLE_TO_START_VM
    10141001    jmp     .vmstart64_end
    1015 ENDPROC VMXR0StartVM64
     1002ENDPROC hmR0VMXStartVM
    10161003
    10171004
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r87408 r87412  
    41624162             * Currently we have just a single handler for all guest modes as well, see @bugref{6208#c73}.
    41634163             */
    4164             pVmcsInfo->pfnStartVM = VMXR0StartVM64;
     4164            pVmcsInfo->pfnStartVM = hmR0VMXStartVM;
    41654165            if (!fIsNstGstVmcs)
    41664166            {
     
    67846784    PVMCC pVM = pVCpu->CTX_SUFF(pVM);
    67856785#ifdef VBOX_WITH_KERNEL_USING_XMM
    6786     int rc = hmR0VMXStartVMWrapXMM(fResumeVM, pCtx, NULL /*pvUnused*/, pVM, pVCpu, pVmcsInfo->pfnStartVM);
     6786    int rc = hmR0VMXStartVMWrapXMM(pVM, pVCpu, fResumeVM, pVmcsInfo->pfnStartVM);
    67876787#else
    6788     int rc = pVmcsInfo->pfnStartVM(fResumeVM, pCtx, NULL /*pvUnused*/, pVM, pVCpu);
     6788    int rc = pVmcsInfo->pfnStartVM(pVM, pVCpu, fResumeVM);
    67896789#endif
    67906790    AssertMsg(rc <= VINF_SUCCESS, ("%Rrc\n", rc));
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.h

    r83057 r87412  
    4646VMMR0DECL(int)          VMXR0ImportStateOnDemand(PVMCPUCC pVCpu, uint64_t fWhat);
    4747VMMR0DECL(VBOXSTRICTRC) VMXR0RunGuestCode(PVMCPUCC pVCpu);
    48 DECLASM(int)            VMXR0StartVM64(RTHCUINT fResume, PCPUMCTX pCtx, void *pvUnused, PVMCC pVM, PVMCPUCC pVCpu);
    4948#endif /* IN_RING0 */
    5049
  • trunk/src/VBox/VMM/include/HMInternal.h

    r87408 r87412  
    702702 *
    703703 * @returns VBox status code (no informational stuff).
    704  * @param   fResume     Whether to use VMRESUME (true) or VMLAUNCH (false).
    705  * @param   pCtx        The CPU register context.
    706  * @param   pvUnused    Unused argument.
    707704 * @param   pVM         Pointer to the cross context VM structure.
    708705 * @param   pVCpu       Pointer to the cross context per-CPU structure.
    709  */
    710 typedef DECLCALLBACKTYPE(int, FNHMVMXSTARTVM,(RTHCUINT fResume, PCPUMCTX pCtx, void *pvUnused, PVMCC pVM, PVMCPUCC pVCpu));
     706 * @param   fResume     Whether to use VMRESUME (true) or VMLAUNCH (false).
     707 */
     708typedef DECLCALLBACKTYPE(int, FNHMVMXSTARTVM,(PVMCC pVM, PVMCPUCC pVCpu, RTHCUINT fResume));
    711709/** Pointer to a VMX StartVM function. */
    712710typedef R0PTRTYPE(FNHMVMXSTARTVM *) PFNHMVMXSTARTVM;
     
    13601358
    13611359# ifdef VBOX_WITH_KERNEL_USING_XMM
    1362 DECLASM(int)                hmR0VMXStartVMWrapXMM(RTHCUINT fResume, PCPUMCTX pCtx, void *pvUnused, PVMCC pVM, PVMCPUCC pVCpu,
    1363                                                   PFNHMVMXSTARTVM pfnStartVM);
     1360DECLASM(int)                hmR0VMXStartVMWrapXMM(PVMCC pVM, PVMCPUCC pVCpu, RTHCUINT fResume, PFNHMVMXSTARTVM pfnStartVM);
    13641361# endif
     1362DECLASM(int)                hmR0VMXStartVM(PVMCC pVM, PVMCPUCC pVCpu, RTHCUINT fResume);
     1363
    13651364/** @} */
    13661365
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