VirtualBox

Changeset 87755 in vbox for trunk


Ignore:
Timestamp:
Feb 13, 2021 5:53:16 PM (4 years ago)
Author:
vboxsync
Message:

VMM/HMSVM: Moved the RDTSC in hmR0SvmPostRunGuest to the assembly code to get a more accurate value. Untested. bugref:9941

Location:
trunk/src/VBox/VMM/VMMR0
Files:
2 edited

Legend:

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

    r87754 r87755  
    13391339        mov     rax, [rsp + cbFrame + frm_pGstCtx] ; (rbp still not operational)
    13401340
    1341         mov     qword [rax + CPUMCTX.ebp], rbp
     1341        mov     qword [rax + CPUMCTX.edx], rdx
     1342        mov     qword [rax + CPUMCTX.ecx], rcx
     1343        mov     rcx, rax
     1344        rdtsc
     1345        mov     qword [rcx + CPUMCTX.ebp], rbp
    13421346        lea     rbp, [rsp + cbFrame]
    1343         mov     qword [rax + CPUMCTX.ecx], rcx
    1344         mov     rcx, SPECTRE_FILLER
    1345         mov     qword [rax + CPUMCTX.edx], rdx
    1346         mov     rdx, rcx
    1347         mov     qword [rax + CPUMCTX.r8],  r8
    1348         mov     r8, rcx
    1349         mov     qword [rax + CPUMCTX.r9],  r9
    1350         mov     r9, rcx
    1351         mov     qword [rax + CPUMCTX.r10], r10
    1352         mov     r10, rcx
    1353         mov     qword [rax + CPUMCTX.r11], r11
    1354         mov     r11, rcx
    1355         mov     qword [rax + CPUMCTX.edi], rdi
     1347        shl     rdx, 20h
     1348        or      rax, rdx                ; TSC value in RAX
     1349        mov     qword [rcx + CPUMCTX.r8],  r8
     1350        mov     r8, SPECTRE_FILLER      ; SPECTRE filler in R8
     1351        mov     qword [rcx + CPUMCTX.r9],  r9
     1352        mov     r9, r8
     1353        mov     qword [rcx + CPUMCTX.r10], r10
     1354        mov     r10, r8
     1355        mov     qword [rcx + GVMCPU.hmr0 + HMR0PERVCPU.uTscExit - VMCPU.cpum.GstCtx], rax
     1356        mov     qword [rcx + CPUMCTX.r11], r11
     1357        mov     r11, r8
     1358        mov     qword [rcx + CPUMCTX.edi], rdi
    13561359 %ifdef ASM_CALL64_MSC
    13571360        mov     rdi, [rbp + frm_saved_rdi]
    13581361 %else
    1359         mov     rdi, rcx
    1360  %endif
    1361         mov     qword [rax + CPUMCTX.esi], rsi
     1362        mov     rdi, r8
     1363 %endif
     1364        mov     qword [rcx + CPUMCTX.esi], rsi
    13621365 %ifdef ASM_CALL64_MSC
    13631366        mov     rsi, [rbp + frm_saved_rsi]
    13641367 %else
    1365         mov     rsi, rcx
    1366  %endif
    1367         mov     qword [rax + CPUMCTX.ebx], rbx
     1368        mov     rsi, r8
     1369 %endif
     1370        mov     qword [rcx + CPUMCTX.ebx], rbx
    13681371        mov     rbx, [rbp + frm_saved_rbx]
    1369         mov     qword [rax + CPUMCTX.r12], r12
     1372        mov     qword [rcx + CPUMCTX.r12], r12
    13701373        mov     r12, [rbp + frm_saved_r12]
    1371         mov     qword [rax + CPUMCTX.r13], r13
     1374        mov     qword [rcx + CPUMCTX.r13], r13
    13721375        mov     r13, [rbp + frm_saved_r13]
    1373         mov     qword [rax + CPUMCTX.r14], r14
     1376        mov     qword [rcx + CPUMCTX.r14], r14
    13741377        mov     r14, [rbp + frm_saved_r14]
    1375         mov     qword [rax + CPUMCTX.r15], r15
     1378        mov     qword [rcx + CPUMCTX.r15], r15
    13761379        mov     r15, [rbp + frm_saved_r15]
    13771380
    13781381 %if %4 != 0
    13791382        ; Set r8 = &pVCpu->cpum.GstCtx; for use below when saving and restoring SSE state.
    1380         mov     r8, rax
     1383        mov     r8, rcx
    13811384 %endif
    13821385
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r87752 r87755  
    43504350    Assert(!VMMRZCallRing3IsEnabled(pVCpu));
    43514351
    4352     uint64_t const uHostTsc = ASMReadTSC();                     /* Read the TSC as soon as possible. */
    43534352    ASMAtomicUoWriteBool(&pVCpu->hm.s.fCheckedTLBFlush, false); /* See HMInvalidatePageOnAllVCpus(): used for TLB flushing. */
    43544353    ASMAtomicIncU32(&pVCpu->hmr0.s.cWorldSwitchExits);          /* Initialized in vmR3CreateUVM(): used for EMT poking. */
     
    43614360    {
    43624361        if (!pSvmTransient->fIsNestedGuest)
    4363             TMCpuTickSetLastSeen(pVCpu, uHostTsc + pVmcbCtrl->u64TSCOffset);
     4362            TMCpuTickSetLastSeen(pVCpu, pVCpu->hmr0.s.uTscExit + pVmcbCtrl->u64TSCOffset);
    43644363#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    43654364        else
    43664365        {
    43674366            /* The nested-guest VMCB TSC offset shall eventually be restored on #VMEXIT via HMNotifySvmNstGstVmexit(). */
    4368             uint64_t const uGstTsc = CPUMRemoveNestedGuestTscOffset(pVCpu, uHostTsc + pVmcbCtrl->u64TSCOffset);
     4367            uint64_t const uGstTsc = CPUMRemoveNestedGuestTscOffset(pVCpu, pVCpu->hmr0.s.uTscExit + pVmcbCtrl->u64TSCOffset);
    43694368            TMCpuTickSetLastSeen(pVCpu, uGstTsc);
    43704369        }
     
    43824381    STAM_PROFILE_ADV_STOP_START(&pVCpu->hm.s.StatInGC, &pVCpu->hm.s.StatPreExit, x);
    43834382    PVMCC pVM = pVCpu->CTX_SUFF(pVM);
    4384     TMNotifyEndOfExecution(pVM, pVCpu, uHostTsc);              /* Notify TM that the guest is no longer running. */
     4383    TMNotifyEndOfExecution(pVM, pVCpu, pVCpu->hmr0.s.uTscExit); /* Notify TM that the guest is no longer running. */
    43854384    VMCPU_SET_STATE(pVCpu, VMCPUSTATE_STARTED_HM);
    43864385
     
    44604459    HMSVM_CPUMCTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CS | CPUMCTX_EXTRN_RIP);
    44614460    EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_SVM, pSvmTransient->u64ExitCode & EMEXIT_F_TYPE_MASK),
    4462                      pVCpu->cpum.GstCtx.cs.u64Base + pVCpu->cpum.GstCtx.rip, uHostTsc);
     4461                     pVCpu->cpum.GstCtx.cs.u64Base + pVCpu->cpum.GstCtx.rip, pVCpu->hmr0.s.uTscExit);
    44634462}
    44644463
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