VirtualBox

Changeset 46304 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
May 29, 2013 9:13:19 AM (12 years ago)
Author:
vboxsync
Message:

VMM/HM: AMD-V bits and clean up.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r46297 r46304  
    176176        PVMCPU pVCpu = &pVM->aCpus[i];
    177177
    178         if (pVCpu->hm.s.svm.hMemObjVMCBHost != NIL_RTR0MEMOBJ)
    179         {
    180             RTR0MemObjFree(pVCpu->hm.s.svm.hMemObjVMCBHost, false);
    181             pVCpu->hm.s.svm.pvVMCBHost      = 0;
    182             pVCpu->hm.s.svm.HCPhysVMCBHost  = 0;
    183             pVCpu->hm.s.svm.hMemObjVMCBHost = NIL_RTR0MEMOBJ;
    184         }
    185 
    186         if (pVCpu->hm.s.svm.hMemObjVMCB != NIL_RTR0MEMOBJ)
    187         {
    188             RTR0MemObjFree(pVCpu->hm.s.svm.hMemObjVMCB, false);
    189             pVCpu->hm.s.svm.pvVMCB      = 0;
    190             pVCpu->hm.s.svm.HCPhysVMCB  = 0;
    191             pVCpu->hm.s.svm.hMemObjVMCB = NIL_RTR0MEMOBJ;
     178        if (pVCpu->hm.s.svm.hMemObjVmcbHost != NIL_RTR0MEMOBJ)
     179        {
     180            RTR0MemObjFree(pVCpu->hm.s.svm.hMemObjVmcbHost, false);
     181            pVCpu->hm.s.svm.pvVmcbHost      = 0;
     182            pVCpu->hm.s.svm.HCPhysVmcbHost  = 0;
     183            pVCpu->hm.s.svm.hMemObjVmcbHost = NIL_RTR0MEMOBJ;
     184        }
     185
     186        if (pVCpu->hm.s.svm.hMemObjVmcb != NIL_RTR0MEMOBJ)
     187        {
     188            RTR0MemObjFree(pVCpu->hm.s.svm.hMemObjVmcb, false);
     189            pVCpu->hm.s.svm.pvVmcb      = 0;
     190            pVCpu->hm.s.svm.HCPhysVmcb  = 0;
     191            pVCpu->hm.s.svm.hMemObjVmcb = NIL_RTR0MEMOBJ;
    192192        }
    193193
     
    227227    {
    228228        PVMCPU pVCpu = &pVM->aCpus[i];
    229         pVCpu->hm.s.svm.hMemObjVMCBHost  = NIL_RTR0MEMOBJ;
    230         pVCpu->hm.s.svm.hMemObjVMCB      = NIL_RTR0MEMOBJ;
     229        pVCpu->hm.s.svm.hMemObjVmcbHost  = NIL_RTR0MEMOBJ;
     230        pVCpu->hm.s.svm.hMemObjVmcb      = NIL_RTR0MEMOBJ;
    231231        pVCpu->hm.s.svm.hMemObjMsrBitmap = NIL_RTR0MEMOBJ;
    232232    }
     
    236236    {
    237237        /* Allocate one page for the host context */
    238         rc = RTR0MemObjAllocCont(&pVCpu->hm.s.svm.hMemObjVMCBHost, 1 << PAGE_SHIFT, false /* fExecutable */);
     238        rc = RTR0MemObjAllocCont(&pVCpu->hm.s.svm.hMemObjVmcbHost, 1 << PAGE_SHIFT, false /* fExecutable */);
    239239        if (RT_FAILURE(rc))
    240240            goto failure_cleanup;
    241241
    242         pVCpu->hm.s.svm.pvVMCBHost     = RTR0MemObjAddress(pVCpu->hm.s.svm.hMemObjVMCBHost);
    243         pVCpu->hm.s.svm.HCPhysVMCBHost = RTR0MemObjGetPagePhysAddr(pVCpu->hm.s.svm.hMemObjVMCBHost, 0);
    244         Assert(pVCpu->hm.s.svm.HCPhysVMCBHost < _4G);
    245         ASMMemZeroPage(pVCpu->hm.s.svm.pvVMCBHost);
     242        pVCpu->hm.s.svm.pvVmcbHost     = RTR0MemObjAddress(pVCpu->hm.s.svm.hMemObjVmcbHost);
     243        pVCpu->hm.s.svm.HCPhysVmcbHost = RTR0MemObjGetPagePhysAddr(pVCpu->hm.s.svm.hMemObjVmcbHost, 0);
     244        Assert(pVCpu->hm.s.svm.HCPhysVmcbHost < _4G);
     245        ASMMemZeroPage(pVCpu->hm.s.svm.pvVmcbHost);
    246246
    247247        /* Allocate one page for the VM control block (VMCB). */
    248         rc = RTR0MemObjAllocCont(&pVCpu->hm.s.svm.hMemObjVMCB, 1 << PAGE_SHIFT, false /* fExecutable */);
     248        rc = RTR0MemObjAllocCont(&pVCpu->hm.s.svm.hMemObjVmcb, 1 << PAGE_SHIFT, false /* fExecutable */);
    249249        if (RT_FAILURE(rc))
    250250            goto failure_cleanup;
    251251
    252         pVCpu->hm.s.svm.pvVMCB     = RTR0MemObjAddress(pVCpu->hm.s.svm.hMemObjVMCB);
    253         pVCpu->hm.s.svm.HCPhysVMCB = RTR0MemObjGetPagePhysAddr(pVCpu->hm.s.svm.hMemObjVMCB, 0);
    254         Assert(pVCpu->hm.s.svm.HCPhysVMCB < _4G);
    255         ASMMemZeroPage(pVCpu->hm.s.svm.pvVMCB);
     252        pVCpu->hm.s.svm.pvVmcb     = RTR0MemObjAddress(pVCpu->hm.s.svm.hMemObjVmcb);
     253        pVCpu->hm.s.svm.HCPhysVmcb = RTR0MemObjGetPagePhysAddr(pVCpu->hm.s.svm.hMemObjVmcb, 0);
     254        Assert(pVCpu->hm.s.svm.HCPhysVmcb < _4G);
     255        ASMMemZeroPage(pVCpu->hm.s.svm.pvVmcb);
    256256
    257257        /* Allocate 8 KB for the MSR bitmap (doesn't seem to be a way to convince SVM not to use it) */
     
    287287
    288288
     289
  • trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp

    r46297 r46304  
    55
    66/*
    7  * Copyright (C) 2006-2012 Oracle Corporation
     7 * Copyright (C) 2006-2013 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    7070        Assert(pCtx->reg.fFlags & CPUMSELREG_FLAGS_VALID); \
    7171        Assert(pCtx->reg.ValidSel == pCtx->reg.Sel); \
    72         pvVMCB->guest.REG.u16Sel     = pCtx->reg.Sel; \
    73         pvVMCB->guest.REG.u32Limit   = pCtx->reg.u32Limit; \
    74         pvVMCB->guest.REG.u64Base    = pCtx->reg.u64Base; \
    75         pvVMCB->guest.REG.u16Attr    = SVM_HIDSEGATTR_VMX2SVM(pCtx->reg.Attr.u); \
     72        pVmcb->guest.REG.u16Sel     = pCtx->reg.Sel; \
     73        pVmcb->guest.REG.u32Limit   = pCtx->reg.u32Limit; \
     74        pVmcb->guest.REG.u64Base    = pCtx->reg.u64Base; \
     75        pVmcb->guest.REG.u16Attr    = SVM_HIDSEGATTR_VMX2SVM(pCtx->reg.Attr.u); \
    7676    } while (0)
    7777
     
    7979    do \
    8080    { \
    81         pCtx->reg.Sel       = pvVMCB->guest.REG.u16Sel; \
    82         pCtx->reg.ValidSel  = pvVMCB->guest.REG.u16Sel; \
     81        pCtx->reg.Sel       = pVmcb->guest.REG.u16Sel; \
     82        pCtx->reg.ValidSel  = pVmcb->guest.REG.u16Sel; \
    8383        pCtx->reg.fFlags    = CPUMSELREG_FLAGS_VALID; \
    84         pCtx->reg.u32Limit  = pvVMCB->guest.REG.u32Limit; \
    85         pCtx->reg.u64Base   = pvVMCB->guest.REG.u64Base; \
    86         pCtx->reg.Attr.u    = SVM_HIDSEGATTR_SVM2VMX(pvVMCB->guest.REG.u16Attr); \
     84        pCtx->reg.u32Limit  = pVmcb->guest.REG.u32Limit; \
     85        pCtx->reg.u64Base   = pVmcb->guest.REG.u64Base; \
     86        pCtx->reg.Attr.u    = SVM_HIDSEGATTR_SVM2VMX(pVmcb->guest.REG.u16Attr); \
    8787    } while (0)
    8888
     
    233233        PVMCPU pVCpu = &pVM->aCpus[i];
    234234
    235         pVCpu->hm.s.svm.hMemObjVMCBHost  = NIL_RTR0MEMOBJ;
    236         pVCpu->hm.s.svm.hMemObjVMCB      = NIL_RTR0MEMOBJ;
     235        pVCpu->hm.s.svm.hMemObjVmcbHost  = NIL_RTR0MEMOBJ;
     236        pVCpu->hm.s.svm.hMemObjVmcb      = NIL_RTR0MEMOBJ;
    237237        pVCpu->hm.s.svm.hMemObjMsrBitmap = NIL_RTR0MEMOBJ;
    238238
    239239        /* Allocate one page for the host context */
    240         rc = RTR0MemObjAllocCont(&pVCpu->hm.s.svm.hMemObjVMCBHost, 1 << PAGE_SHIFT, false /* fExecutable */);
     240        rc = RTR0MemObjAllocCont(&pVCpu->hm.s.svm.hMemObjVmcbHost, 1 << PAGE_SHIFT, false /* fExecutable */);
    241241        if (RT_FAILURE(rc))
    242242            return rc;
    243243
    244         pVCpu->hm.s.svm.pvVMCBHost     = RTR0MemObjAddress(pVCpu->hm.s.svm.hMemObjVMCBHost);
    245         pVCpu->hm.s.svm.HCPhysVMCBHost = RTR0MemObjGetPagePhysAddr(pVCpu->hm.s.svm.hMemObjVMCBHost, 0);
    246         Assert(pVCpu->hm.s.svm.HCPhysVMCBHost < _4G);
    247         ASMMemZeroPage(pVCpu->hm.s.svm.pvVMCBHost);
     244        pVCpu->hm.s.svm.pvVmcbHost     = RTR0MemObjAddress(pVCpu->hm.s.svm.hMemObjVmcbHost);
     245        pVCpu->hm.s.svm.HCPhysVmcbHost = RTR0MemObjGetPagePhysAddr(pVCpu->hm.s.svm.hMemObjVmcbHost, 0);
     246        Assert(pVCpu->hm.s.svm.HCPhysVmcbHost < _4G);
     247        ASMMemZeroPage(pVCpu->hm.s.svm.pvVmcbHost);
    248248
    249249        /* Allocate one page for the VM control block (VMCB). */
    250         rc = RTR0MemObjAllocCont(&pVCpu->hm.s.svm.hMemObjVMCB, 1 << PAGE_SHIFT, false /* fExecutable */);
     250        rc = RTR0MemObjAllocCont(&pVCpu->hm.s.svm.hMemObjVmcb, 1 << PAGE_SHIFT, false /* fExecutable */);
    251251        if (RT_FAILURE(rc))
    252252            return rc;
    253253
    254         pVCpu->hm.s.svm.pvVMCB     = RTR0MemObjAddress(pVCpu->hm.s.svm.hMemObjVMCB);
    255         pVCpu->hm.s.svm.HCPhysVMCB = RTR0MemObjGetPagePhysAddr(pVCpu->hm.s.svm.hMemObjVMCB, 0);
    256         Assert(pVCpu->hm.s.svm.HCPhysVMCB < _4G);
    257         ASMMemZeroPage(pVCpu->hm.s.svm.pvVMCB);
     254        pVCpu->hm.s.svm.pvVmcb     = RTR0MemObjAddress(pVCpu->hm.s.svm.hMemObjVmcb);
     255        pVCpu->hm.s.svm.HCPhysVmcb = RTR0MemObjGetPagePhysAddr(pVCpu->hm.s.svm.hMemObjVmcb, 0);
     256        Assert(pVCpu->hm.s.svm.HCPhysVmcb < _4G);
     257        ASMMemZeroPage(pVCpu->hm.s.svm.pvVmcb);
    258258
    259259        /* Allocate 8 KB for the MSR bitmap (doesn't seem to be a way to convince SVM not to use it) */
     
    284284        PVMCPU pVCpu = &pVM->aCpus[i];
    285285
    286         if (pVCpu->hm.s.svm.hMemObjVMCBHost != NIL_RTR0MEMOBJ)
    287         {
    288             RTR0MemObjFree(pVCpu->hm.s.svm.hMemObjVMCBHost, false);
    289             pVCpu->hm.s.svm.pvVMCBHost      = 0;
    290             pVCpu->hm.s.svm.HCPhysVMCBHost  = 0;
    291             pVCpu->hm.s.svm.hMemObjVMCBHost = NIL_RTR0MEMOBJ;
    292         }
    293 
    294         if (pVCpu->hm.s.svm.hMemObjVMCB != NIL_RTR0MEMOBJ)
    295         {
    296             RTR0MemObjFree(pVCpu->hm.s.svm.hMemObjVMCB, false);
    297             pVCpu->hm.s.svm.pvVMCB      = 0;
    298             pVCpu->hm.s.svm.HCPhysVMCB  = 0;
    299             pVCpu->hm.s.svm.hMemObjVMCB = NIL_RTR0MEMOBJ;
     286        if (pVCpu->hm.s.svm.hMemObjVmcbHost != NIL_RTR0MEMOBJ)
     287        {
     288            RTR0MemObjFree(pVCpu->hm.s.svm.hMemObjVmcbHost, false);
     289            pVCpu->hm.s.svm.pvVmcbHost      = 0;
     290            pVCpu->hm.s.svm.HCPhysVmcbHost  = 0;
     291            pVCpu->hm.s.svm.hMemObjVmcbHost = NIL_RTR0MEMOBJ;
     292        }
     293
     294        if (pVCpu->hm.s.svm.hMemObjVmcb != NIL_RTR0MEMOBJ)
     295        {
     296            RTR0MemObjFree(pVCpu->hm.s.svm.hMemObjVmcb, false);
     297            pVCpu->hm.s.svm.pvVmcb      = 0;
     298            pVCpu->hm.s.svm.HCPhysVmcb  = 0;
     299            pVCpu->hm.s.svm.hMemObjVmcb = NIL_RTR0MEMOBJ;
    300300        }
    301301        if (pVCpu->hm.s.svm.hMemObjMsrBitmap != NIL_RTR0MEMOBJ)
     
    334334    {
    335335        PVMCPU    pVCpu = &pVM->aCpus[i];
    336         SVM_VMCB *pvVMCB = (SVM_VMCB *)pVM->aCpus[i].hm.s.svm.pvVMCB;
    337 
    338         AssertMsgReturn(pvVMCB, ("Invalid pvVMCB\n"), VERR_SVM_INVALID_PVMCB);
     336        PSVMVMCB  pVmcb = (PSVMVMCB)pVM->aCpus[i].hm.s.svm.pvVmcb;
     337
     338        AssertMsgReturn(pVmcb, ("Invalid pVmcb\n"), VERR_SVM_INVALID_PVMCB);
    339339
    340340        /*
     
    343343         * Note: CR0 & CR4 can be safely read when guest and shadow copies are identical.
    344344         */
    345         pvVMCB->ctrl.u16InterceptRdCRx = RT_BIT(0) | RT_BIT(4);
     345        pVmcb->ctrl.u16InterceptRdCRx = RT_BIT(0) | RT_BIT(4);
    346346
    347347        /* CR0/4 writes must be intercepted for obvious reasons. */
    348         pvVMCB->ctrl.u16InterceptWrCRx = RT_BIT(0) | RT_BIT(4);
     348        pVmcb->ctrl.u16InterceptWrCRx = RT_BIT(0) | RT_BIT(4);
    349349
    350350        /* Intercept all DRx reads and writes by default. Changed later on. */
    351         pvVMCB->ctrl.u16InterceptRdDRx = 0xFFFF;
    352         pvVMCB->ctrl.u16InterceptWrDRx = 0xFFFF;
     351        pVmcb->ctrl.u16InterceptRdDRx = 0xFFFF;
     352        pVmcb->ctrl.u16InterceptWrDRx = 0xFFFF;
    353353
    354354        /* Intercept traps; only #NM is always intercepted. */
    355         pvVMCB->ctrl.u32InterceptException  =   RT_BIT(X86_XCPT_NM);
     355        pVmcb->ctrl.u32InterceptException  =   RT_BIT(X86_XCPT_NM);
    356356#ifdef VBOX_ALWAYS_TRAP_PF
    357         pvVMCB->ctrl.u32InterceptException |=   RT_BIT(X86_XCPT_PF);
     357        pVmcb->ctrl.u32InterceptException |=   RT_BIT(X86_XCPT_PF);
    358358#endif
    359359#ifdef VBOX_STRICT
    360         pvVMCB->ctrl.u32InterceptException |=   RT_BIT(X86_XCPT_BP)
     360        pVmcb->ctrl.u32InterceptException |=   RT_BIT(X86_XCPT_BP)
    361361                                             | RT_BIT(X86_XCPT_DB)
    362362                                             | RT_BIT(X86_XCPT_DE)
     
    370370
    371371        /* Set up instruction and miscellaneous intercepts. */
    372         pvVMCB->ctrl.u32InterceptCtrl1 =   SVM_CTRL1_INTERCEPT_INTR
     372        pVmcb->ctrl.u32InterceptCtrl1 =   SVM_CTRL1_INTERCEPT_INTR
    373373                                        | SVM_CTRL1_INTERCEPT_VINTR
    374374                                        | SVM_CTRL1_INTERCEPT_NMI
     
    385385                                        | SVM_CTRL1_INTERCEPT_FERR_FREEZE;  /* Legacy FPU FERR handling. */
    386386                                        ;
    387         pvVMCB->ctrl.u32InterceptCtrl2 =   SVM_CTRL2_INTERCEPT_VMRUN         /* required */
     387        pVmcb->ctrl.u32InterceptCtrl2 =   SVM_CTRL2_INTERCEPT_VMRUN         /* required */
    388388                                        | SVM_CTRL2_INTERCEPT_VMMCALL
    389389                                        | SVM_CTRL2_INTERCEPT_VMLOAD
     
    397397                                                                               guest (host thinks the cpu load is high) */
    398398
    399         Log(("pvVMCB->ctrl.u32InterceptException = %x\n", pvVMCB->ctrl.u32InterceptException));
    400         Log(("pvVMCB->ctrl.u32InterceptCtrl1 = %x\n", pvVMCB->ctrl.u32InterceptCtrl1));
    401         Log(("pvVMCB->ctrl.u32InterceptCtrl2 = %x\n", pvVMCB->ctrl.u32InterceptCtrl2));
     399        Log(("pVmcb->ctrl.u32InterceptException = %x\n", pVmcb->ctrl.u32InterceptException));
     400        Log(("pVmcb->ctrl.u32InterceptCtrl1 = %x\n", pVmcb->ctrl.u32InterceptCtrl1));
     401        Log(("pVmcb->ctrl.u32InterceptCtrl2 = %x\n", pVmcb->ctrl.u32InterceptCtrl2));
    402402
    403403        /* Virtualize masking of INTR interrupts. (reads/writes from/to CR8 go to the V_TPR register) */
    404         pvVMCB->ctrl.IntCtrl.n.u1VIrqMasking = 1;
     404        pVmcb->ctrl.IntCtrl.n.u1VIrqMasking = 1;
    405405
    406406        /* Ignore the priority in the TPR; just deliver it when we tell it to. */
    407         pvVMCB->ctrl.IntCtrl.n.u1IgnoreTPR   = 1;
     407        pVmcb->ctrl.IntCtrl.n.u1IgnoreTPR   = 1;
    408408
    409409        /* Set IO and MSR bitmap addresses. */
    410         pvVMCB->ctrl.u64IOPMPhysAddr  = pVM->hm.s.svm.HCPhysIOBitmap;
    411         pvVMCB->ctrl.u64MSRPMPhysAddr = pVCpu->hm.s.svm.HCPhysMsrBitmap;
     410        pVmcb->ctrl.u64IOPMPhysAddr  = pVM->hm.s.svm.HCPhysIOBitmap;
     411        pVmcb->ctrl.u64MSRPMPhysAddr = pVCpu->hm.s.svm.HCPhysMsrBitmap;
    412412
    413413        /* No LBR virtualization. */
    414         pvVMCB->ctrl.u64LBRVirt      = 0;
     414        pVmcb->ctrl.u64LBRVirt      = 0;
    415415
    416416        /* The ASID must start at 1; the host uses 0. */
    417         pvVMCB->ctrl.TLBCtrl.n.u32ASID = 1;
     417        pVmcb->ctrl.TLBCtrl.n.u32ASID = 1;
    418418
    419419        /*
     
    422422         * so choose type 6 for all PAT slots.
    423423         */
    424         pvVMCB->guest.u64GPAT = 0x0006060606060606ULL;
     424        pVmcb->guest.u64GPAT = 0x0006060606060606ULL;
    425425
    426426        /* If nested paging is not in use, additional intercepts have to be set up. */
     
    428428        {
    429429            /* CR3 reads/writes must be intercepted; our shadow values are different from guest's. */
    430             pvVMCB->ctrl.u16InterceptRdCRx |= RT_BIT(3);
    431             pvVMCB->ctrl.u16InterceptWrCRx |= RT_BIT(3);
     430            pVmcb->ctrl.u16InterceptRdCRx |= RT_BIT(3);
     431            pVmcb->ctrl.u16InterceptWrCRx |= RT_BIT(3);
    432432
    433433            /*
     
    436436             * - task switches (may change CR3/EFLAGS/LDT)
    437437             */
    438             pvVMCB->ctrl.u32InterceptCtrl1 |=   SVM_CTRL1_INTERCEPT_INVLPG
     438            pVmcb->ctrl.u32InterceptCtrl1 |=   SVM_CTRL1_INTERCEPT_INVLPG
    439439                                             | SVM_CTRL1_INTERCEPT_TASK_SWITCH;
    440440
    441441            /* Page faults must be intercepted to implement shadow paging. */
    442             pvVMCB->ctrl.u32InterceptException |= RT_BIT(X86_XCPT_PF);
     442            pVmcb->ctrl.u32InterceptException |= RT_BIT(X86_XCPT_PF);
    443443        }
    444444
     
    521521 * @param   pIntInfo    Pointer to the SVM interrupt info.
    522522 */
    523 DECLINLINE(void) hmR0SvmSetPendingEvent(PVMCPU pVCpu, SVM_EVENT *pEvent)
     523DECLINLINE(void) hmR0SvmSetPendingEvent(PVMCPU pVCpu, SVMEVENT *pEvent)
    524524{
    525525#ifdef VBOX_STRICT
     
    539539 *
    540540 * @param   pVCpu       Pointer to the VMCPU.
    541  * @param   pvVMCB      Pointer to the VMCB.
     541 * @param   pVmcb       Pointer to the VMCB.
    542542 * @param   pCtx        Pointer to the guest CPU context.
    543543 * @param   pIntInfo    Pointer to the SVM interrupt info.
    544544 */
    545 DECLINLINE(void) hmR0SvmInjectEvent(PVMCPU pVCpu, SVM_VMCB *pvVMCB, CPUMCTX *pCtx, SVM_EVENT *pEvent)
     545DECLINLINE(void) hmR0SvmInjectEvent(PVMCPU pVCpu, PSVMVMCB pVmcb, CPUMCTX *pCtx, SVMEVENT *pEvent)
    546546{
    547547#ifdef VBOX_WITH_STATISTICS
     
    566566
    567567    /* Set event injection state. */
    568     pvVMCB->ctrl.EventInject.au64[0] = pEvent->au64[0];
     568    pVmcb->ctrl.EventInject.au64[0] = pEvent->au64[0];
    569569}
    570570
     
    576576 * @param   pVM         Pointer to the VM.
    577577 * @param   pVCpu       Pointer to the VMCPU.
    578  * @param   pvVMCB      Pointer to the VMCB.
     578 * @param   pVmcb       Pointer to the VMCB.
    579579 * @param   pCtx        Pointer to the guest CPU Context.
    580580 */
    581 static int hmR0SvmCheckPendingInterrupt(PVM pVM, PVMCPU pVCpu, SVM_VMCB *pvVMCB, CPUMCTX *pCtx)
     581static int hmR0SvmCheckPendingInterrupt(PVM pVM, PVMCPU pVCpu, PSVMVMCB pVmcb, CPUMCTX *pCtx)
    582582{
    583583    int rc;
     
    589589    if (pVCpu->hm.s.Event.fPending)
    590590    {
    591         SVM_EVENT Event;
     591        SVMEVENT Event;
    592592
    593593        Log(("Reinjecting event %08x %08x at %RGv\n", pVCpu->hm.s.Event.u64IntrInfo, pVCpu->hm.s.Event.u32ErrCode,
     
    595595        STAM_COUNTER_INC(&pVCpu->hm.s.StatIntReinject);
    596596        Event.au64[0] = pVCpu->hm.s.Event.u64IntrInfo;
    597         hmR0SvmInjectEvent(pVCpu, pvVMCB, pCtx, &Event);
     597        hmR0SvmInjectEvent(pVCpu, pVmcb, pCtx, &Event);
    598598
    599599        pVCpu->hm.s.Event.fPending = false;
     
    608608        if (VMCPU_FF_TESTANDCLEAR(pVCpu, VMCPU_FF_INTERRUPT_NMI))
    609609        {
    610             SVM_EVENT Event;
     610            SVMEVENT Event;
    611611
    612612            Log(("CPU%d: injecting #NMI\n", pVCpu->idCpu));
     
    616616            Event.n.u3Type       = SVM_EVENT_NMI;
    617617
    618             hmR0SvmInjectEvent(pVCpu, pvVMCB, pCtx, &Event);
     618            hmR0SvmInjectEvent(pVCpu, pVmcb, pCtx, &Event);
    619619            return VINF_SUCCESS;
    620620        }
     
    630630                || VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS))
    631631            {
    632                 if (!pvVMCB->ctrl.IntCtrl.n.u1VIrqValid)
     632                if (!pVmcb->ctrl.IntCtrl.n.u1VIrqValid)
    633633                {
    634634                    if (!VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS))
     
    642642                    /** @todo Use virtual interrupt method to inject a pending IRQ; dispatched as
    643643                     *        soon as guest.IF is set. */
    644                     pvVMCB->ctrl.u32InterceptCtrl1 |= SVM_CTRL1_INTERCEPT_VINTR;
    645                     pvVMCB->ctrl.IntCtrl.n.u1VIrqValid    = 1;
    646                     pvVMCB->ctrl.IntCtrl.n.u8VIrqVector   = 0; /* don't care */
     644                    pVmcb->ctrl.u32InterceptCtrl1 |= SVM_CTRL1_INTERCEPT_VINTR;
     645                    pVmcb->ctrl.IntCtrl.n.u1VIrqValid    = 1;
     646                    pVmcb->ctrl.IntCtrl.n.u8VIrqVector   = 0; /* don't care */
    647647                }
    648648            }
     
    685685        uint8_t     u8Vector;
    686686        TRPMEVENT   enmType;
    687         SVM_EVENT   Event;
     687        SVMEVENT   Event;
    688688        RTGCUINT    u32ErrorCode;
    689689
     
    730730
    731731        STAM_COUNTER_INC(&pVCpu->hm.s.StatIntInject);
    732         hmR0SvmInjectEvent(pVCpu, pvVMCB, pCtx, &Event);
     732        hmR0SvmInjectEvent(pVCpu, pVmcb, pCtx, &Event);
    733733    } /* if (interrupts can be dispatched) */
    734734
     
    766766{
    767767    RTGCUINTPTR val;
    768     SVM_VMCB *pvVMCB;
     768    PSVMVMCB pVmcb;
    769769
    770770    if (pVM == NULL)
     
    774774    Assert(pVM->hm.s.svm.fSupported);
    775775
    776     pvVMCB = (SVM_VMCB *)pVCpu->hm.s.svm.pvVMCB;
    777     AssertMsgReturn(pvVMCB, ("Invalid pvVMCB\n"), VERR_SVM_INVALID_PVMCB);
     776    pVmcb = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
     777    AssertMsgReturn(pVmcb, ("Invalid pVmcb\n"), VERR_SVM_INVALID_PVMCB);
    778778
    779779    /* Guest CPU context: ES, CS, SS, DS, FS, GS. */
     
    803803    if (pVCpu->hm.s.fContextUseFlags & HM_CHANGED_GUEST_GDTR)
    804804    {
    805         pvVMCB->guest.GDTR.u32Limit = pCtx->gdtr.cbGdt;
    806         pvVMCB->guest.GDTR.u64Base  = pCtx->gdtr.pGdt;
     805        pVmcb->guest.GDTR.u32Limit = pCtx->gdtr.cbGdt;
     806        pVmcb->guest.GDTR.u64Base  = pCtx->gdtr.pGdt;
    807807    }
    808808
     
    810810    if (pVCpu->hm.s.fContextUseFlags & HM_CHANGED_GUEST_IDTR)
    811811    {
    812         pvVMCB->guest.IDTR.u32Limit = pCtx->idtr.cbIdt;
    813         pvVMCB->guest.IDTR.u64Base  = pCtx->idtr.pIdt;
     812        pVmcb->guest.IDTR.u32Limit = pCtx->idtr.cbIdt;
     813        pVmcb->guest.IDTR.u64Base  = pCtx->idtr.pIdt;
    814814    }
    815815
     
    817817     * Sysenter MSRs (unconditional)
    818818     */
    819     pvVMCB->guest.u64SysEnterCS  = pCtx->SysEnter.cs;
    820     pvVMCB->guest.u64SysEnterEIP = pCtx->SysEnter.eip;
    821     pvVMCB->guest.u64SysEnterESP = pCtx->SysEnter.esp;
     819    pVmcb->guest.u64SysEnterCS  = pCtx->SysEnter.cs;
     820    pVmcb->guest.u64SysEnterEIP = pCtx->SysEnter.eip;
     821    pVmcb->guest.u64SysEnterESP = pCtx->SysEnter.esp;
    822822
    823823    /* Control registers */
     
    840840                if (!pVCpu->hm.s.fFPUOldStyleOverride)
    841841                {
    842                     pvVMCB->ctrl.u32InterceptException |= RT_BIT(X86_XCPT_MF);
     842                    pVmcb->ctrl.u32InterceptException |= RT_BIT(X86_XCPT_MF);
    843843                    pVCpu->hm.s.fFPUOldStyleOverride = true;
    844844                }
     
    859859            val |= X86_CR0_WP;  /* Must set this as we rely on protecting various pages and supervisor writes must be caught. */
    860860        }
    861         pvVMCB->guest.u64CR0 = val;
     861        pVmcb->guest.u64CR0 = val;
    862862    }
    863863    /* CR2 as well */
    864     pvVMCB->guest.u64CR2 = pCtx->cr2;
     864    pVmcb->guest.u64CR2 = pCtx->cr2;
    865865
    866866    if (pVCpu->hm.s.fContextUseFlags & HM_CHANGED_GUEST_CR3)
     
    878878                enmShwPagingMode = PGMGetHostMode(pVM);
    879879
    880             pvVMCB->ctrl.u64NestedPagingCR3  = PGMGetNestedCR3(pVCpu, enmShwPagingMode);
    881             Assert(pvVMCB->ctrl.u64NestedPagingCR3);
    882             pvVMCB->guest.u64CR3             = pCtx->cr3;
     880            pVmcb->ctrl.u64NestedPagingCR3  = PGMGetNestedCR3(pVCpu, enmShwPagingMode);
     881            Assert(pVmcb->ctrl.u64NestedPagingCR3);
     882            pVmcb->guest.u64CR3             = pCtx->cr3;
    883883        }
    884884        else
    885885        {
    886             pvVMCB->guest.u64CR3             = PGMGetHyperCR3(pVCpu);
    887             Assert(pvVMCB->guest.u64CR3 || VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL));
     886            pVmcb->guest.u64CR3             = PGMGetHyperCR3(pVCpu);
     887            Assert(pVmcb->guest.u64CR3 || VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL));
    888888        }
    889889    }
     
    925925            }
    926926        }
    927         pvVMCB->guest.u64CR4 = val;
     927        pVmcb->guest.u64CR4 = val;
    928928    }
    929929
     
    938938        pCtx->dr[7] |= 0x400;                                                     /* must be one */
    939939
    940         pvVMCB->guest.u64DR7 = pCtx->dr[7];
    941         pvVMCB->guest.u64DR6 = pCtx->dr[6];
     940        pVmcb->guest.u64DR7 = pCtx->dr[7];
     941        pVmcb->guest.u64DR6 = pCtx->dr[6];
    942942
    943943#ifdef DEBUG
     
    954954
    955955            /* Override dr6 & dr7 with the hypervisor values. */
    956             pvVMCB->guest.u64DR7 = CPUMGetHyperDR7(pVCpu);
    957             pvVMCB->guest.u64DR6 = CPUMGetHyperDR6(pVCpu);
     956            pVmcb->guest.u64DR7 = CPUMGetHyperDR7(pVCpu);
     957            pVmcb->guest.u64DR6 = CPUMGetHyperDR6(pVCpu);
    958958        }
    959959        else
     
    967967
    968968            /* Disable drx move intercepts. */
    969             pvVMCB->ctrl.u16InterceptRdDRx = 0;
    970             pvVMCB->ctrl.u16InterceptWrDRx = 0;
     969            pVmcb->ctrl.u16InterceptRdDRx = 0;
     970            pVmcb->ctrl.u16InterceptWrDRx = 0;
    971971
    972972            /* Save the host and load the guest debug state. */
     
    977977
    978978    /* EIP, ESP and EFLAGS */
    979     pvVMCB->guest.u64RIP    = pCtx->rip;
    980     pvVMCB->guest.u64RSP    = pCtx->rsp;
    981     pvVMCB->guest.u64RFlags = pCtx->eflags.u32;
     979    pVmcb->guest.u64RIP    = pCtx->rip;
     980    pVmcb->guest.u64RSP    = pCtx->rsp;
     981    pVmcb->guest.u64RFlags = pCtx->eflags.u32;
    982982
    983983    /* Set CPL */
    984     pvVMCB->guest.u8CPL     = pCtx->ss.Attr.n.u2Dpl;
     984    pVmcb->guest.u8CPL     = pCtx->ss.Attr.n.u2Dpl;
    985985
    986986    /* RAX/EAX too, as VMRUN uses RAX as an implicit parameter. */
    987     pvVMCB->guest.u64RAX    = pCtx->rax;
     987    pVmcb->guest.u64RAX    = pCtx->rax;
    988988
    989989    /* vmrun will fail without MSR_K6_EFER_SVME. */
    990     pvVMCB->guest.u64EFER   = pCtx->msrEFER | MSR_K6_EFER_SVME;
     990    pVmcb->guest.u64EFER   = pCtx->msrEFER | MSR_K6_EFER_SVME;
    991991
    992992    /* 64 bits guest mode? */
     
    10051005#endif
    10061006        /* Unconditionally update these as wrmsr might have changed them. (HM_CHANGED_GUEST_SEGMENT_REGS will not be set) */
    1007         pvVMCB->guest.FS.u64Base    = pCtx->fs.u64Base;
    1008         pvVMCB->guest.GS.u64Base    = pCtx->gs.u64Base;
     1007        pVmcb->guest.FS.u64Base    = pCtx->fs.u64Base;
     1008        pVmcb->guest.GS.u64Base    = pCtx->gs.u64Base;
    10091009    }
    10101010    else
    10111011    {
    10121012        /* Filter out the MSR_K6_LME bit or else AMD-V expects amd64 shadow paging. */
    1013         pvVMCB->guest.u64EFER &= ~MSR_K6_EFER_LME;
     1013        pVmcb->guest.u64EFER &= ~MSR_K6_EFER_LME;
    10141014
    10151015        pVCpu->hm.s.svm.pfnVMRun = SVMR0VMRun;
     
    10171017
    10181018    /* TSC offset. */
    1019     if (TMCpuTickCanUseRealTSC(pVCpu, &pvVMCB->ctrl.u64TSCOffset))
     1019    if (TMCpuTickCanUseRealTSC(pVCpu, &pVmcb->ctrl.u64TSCOffset))
    10201020    {
    10211021        uint64_t u64CurTSC = ASMReadTSC();
    1022         if (u64CurTSC + pvVMCB->ctrl.u64TSCOffset > TMCpuTickGetLastSeen(pVCpu))
    1023         {
    1024             pvVMCB->ctrl.u32InterceptCtrl1 &= ~SVM_CTRL1_INTERCEPT_RDTSC;
    1025             pvVMCB->ctrl.u32InterceptCtrl2 &= ~SVM_CTRL2_INTERCEPT_RDTSCP;
     1022        if (u64CurTSC + pVmcb->ctrl.u64TSCOffset > TMCpuTickGetLastSeen(pVCpu))
     1023        {
     1024            pVmcb->ctrl.u32InterceptCtrl1 &= ~SVM_CTRL1_INTERCEPT_RDTSC;
     1025            pVmcb->ctrl.u32InterceptCtrl2 &= ~SVM_CTRL2_INTERCEPT_RDTSCP;
    10261026            STAM_COUNTER_INC(&pVCpu->hm.s.StatTscOffset);
    10271027        }
     
    10301030            /* Fall back to rdtsc emulation as we would otherwise pass decreasing tsc values to the guest. */
    10311031            LogFlow(("TSC %RX64 offset %RX64 time=%RX64 last=%RX64 (diff=%RX64, virt_tsc=%RX64)\n", u64CurTSC,
    1032                      pvVMCB->ctrl.u64TSCOffset, u64CurTSC + pvVMCB->ctrl.u64TSCOffset, TMCpuTickGetLastSeen(pVCpu),
    1033                      TMCpuTickGetLastSeen(pVCpu) - u64CurTSC - pvVMCB->ctrl.u64TSCOffset, TMCpuTickGet(pVCpu)));
    1034             pvVMCB->ctrl.u32InterceptCtrl1 |= SVM_CTRL1_INTERCEPT_RDTSC;
    1035             pvVMCB->ctrl.u32InterceptCtrl2 |= SVM_CTRL2_INTERCEPT_RDTSCP;
     1032                     pVmcb->ctrl.u64TSCOffset, u64CurTSC + pVmcb->ctrl.u64TSCOffset, TMCpuTickGetLastSeen(pVCpu),
     1033                     TMCpuTickGetLastSeen(pVCpu) - u64CurTSC - pVmcb->ctrl.u64TSCOffset, TMCpuTickGet(pVCpu)));
     1034            pVmcb->ctrl.u32InterceptCtrl1 |= SVM_CTRL1_INTERCEPT_RDTSC;
     1035            pVmcb->ctrl.u32InterceptCtrl2 |= SVM_CTRL2_INTERCEPT_RDTSCP;
    10361036            STAM_COUNTER_INC(&pVCpu->hm.s.StatTscInterceptOverFlow);
    10371037        }
     
    10391039    else
    10401040    {
    1041         pvVMCB->ctrl.u32InterceptCtrl1 |= SVM_CTRL1_INTERCEPT_RDTSC;
    1042         pvVMCB->ctrl.u32InterceptCtrl2 |= SVM_CTRL2_INTERCEPT_RDTSCP;
     1041        pVmcb->ctrl.u32InterceptCtrl1 |= SVM_CTRL1_INTERCEPT_RDTSC;
     1042        pVmcb->ctrl.u32InterceptCtrl2 |= SVM_CTRL2_INTERCEPT_RDTSCP;
    10431043        STAM_COUNTER_INC(&pVCpu->hm.s.StatTscIntercept);
    10441044    }
    10451045
    10461046    /* Sync the various MSRs for 64-bit mode. */
    1047     pvVMCB->guest.u64STAR            = pCtx->msrSTAR;            /* legacy syscall eip, cs & ss */
    1048     pvVMCB->guest.u64LSTAR           = pCtx->msrLSTAR;           /* 64-bit mode syscall rip */
    1049     pvVMCB->guest.u64CSTAR           = pCtx->msrCSTAR;           /* compatibility mode syscall rip */
    1050     pvVMCB->guest.u64SFMASK          = pCtx->msrSFMASK;          /* syscall flag mask */
    1051     pvVMCB->guest.u64KernelGSBase    = pCtx->msrKERNELGSBASE;    /* SWAPGS exchange value */
     1047    pVmcb->guest.u64STAR            = pCtx->msrSTAR;            /* legacy syscall eip, cs & ss */
     1048    pVmcb->guest.u64LSTAR           = pCtx->msrLSTAR;           /* 64-bit mode syscall rip */
     1049    pVmcb->guest.u64CSTAR           = pCtx->msrCSTAR;           /* compatibility mode syscall rip */
     1050    pVmcb->guest.u64SFMASK          = pCtx->msrSFMASK;          /* syscall flag mask */
     1051    pVmcb->guest.u64KernelGSBase    = pCtx->msrKERNELGSBASE;    /* SWAPGS exchange value */
    10521052
    10531053#ifdef DEBUG
     
    10551055    if (    DBGFIsStepping(pVCpu)
    10561056        ||  CPUMIsHyperDebugStateActive(pVCpu))
    1057         pvVMCB->ctrl.u32InterceptException |=  RT_BIT(X86_XCPT_DB);
     1057        pVmcb->ctrl.u32InterceptException |=  RT_BIT(X86_XCPT_DB);
    10581058    else
    1059         pvVMCB->ctrl.u32InterceptException &= ~RT_BIT(X86_XCPT_DB);
     1059        pVmcb->ctrl.u32InterceptException &= ~RT_BIT(X86_XCPT_DB);
    10601060#endif
    10611061
     
    10801080    AssertPtr(pVCpu);
    10811081
    1082     SVM_VMCB *pvVMCB = (SVM_VMCB *)pVCpu->hm.s.svm.pvVMCB;
     1082    PSVMVMCB pVmcb = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
    10831083    pCpu = HMR0GetCurrentCpu();
    10841084
     
    11091109
    11101110    pVCpu->hm.s.idLastCpu = pCpu->idCpu;
    1111     pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_NOTHING;
     1111    pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_NOTHING;
    11121112
    11131113    if (RT_UNLIKELY(pVM->hm.s.svm.fAlwaysFlushTLB))
     
    11191119        pVCpu->hm.s.uCurrentAsid     = 1;
    11201120        pVCpu->hm.s.cTlbFlushes      = pCpu->cTlbFlushes;
    1121         pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
     1121        pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
    11221122    }
    11231123    else if (pVCpu->hm.s.fForceTLBFlush)
     
    11351135                if (pVM->hm.s.svm.u32Features & AMD_CPUID_SVM_FEATURE_EDX_FLUSH_BY_ASID)
    11361136                {
    1137                     pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_SINGLE_CONTEXT;
     1137                    pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_SINGLE_CONTEXT;
    11381138                    pCpu->fFlushAsidBeforeUse = true;
    11391139                }
    11401140                else
    11411141                {
    1142                     pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
     1142                    pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
    11431143                    pCpu->fFlushAsidBeforeUse = false;
    11441144                }
     
    11491149            {
    11501150                if (pVM->hm.s.svm.u32Features & AMD_CPUID_SVM_FEATURE_EDX_FLUSH_BY_ASID)
    1151                     pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_SINGLE_CONTEXT;
     1151                    pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_SINGLE_CONTEXT;
    11521152                else
    11531153                {
    1154                     pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
     1154                    pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
    11551155                    pCpu->fFlushAsidBeforeUse = false;
    11561156                }
     
    11631163        {
    11641164            if (pVM->hm.s.svm.u32Features & AMD_CPUID_SVM_FEATURE_EDX_FLUSH_BY_ASID)
    1165                 pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_SINGLE_CONTEXT;
     1165                pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_SINGLE_CONTEXT;
    11661166            else
    1167                 pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
     1167                pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
    11681168        }
    11691169
     
    11801180            STAM_COUNTER_INC(&pVCpu->hm.s.StatTlbShootdown);
    11811181            for (uint32_t i = 0; i < pVCpu->hm.s.TlbShootdown.cPages; i++)
    1182                 SVMR0InvlpgA(pVCpu->hm.s.TlbShootdown.aPages[i], pvVMCB->ctrl.TLBCtrl.n.u32ASID);
     1182                SVMR0InvlpgA(pVCpu->hm.s.TlbShootdown.aPages[i], pVmcb->ctrl.TLBCtrl.n.u32ASID);
    11831183        }
    11841184    }
     
    11881188
    11891189    /* Update VMCB with the ASID. */
    1190     pvVMCB->ctrl.TLBCtrl.n.u32ASID = pVCpu->hm.s.uCurrentAsid;
     1190    pVmcb->ctrl.TLBCtrl.n.u32ASID = pVCpu->hm.s.uCurrentAsid;
    11911191
    11921192    AssertMsg(pVCpu->hm.s.cTlbFlushes == pCpu->cTlbFlushes,
     
    11981198
    11991199#ifdef VBOX_WITH_STATISTICS
    1200     if (pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush == SVM_TLB_FLUSH_NOTHING)
     1200    if (pVmcb->ctrl.TLBCtrl.n.u8TLBFlush == SVM_TLB_FLUSH_NOTHING)
    12011201        STAM_COUNTER_INC(&pVCpu->hm.s.StatNoFlushTlbWorldSwitch);
    1202     else if (   pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush == SVM_TLB_FLUSH_SINGLE_CONTEXT
    1203              || pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush == SVM_TLB_FLUSH_SINGLE_CONTEXT_RETAIN_GLOBALS)
     1202    else if (   pVmcb->ctrl.TLBCtrl.n.u8TLBFlush == SVM_TLB_FLUSH_SINGLE_CONTEXT
     1203             || pVmcb->ctrl.TLBCtrl.n.u8TLBFlush == SVM_TLB_FLUSH_SINGLE_CONTEXT_RETAIN_GLOBALS)
    12041204    {
    12051205        STAM_COUNTER_INC(&pVCpu->hm.s.StatFlushAsid);
     
    12281228    int             rc2;
    12291229    uint64_t        exitCode    = (uint64_t)SVM_EXIT_INVALID;
    1230     SVM_VMCB       *pvVMCB       = NULL;
     1230    PSVMVMCB        pVmcb       = NULL;
    12311231    bool            fSyncTPR    = false;
    12321232    unsigned        cResume     = 0;
     
    12421242#endif
    12431243
    1244     pvVMCB = (SVM_VMCB *)pVCpu->hm.s.svm.pvVMCB;
    1245     AssertMsgReturn(pvVMCB, ("Invalid pvVMCB\n"), VERR_SVM_INVALID_PVMCB);
     1244    pVmcb = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
     1245    AssertMsgReturn(pVmcb, ("Invalid pVmcb\n"), VERR_SVM_INVALID_PVMCB);
    12461246
    12471247    /*
     
    12791279            VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS);
    12801280            /* Irq inhibition is no longer active; clear the corresponding SVM state. */
    1281             pvVMCB->ctrl.u64IntShadow = 0;
     1281            pVmcb->ctrl.u64IntShadow = 0;
    12821282        }
    12831283    }
     
    12851285    {
    12861286        /* Irq inhibition is no longer active; clear the corresponding SVM state. */
    1287         pvVMCB->ctrl.u64IntShadow = 0;
     1287        pVmcb->ctrl.u64IntShadow = 0;
    12881288    }
    12891289
     
    13851385     * Note: *After* VM_FF_INHIBIT_INTERRUPTS check!!
    13861386     */
    1387     rc = hmR0SvmCheckPendingInterrupt(pVM, pVCpu, pvVMCB, pCtx);
     1387    rc = hmR0SvmCheckPendingInterrupt(pVM, pVCpu, pVmcb, pCtx);
    13881388    if (RT_FAILURE(rc))
    13891389        goto end;
     
    14251425        {
    14261426            /* cr8 bits 3-0 correspond to bits 7-4 of the task priority mmio register. */
    1427             pvVMCB->ctrl.IntCtrl.n.u8VTPR = (u8LastTPR >> 4);
     1427            pVmcb->ctrl.IntCtrl.n.u8VTPR = (u8LastTPR >> 4);
    14281428
    14291429            if (fPending)
    14301430            {
    14311431                /* A TPR change could activate a pending interrupt, so catch cr8 writes. */
    1432                 pvVMCB->ctrl.u16InterceptWrCRx |= RT_BIT(8);
     1432                pVmcb->ctrl.u16InterceptWrCRx |= RT_BIT(8);
    14331433            }
    14341434            else
     
    14381438                 * There are enough world switches for detecting pending interrupts.
    14391439                 */
    1440                 pvVMCB->ctrl.u16InterceptWrCRx &= ~RT_BIT(8);
     1440                pVmcb->ctrl.u16InterceptWrCRx &= ~RT_BIT(8);
    14411441            }
    14421442        }
     
    14471447
    14481448    /* Enable nested paging if necessary (disabled each time after #VMEXIT). */
    1449     pvVMCB->ctrl.NestedPaging.n.u1NestedPaging = pVM->hm.s.fNestedPaging;
     1449    pVmcb->ctrl.NestedPaging.n.u1NestedPaging = pVM->hm.s.fNestedPaging;
    14501450
    14511451#ifdef LOG_ENABLED
     
    14951495    pVCpu->hm.s.fForceTLBFlush = pVM->hm.s.svm.fAlwaysFlushTLB;
    14961496
    1497     Assert(sizeof(pVCpu->hm.s.svm.HCPhysVMCB) == 8);
    1498     Assert(pvVMCB->ctrl.IntCtrl.n.u1VIrqMasking);
    1499     Assert(pvVMCB->ctrl.u64IOPMPhysAddr  == pVM->hm.s.svm.HCPhysIOBitmap);
    1500     Assert(pvVMCB->ctrl.u64MSRPMPhysAddr == pVCpu->hm.s.svm.HCPhysMsrBitmap);
    1501     Assert(pvVMCB->ctrl.u64LBRVirt == 0);
     1497    Assert(sizeof(pVCpu->hm.s.svm.HCPhysVmcb) == 8);
     1498    Assert(pVmcb->ctrl.IntCtrl.n.u1VIrqMasking);
     1499    Assert(pVmcb->ctrl.u64IOPMPhysAddr  == pVM->hm.s.svm.HCPhysIOBitmap);
     1500    Assert(pVmcb->ctrl.u64MSRPMPhysAddr == pVCpu->hm.s.svm.HCPhysMsrBitmap);
     1501    Assert(pVmcb->ctrl.u64LBRVirt == 0);
    15021502
    15031503#ifdef VBOX_STRICT
     
    15121512    u32HostExtFeatures = pVM->hm.s.cpuid.u32AMDFeatureEDX;
    15131513    if (    (u32HostExtFeatures & X86_CPUID_EXT_FEATURE_EDX_RDTSCP)
    1514         && !(pvVMCB->ctrl.u32InterceptCtrl2 & SVM_CTRL2_INTERCEPT_RDTSCP))
     1514        && !(pVmcb->ctrl.u32InterceptCtrl2 & SVM_CTRL2_INTERCEPT_RDTSCP))
    15151515    {
    15161516        pVCpu->hm.s.u64HostTscAux = ASMRdMsr(MSR_K8_TSC_AUX);
     
    15221522
    15231523#ifdef VBOX_WITH_KERNEL_USING_XMM
    1524     HMR0SVMRunWrapXMM(pVCpu->hm.s.svm.HCPhysVMCBHost, pVCpu->hm.s.svm.HCPhysVMCB, pCtx, pVM, pVCpu,
     1524    HMR0SVMRunWrapXMM(pVCpu->hm.s.svm.HCPhysVmcbHost, pVCpu->hm.s.svm.HCPhysVmcb, pCtx, pVM, pVCpu,
    15251525                          pVCpu->hm.s.svm.pfnVMRun);
    15261526#else
    1527     pVCpu->hm.s.svm.pfnVMRun(pVCpu->hm.s.svm.HCPhysVMCBHost, pVCpu->hm.s.svm.HCPhysVMCB, pCtx, pVM, pVCpu);
     1527    pVCpu->hm.s.svm.pfnVMRun(pVCpu->hm.s.svm.HCPhysVmcbHost, pVCpu->hm.s.svm.HCPhysVmcb, pCtx, pVM, pVCpu);
    15281528#endif
    15291529
     
    15311531    ASMAtomicIncU32(&pVCpu->hm.s.cWorldSwitchExits);
    15321532    /* Possibly the last TSC value seen by the guest (too high) (only when we're in TSC offset mode). */
    1533     if (!(pvVMCB->ctrl.u32InterceptCtrl1 & SVM_CTRL1_INTERCEPT_RDTSC))
     1533    if (!(pVmcb->ctrl.u32InterceptCtrl1 & SVM_CTRL1_INTERCEPT_RDTSC))
    15341534    {
    15351535        /* Restore host's TSC_AUX. */
     
    15381538
    15391539        TMCpuTickSetLastSeen(pVCpu, ASMReadTSC() +
    1540                              pvVMCB->ctrl.u64TSCOffset - 0x400 /* guestimate of world switch overhead in clock ticks */);
     1540                             pVmcb->ctrl.u64TSCOffset - 0x400 /* guestimate of world switch overhead in clock ticks */);
    15411541    }
    15421542
     
    15561556
    15571557    /* Reason for the VM exit */
    1558     exitCode = pvVMCB->ctrl.u64ExitCode;
     1558    exitCode = pVmcb->ctrl.u64ExitCode;
    15591559
    15601560    if (RT_UNLIKELY(exitCode == (uint64_t)SVM_EXIT_INVALID))      /* Invalid guest state. */
     
    15621562        HMDumpRegs(pVM, pVCpu, pCtx);
    15631563#ifdef DEBUG
    1564         Log(("ctrl.u16InterceptRdCRx            %x\n",      pvVMCB->ctrl.u16InterceptRdCRx));
    1565         Log(("ctrl.u16InterceptWrCRx            %x\n",      pvVMCB->ctrl.u16InterceptWrCRx));
    1566         Log(("ctrl.u16InterceptRdDRx            %x\n",      pvVMCB->ctrl.u16InterceptRdDRx));
    1567         Log(("ctrl.u16InterceptWrDRx            %x\n",      pvVMCB->ctrl.u16InterceptWrDRx));
    1568         Log(("ctrl.u32InterceptException        %x\n",      pvVMCB->ctrl.u32InterceptException));
    1569         Log(("ctrl.u32InterceptCtrl1            %x\n",      pvVMCB->ctrl.u32InterceptCtrl1));
    1570         Log(("ctrl.u32InterceptCtrl2            %x\n",      pvVMCB->ctrl.u32InterceptCtrl2));
    1571         Log(("ctrl.u64IOPMPhysAddr              %RX64\n",   pvVMCB->ctrl.u64IOPMPhysAddr));
    1572         Log(("ctrl.u64MSRPMPhysAddr             %RX64\n",   pvVMCB->ctrl.u64MSRPMPhysAddr));
    1573         Log(("ctrl.u64TSCOffset                 %RX64\n",   pvVMCB->ctrl.u64TSCOffset));
    1574 
    1575         Log(("ctrl.TLBCtrl.u32ASID              %x\n",      pvVMCB->ctrl.TLBCtrl.n.u32ASID));
    1576         Log(("ctrl.TLBCtrl.u8TLBFlush           %x\n",      pvVMCB->ctrl.TLBCtrl.n.u8TLBFlush));
    1577         Log(("ctrl.TLBCtrl.u24Reserved          %x\n",      pvVMCB->ctrl.TLBCtrl.n.u24Reserved));
    1578 
    1579         Log(("ctrl.IntCtrl.u8VTPR               %x\n",      pvVMCB->ctrl.IntCtrl.n.u8VTPR));
    1580         Log(("ctrl.IntCtrl.u1VIrqValid          %x\n",      pvVMCB->ctrl.IntCtrl.n.u1VIrqValid));
    1581         Log(("ctrl.IntCtrl.u7Reserved           %x\n",      pvVMCB->ctrl.IntCtrl.n.u7Reserved));
    1582         Log(("ctrl.IntCtrl.u4VIrqPriority       %x\n",      pvVMCB->ctrl.IntCtrl.n.u4VIrqPriority));
    1583         Log(("ctrl.IntCtrl.u1IgnoreTPR          %x\n",      pvVMCB->ctrl.IntCtrl.n.u1IgnoreTPR));
    1584         Log(("ctrl.IntCtrl.u3Reserved           %x\n",      pvVMCB->ctrl.IntCtrl.n.u3Reserved));
    1585         Log(("ctrl.IntCtrl.u1VIrqMasking        %x\n",      pvVMCB->ctrl.IntCtrl.n.u1VIrqMasking));
    1586         Log(("ctrl.IntCtrl.u7Reserved2          %x\n",      pvVMCB->ctrl.IntCtrl.n.u7Reserved2));
    1587         Log(("ctrl.IntCtrl.u8VIrqVector         %x\n",      pvVMCB->ctrl.IntCtrl.n.u8VIrqVector));
    1588         Log(("ctrl.IntCtrl.u24Reserved          %x\n",      pvVMCB->ctrl.IntCtrl.n.u24Reserved));
    1589 
    1590         Log(("ctrl.u64IntShadow                 %RX64\n",   pvVMCB->ctrl.u64IntShadow));
    1591         Log(("ctrl.u64ExitCode                  %RX64\n",   pvVMCB->ctrl.u64ExitCode));
    1592         Log(("ctrl.u64ExitInfo1                 %RX64\n",   pvVMCB->ctrl.u64ExitInfo1));
    1593         Log(("ctrl.u64ExitInfo2                 %RX64\n",   pvVMCB->ctrl.u64ExitInfo2));
    1594         Log(("ctrl.ExitIntInfo.u8Vector         %x\n",      pvVMCB->ctrl.ExitIntInfo.n.u8Vector));
    1595         Log(("ctrl.ExitIntInfo.u3Type           %x\n",      pvVMCB->ctrl.ExitIntInfo.n.u3Type));
    1596         Log(("ctrl.ExitIntInfo.u1ErrorCodeValid %x\n",      pvVMCB->ctrl.ExitIntInfo.n.u1ErrorCodeValid));
    1597         Log(("ctrl.ExitIntInfo.u19Reserved      %x\n",      pvVMCB->ctrl.ExitIntInfo.n.u19Reserved));
    1598         Log(("ctrl.ExitIntInfo.u1Valid          %x\n",      pvVMCB->ctrl.ExitIntInfo.n.u1Valid));
    1599         Log(("ctrl.ExitIntInfo.u32ErrorCode     %x\n",      pvVMCB->ctrl.ExitIntInfo.n.u32ErrorCode));
    1600         Log(("ctrl.NestedPaging                 %RX64\n",   pvVMCB->ctrl.NestedPaging.au64));
    1601         Log(("ctrl.EventInject.u8Vector         %x\n",      pvVMCB->ctrl.EventInject.n.u8Vector));
    1602         Log(("ctrl.EventInject.u3Type           %x\n",      pvVMCB->ctrl.EventInject.n.u3Type));
    1603         Log(("ctrl.EventInject.u1ErrorCodeValid %x\n",      pvVMCB->ctrl.EventInject.n.u1ErrorCodeValid));
    1604         Log(("ctrl.EventInject.u19Reserved      %x\n",      pvVMCB->ctrl.EventInject.n.u19Reserved));
    1605         Log(("ctrl.EventInject.u1Valid          %x\n",      pvVMCB->ctrl.EventInject.n.u1Valid));
    1606         Log(("ctrl.EventInject.u32ErrorCode     %x\n",      pvVMCB->ctrl.EventInject.n.u32ErrorCode));
    1607 
    1608         Log(("ctrl.u64NestedPagingCR3           %RX64\n",   pvVMCB->ctrl.u64NestedPagingCR3));
    1609         Log(("ctrl.u64LBRVirt                   %RX64\n",   pvVMCB->ctrl.u64LBRVirt));
    1610 
    1611         Log(("guest.CS.u16Sel                   %04X\n",    pvVMCB->guest.CS.u16Sel));
    1612         Log(("guest.CS.u16Attr                  %04X\n",    pvVMCB->guest.CS.u16Attr));
    1613         Log(("guest.CS.u32Limit                 %X\n",      pvVMCB->guest.CS.u32Limit));
    1614         Log(("guest.CS.u64Base                  %RX64\n",   pvVMCB->guest.CS.u64Base));
    1615         Log(("guest.DS.u16Sel                   %04X\n",    pvVMCB->guest.DS.u16Sel));
    1616         Log(("guest.DS.u16Attr                  %04X\n",    pvVMCB->guest.DS.u16Attr));
    1617         Log(("guest.DS.u32Limit                 %X\n",      pvVMCB->guest.DS.u32Limit));
    1618         Log(("guest.DS.u64Base                  %RX64\n",   pvVMCB->guest.DS.u64Base));
    1619         Log(("guest.ES.u16Sel                   %04X\n",    pvVMCB->guest.ES.u16Sel));
    1620         Log(("guest.ES.u16Attr                  %04X\n",    pvVMCB->guest.ES.u16Attr));
    1621         Log(("guest.ES.u32Limit                 %X\n",      pvVMCB->guest.ES.u32Limit));
    1622         Log(("guest.ES.u64Base                  %RX64\n",   pvVMCB->guest.ES.u64Base));
    1623         Log(("guest.FS.u16Sel                   %04X\n",    pvVMCB->guest.FS.u16Sel));
    1624         Log(("guest.FS.u16Attr                  %04X\n",    pvVMCB->guest.FS.u16Attr));
    1625         Log(("guest.FS.u32Limit                 %X\n",      pvVMCB->guest.FS.u32Limit));
    1626         Log(("guest.FS.u64Base                  %RX64\n",   pvVMCB->guest.FS.u64Base));
    1627         Log(("guest.GS.u16Sel                   %04X\n",    pvVMCB->guest.GS.u16Sel));
    1628         Log(("guest.GS.u16Attr                  %04X\n",    pvVMCB->guest.GS.u16Attr));
    1629         Log(("guest.GS.u32Limit                 %X\n",      pvVMCB->guest.GS.u32Limit));
    1630         Log(("guest.GS.u64Base                  %RX64\n",   pvVMCB->guest.GS.u64Base));
    1631 
    1632         Log(("guest.GDTR.u32Limit               %X\n",      pvVMCB->guest.GDTR.u32Limit));
    1633         Log(("guest.GDTR.u64Base                %RX64\n",   pvVMCB->guest.GDTR.u64Base));
    1634 
    1635         Log(("guest.LDTR.u16Sel                 %04X\n",    pvVMCB->guest.LDTR.u16Sel));
    1636         Log(("guest.LDTR.u16Attr                %04X\n",    pvVMCB->guest.LDTR.u16Attr));
    1637         Log(("guest.LDTR.u32Limit               %X\n",      pvVMCB->guest.LDTR.u32Limit));
    1638         Log(("guest.LDTR.u64Base                %RX64\n",   pvVMCB->guest.LDTR.u64Base));
    1639 
    1640         Log(("guest.IDTR.u32Limit               %X\n",      pvVMCB->guest.IDTR.u32Limit));
    1641         Log(("guest.IDTR.u64Base                %RX64\n",   pvVMCB->guest.IDTR.u64Base));
    1642 
    1643         Log(("guest.TR.u16Sel                   %04X\n",    pvVMCB->guest.TR.u16Sel));
    1644         Log(("guest.TR.u16Attr                  %04X\n",    pvVMCB->guest.TR.u16Attr));
    1645         Log(("guest.TR.u32Limit                 %X\n",      pvVMCB->guest.TR.u32Limit));
    1646         Log(("guest.TR.u64Base                  %RX64\n",   pvVMCB->guest.TR.u64Base));
    1647 
    1648         Log(("guest.u8CPL                       %X\n",      pvVMCB->guest.u8CPL));
    1649         Log(("guest.u64CR0                      %RX64\n",   pvVMCB->guest.u64CR0));
    1650         Log(("guest.u64CR2                      %RX64\n",   pvVMCB->guest.u64CR2));
    1651         Log(("guest.u64CR3                      %RX64\n",   pvVMCB->guest.u64CR3));
    1652         Log(("guest.u64CR4                      %RX64\n",   pvVMCB->guest.u64CR4));
    1653         Log(("guest.u64DR6                      %RX64\n",   pvVMCB->guest.u64DR6));
    1654         Log(("guest.u64DR7                      %RX64\n",   pvVMCB->guest.u64DR7));
    1655 
    1656         Log(("guest.u64RIP                      %RX64\n",   pvVMCB->guest.u64RIP));
    1657         Log(("guest.u64RSP                      %RX64\n",   pvVMCB->guest.u64RSP));
    1658         Log(("guest.u64RAX                      %RX64\n",   pvVMCB->guest.u64RAX));
    1659         Log(("guest.u64RFlags                   %RX64\n",   pvVMCB->guest.u64RFlags));
    1660 
    1661         Log(("guest.u64SysEnterCS               %RX64\n",   pvVMCB->guest.u64SysEnterCS));
    1662         Log(("guest.u64SysEnterEIP              %RX64\n",   pvVMCB->guest.u64SysEnterEIP));
    1663         Log(("guest.u64SysEnterESP              %RX64\n",   pvVMCB->guest.u64SysEnterESP));
    1664 
    1665         Log(("guest.u64EFER                     %RX64\n",   pvVMCB->guest.u64EFER));
    1666         Log(("guest.u64STAR                     %RX64\n",   pvVMCB->guest.u64STAR));
    1667         Log(("guest.u64LSTAR                    %RX64\n",   pvVMCB->guest.u64LSTAR));
    1668         Log(("guest.u64CSTAR                    %RX64\n",   pvVMCB->guest.u64CSTAR));
    1669         Log(("guest.u64SFMASK                   %RX64\n",   pvVMCB->guest.u64SFMASK));
    1670         Log(("guest.u64KernelGSBase             %RX64\n",   pvVMCB->guest.u64KernelGSBase));
    1671         Log(("guest.u64GPAT                     %RX64\n",   pvVMCB->guest.u64GPAT));
    1672         Log(("guest.u64DBGCTL                   %RX64\n",   pvVMCB->guest.u64DBGCTL));
    1673         Log(("guest.u64BR_FROM                  %RX64\n",   pvVMCB->guest.u64BR_FROM));
    1674         Log(("guest.u64BR_TO                    %RX64\n",   pvVMCB->guest.u64BR_TO));
    1675         Log(("guest.u64LASTEXCPFROM             %RX64\n",   pvVMCB->guest.u64LASTEXCPFROM));
    1676         Log(("guest.u64LASTEXCPTO               %RX64\n",   pvVMCB->guest.u64LASTEXCPTO));
     1564        Log(("ctrl.u16InterceptRdCRx            %x\n",      pVmcb->ctrl.u16InterceptRdCRx));
     1565        Log(("ctrl.u16InterceptWrCRx            %x\n",      pVmcb->ctrl.u16InterceptWrCRx));
     1566        Log(("ctrl.u16InterceptRdDRx            %x\n",      pVmcb->ctrl.u16InterceptRdDRx));
     1567        Log(("ctrl.u16InterceptWrDRx            %x\n",      pVmcb->ctrl.u16InterceptWrDRx));
     1568        Log(("ctrl.u32InterceptException        %x\n",      pVmcb->ctrl.u32InterceptException));
     1569        Log(("ctrl.u32InterceptCtrl1            %x\n",      pVmcb->ctrl.u32InterceptCtrl1));
     1570        Log(("ctrl.u32InterceptCtrl2            %x\n",      pVmcb->ctrl.u32InterceptCtrl2));
     1571        Log(("ctrl.u64IOPMPhysAddr              %RX64\n",   pVmcb->ctrl.u64IOPMPhysAddr));
     1572        Log(("ctrl.u64MSRPMPhysAddr             %RX64\n",   pVmcb->ctrl.u64MSRPMPhysAddr));
     1573        Log(("ctrl.u64TSCOffset                 %RX64\n",   pVmcb->ctrl.u64TSCOffset));
     1574
     1575        Log(("ctrl.TLBCtrl.u32ASID              %x\n",      pVmcb->ctrl.TLBCtrl.n.u32ASID));
     1576        Log(("ctrl.TLBCtrl.u8TLBFlush           %x\n",      pVmcb->ctrl.TLBCtrl.n.u8TLBFlush));
     1577        Log(("ctrl.TLBCtrl.u24Reserved          %x\n",      pVmcb->ctrl.TLBCtrl.n.u24Reserved));
     1578
     1579        Log(("ctrl.IntCtrl.u8VTPR               %x\n",      pVmcb->ctrl.IntCtrl.n.u8VTPR));
     1580        Log(("ctrl.IntCtrl.u1VIrqValid          %x\n",      pVmcb->ctrl.IntCtrl.n.u1VIrqValid));
     1581        Log(("ctrl.IntCtrl.u7Reserved           %x\n",      pVmcb->ctrl.IntCtrl.n.u7Reserved));
     1582        Log(("ctrl.IntCtrl.u4VIrqPriority       %x\n",      pVmcb->ctrl.IntCtrl.n.u4VIrqPriority));
     1583        Log(("ctrl.IntCtrl.u1IgnoreTPR          %x\n",      pVmcb->ctrl.IntCtrl.n.u1IgnoreTPR));
     1584        Log(("ctrl.IntCtrl.u3Reserved           %x\n",      pVmcb->ctrl.IntCtrl.n.u3Reserved));
     1585        Log(("ctrl.IntCtrl.u1VIrqMasking        %x\n",      pVmcb->ctrl.IntCtrl.n.u1VIrqMasking));
     1586        Log(("ctrl.IntCtrl.u7Reserved2          %x\n",      pVmcb->ctrl.IntCtrl.n.u7Reserved2));
     1587        Log(("ctrl.IntCtrl.u8VIrqVector         %x\n",      pVmcb->ctrl.IntCtrl.n.u8VIrqVector));
     1588        Log(("ctrl.IntCtrl.u24Reserved          %x\n",      pVmcb->ctrl.IntCtrl.n.u24Reserved));
     1589
     1590        Log(("ctrl.u64IntShadow                 %RX64\n",   pVmcb->ctrl.u64IntShadow));
     1591        Log(("ctrl.u64ExitCode                  %RX64\n",   pVmcb->ctrl.u64ExitCode));
     1592        Log(("ctrl.u64ExitInfo1                 %RX64\n",   pVmcb->ctrl.u64ExitInfo1));
     1593        Log(("ctrl.u64ExitInfo2                 %RX64\n",   pVmcb->ctrl.u64ExitInfo2));
     1594        Log(("ctrl.ExitIntInfo.u8Vector         %x\n",      pVmcb->ctrl.ExitIntInfo.n.u8Vector));
     1595        Log(("ctrl.ExitIntInfo.u3Type           %x\n",      pVmcb->ctrl.ExitIntInfo.n.u3Type));
     1596        Log(("ctrl.ExitIntInfo.u1ErrorCodeValid %x\n",      pVmcb->ctrl.ExitIntInfo.n.u1ErrorCodeValid));
     1597        Log(("ctrl.ExitIntInfo.u19Reserved      %x\n",      pVmcb->ctrl.ExitIntInfo.n.u19Reserved));
     1598        Log(("ctrl.ExitIntInfo.u1Valid          %x\n",      pVmcb->ctrl.ExitIntInfo.n.u1Valid));
     1599        Log(("ctrl.ExitIntInfo.u32ErrorCode     %x\n",      pVmcb->ctrl.ExitIntInfo.n.u32ErrorCode));
     1600        Log(("ctrl.NestedPaging                 %RX64\n",   pVmcb->ctrl.NestedPaging.au64));
     1601        Log(("ctrl.EventInject.u8Vector         %x\n",      pVmcb->ctrl.EventInject.n.u8Vector));
     1602        Log(("ctrl.EventInject.u3Type           %x\n",      pVmcb->ctrl.EventInject.n.u3Type));
     1603        Log(("ctrl.EventInject.u1ErrorCodeValid %x\n",      pVmcb->ctrl.EventInject.n.u1ErrorCodeValid));
     1604        Log(("ctrl.EventInject.u19Reserved      %x\n",      pVmcb->ctrl.EventInject.n.u19Reserved));
     1605        Log(("ctrl.EventInject.u1Valid          %x\n",      pVmcb->ctrl.EventInject.n.u1Valid));
     1606        Log(("ctrl.EventInject.u32ErrorCode     %x\n",      pVmcb->ctrl.EventInject.n.u32ErrorCode));
     1607
     1608        Log(("ctrl.u64NestedPagingCR3           %RX64\n",   pVmcb->ctrl.u64NestedPagingCR3));
     1609        Log(("ctrl.u64LBRVirt                   %RX64\n",   pVmcb->ctrl.u64LBRVirt));
     1610
     1611        Log(("guest.CS.u16Sel                   %04X\n",    pVmcb->guest.CS.u16Sel));
     1612        Log(("guest.CS.u16Attr                  %04X\n",    pVmcb->guest.CS.u16Attr));
     1613        Log(("guest.CS.u32Limit                 %X\n",      pVmcb->guest.CS.u32Limit));
     1614        Log(("guest.CS.u64Base                  %RX64\n",   pVmcb->guest.CS.u64Base));
     1615        Log(("guest.DS.u16Sel                   %04X\n",    pVmcb->guest.DS.u16Sel));
     1616        Log(("guest.DS.u16Attr                  %04X\n",    pVmcb->guest.DS.u16Attr));
     1617        Log(("guest.DS.u32Limit                 %X\n",      pVmcb->guest.DS.u32Limit));
     1618        Log(("guest.DS.u64Base                  %RX64\n",   pVmcb->guest.DS.u64Base));
     1619        Log(("guest.ES.u16Sel                   %04X\n",    pVmcb->guest.ES.u16Sel));
     1620        Log(("guest.ES.u16Attr                  %04X\n",    pVmcb->guest.ES.u16Attr));
     1621        Log(("guest.ES.u32Limit                 %X\n",      pVmcb->guest.ES.u32Limit));
     1622        Log(("guest.ES.u64Base                  %RX64\n",   pVmcb->guest.ES.u64Base));
     1623        Log(("guest.FS.u16Sel                   %04X\n",    pVmcb->guest.FS.u16Sel));
     1624        Log(("guest.FS.u16Attr                  %04X\n",    pVmcb->guest.FS.u16Attr));
     1625        Log(("guest.FS.u32Limit                 %X\n",      pVmcb->guest.FS.u32Limit));
     1626        Log(("guest.FS.u64Base                  %RX64\n",   pVmcb->guest.FS.u64Base));
     1627        Log(("guest.GS.u16Sel                   %04X\n",    pVmcb->guest.GS.u16Sel));
     1628        Log(("guest.GS.u16Attr                  %04X\n",    pVmcb->guest.GS.u16Attr));
     1629        Log(("guest.GS.u32Limit                 %X\n",      pVmcb->guest.GS.u32Limit));
     1630        Log(("guest.GS.u64Base                  %RX64\n",   pVmcb->guest.GS.u64Base));
     1631
     1632        Log(("guest.GDTR.u32Limit               %X\n",      pVmcb->guest.GDTR.u32Limit));
     1633        Log(("guest.GDTR.u64Base                %RX64\n",   pVmcb->guest.GDTR.u64Base));
     1634
     1635        Log(("guest.LDTR.u16Sel                 %04X\n",    pVmcb->guest.LDTR.u16Sel));
     1636        Log(("guest.LDTR.u16Attr                %04X\n",    pVmcb->guest.LDTR.u16Attr));
     1637        Log(("guest.LDTR.u32Limit               %X\n",      pVmcb->guest.LDTR.u32Limit));
     1638        Log(("guest.LDTR.u64Base                %RX64\n",   pVmcb->guest.LDTR.u64Base));
     1639
     1640        Log(("guest.IDTR.u32Limit               %X\n",      pVmcb->guest.IDTR.u32Limit));
     1641        Log(("guest.IDTR.u64Base                %RX64\n",   pVmcb->guest.IDTR.u64Base));
     1642
     1643        Log(("guest.TR.u16Sel                   %04X\n",    pVmcb->guest.TR.u16Sel));
     1644        Log(("guest.TR.u16Attr                  %04X\n",    pVmcb->guest.TR.u16Attr));
     1645        Log(("guest.TR.u32Limit                 %X\n",      pVmcb->guest.TR.u32Limit));
     1646        Log(("guest.TR.u64Base                  %RX64\n",   pVmcb->guest.TR.u64Base));
     1647
     1648        Log(("guest.u8CPL                       %X\n",      pVmcb->guest.u8CPL));
     1649        Log(("guest.u64CR0                      %RX64\n",   pVmcb->guest.u64CR0));
     1650        Log(("guest.u64CR2                      %RX64\n",   pVmcb->guest.u64CR2));
     1651        Log(("guest.u64CR3                      %RX64\n",   pVmcb->guest.u64CR3));
     1652        Log(("guest.u64CR4                      %RX64\n",   pVmcb->guest.u64CR4));
     1653        Log(("guest.u64DR6                      %RX64\n",   pVmcb->guest.u64DR6));
     1654        Log(("guest.u64DR7                      %RX64\n",   pVmcb->guest.u64DR7));
     1655
     1656        Log(("guest.u64RIP                      %RX64\n",   pVmcb->guest.u64RIP));
     1657        Log(("guest.u64RSP                      %RX64\n",   pVmcb->guest.u64RSP));
     1658        Log(("guest.u64RAX                      %RX64\n",   pVmcb->guest.u64RAX));
     1659        Log(("guest.u64RFlags                   %RX64\n",   pVmcb->guest.u64RFlags));
     1660
     1661        Log(("guest.u64SysEnterCS               %RX64\n",   pVmcb->guest.u64SysEnterCS));
     1662        Log(("guest.u64SysEnterEIP              %RX64\n",   pVmcb->guest.u64SysEnterEIP));
     1663        Log(("guest.u64SysEnterESP              %RX64\n",   pVmcb->guest.u64SysEnterESP));
     1664
     1665        Log(("guest.u64EFER                     %RX64\n",   pVmcb->guest.u64EFER));
     1666        Log(("guest.u64STAR                     %RX64\n",   pVmcb->guest.u64STAR));
     1667        Log(("guest.u64LSTAR                    %RX64\n",   pVmcb->guest.u64LSTAR));
     1668        Log(("guest.u64CSTAR                    %RX64\n",   pVmcb->guest.u64CSTAR));
     1669        Log(("guest.u64SFMASK                   %RX64\n",   pVmcb->guest.u64SFMASK));
     1670        Log(("guest.u64KernelGSBase             %RX64\n",   pVmcb->guest.u64KernelGSBase));
     1671        Log(("guest.u64GPAT                     %RX64\n",   pVmcb->guest.u64GPAT));
     1672        Log(("guest.u64DBGCTL                   %RX64\n",   pVmcb->guest.u64DBGCTL));
     1673        Log(("guest.u64BR_FROM                  %RX64\n",   pVmcb->guest.u64BR_FROM));
     1674        Log(("guest.u64BR_TO                    %RX64\n",   pVmcb->guest.u64BR_TO));
     1675        Log(("guest.u64LASTEXCPFROM             %RX64\n",   pVmcb->guest.u64LASTEXCPFROM));
     1676        Log(("guest.u64LASTEXCPTO               %RX64\n",   pVmcb->guest.u64LASTEXCPTO));
    16771677#endif
    16781678        rc = VERR_SVM_UNABLE_TO_START_VM;
     
    16821682
    16831683    /* Let's first sync back EIP, ESP, and EFLAGS. */
    1684     pCtx->rip        = pvVMCB->guest.u64RIP;
    1685     pCtx->rsp        = pvVMCB->guest.u64RSP;
    1686     pCtx->eflags.u32 = pvVMCB->guest.u64RFlags;
     1684    pCtx->rip        = pVmcb->guest.u64RIP;
     1685    pCtx->rsp        = pVmcb->guest.u64RSP;
     1686    pCtx->eflags.u32 = pVmcb->guest.u64RFlags;
    16871687    /* eax is saved/restore across the vmrun instruction */
    1688     pCtx->rax        = pvVMCB->guest.u64RAX;
     1688    pCtx->rax        = pVmcb->guest.u64RAX;
    16891689
    16901690    /*
     
    16921692     * FS & GS base are saved with SVM_READ_SELREG.
    16931693     */
    1694     pCtx->msrSTAR         = pvVMCB->guest.u64STAR;            /* legacy syscall eip, cs & ss */
    1695     pCtx->msrLSTAR        = pvVMCB->guest.u64LSTAR;           /* 64-bit mode syscall rip */
    1696     pCtx->msrCSTAR        = pvVMCB->guest.u64CSTAR;           /* compatibility mode syscall rip */
    1697     pCtx->msrSFMASK       = pvVMCB->guest.u64SFMASK;          /* syscall flag mask */
    1698     pCtx->msrKERNELGSBASE = pvVMCB->guest.u64KernelGSBase;    /* swapgs exchange value */
    1699     pCtx->SysEnter.cs     = pvVMCB->guest.u64SysEnterCS;
    1700     pCtx->SysEnter.eip    = pvVMCB->guest.u64SysEnterEIP;
    1701     pCtx->SysEnter.esp    = pvVMCB->guest.u64SysEnterESP;
     1694    pCtx->msrSTAR         = pVmcb->guest.u64STAR;            /* legacy syscall eip, cs & ss */
     1695    pCtx->msrLSTAR        = pVmcb->guest.u64LSTAR;           /* 64-bit mode syscall rip */
     1696    pCtx->msrCSTAR        = pVmcb->guest.u64CSTAR;           /* compatibility mode syscall rip */
     1697    pCtx->msrSFMASK       = pVmcb->guest.u64SFMASK;          /* syscall flag mask */
     1698    pCtx->msrKERNELGSBASE = pVmcb->guest.u64KernelGSBase;    /* swapgs exchange value */
     1699    pCtx->SysEnter.cs     = pVmcb->guest.u64SysEnterCS;
     1700    pCtx->SysEnter.eip    = pVmcb->guest.u64SysEnterEIP;
     1701    pCtx->SysEnter.esp    = pVmcb->guest.u64SysEnterESP;
    17021702
    17031703    /* Can be updated behind our back in the nested paging case. */
    1704     pCtx->cr2        = pvVMCB->guest.u64CR2;
     1704    pCtx->cr2        = pVmcb->guest.u64CR2;
    17051705
    17061706    /* Guest CPU context: ES, CS, SS, DS, FS, GS. */
     
    17431743     * SS (chapter AMD spec. 15.5.1 Basic operation).
    17441744     */
    1745     Assert(!(pvVMCB->guest.u8CPL & ~0x3));
    1746     pCtx->ss.Attr.n.u2Dpl = pvVMCB->guest.u8CPL & 0x3;
     1745    Assert(!(pVmcb->guest.u8CPL & ~0x3));
     1746    pCtx->ss.Attr.n.u2Dpl = pVmcb->guest.u8CPL & 0x3;
    17471747
    17481748    /*
     
    17531753    SVM_READ_SELREG(TR, tr);
    17541754
    1755     pCtx->gdtr.cbGdt        = pvVMCB->guest.GDTR.u32Limit;
    1756     pCtx->gdtr.pGdt         = pvVMCB->guest.GDTR.u64Base;
    1757 
    1758     pCtx->idtr.cbIdt        = pvVMCB->guest.IDTR.u32Limit;
    1759     pCtx->idtr.pIdt         = pvVMCB->guest.IDTR.u64Base;
     1755    pCtx->gdtr.cbGdt        = pVmcb->guest.GDTR.u32Limit;
     1756    pCtx->gdtr.pGdt         = pVmcb->guest.GDTR.u64Base;
     1757
     1758    pCtx->idtr.cbIdt        = pVmcb->guest.IDTR.u32Limit;
     1759    pCtx->idtr.pIdt         = pVmcb->guest.IDTR.u64Base;
    17601760
    17611761    /*
     
    17641764     */
    17651765    if (   pVM->hm.s.fNestedPaging
    1766         && pCtx->cr3 != pvVMCB->guest.u64CR3)
    1767     {
    1768         CPUMSetGuestCR3(pVCpu, pvVMCB->guest.u64CR3);
    1769         PGMUpdateCR3(pVCpu, pvVMCB->guest.u64CR3);
     1766        && pCtx->cr3 != pVmcb->guest.u64CR3)
     1767    {
     1768        CPUMSetGuestCR3(pVCpu, pVmcb->guest.u64CR3);
     1769        PGMUpdateCR3(pVCpu, pVmcb->guest.u64CR3);
    17701770    }
    17711771
     
    17741774
    17751775    /* Take care of instruction fusing (sti, mov ss) (see AMD spec. 15.20.5 Interrupt Shadows) */
    1776     if (pvVMCB->ctrl.u64IntShadow & SVM_INTERRUPT_SHADOW_ACTIVE)
    1777     {
    1778         Log(("uInterruptState %x rip=%RGv\n", pvVMCB->ctrl.u64IntShadow, (RTGCPTR)pCtx->rip));
     1776    if (pVmcb->ctrl.u64IntShadow & SVM_INTERRUPT_SHADOW_ACTIVE)
     1777    {
     1778        Log(("uInterruptState %x rip=%RGv\n", pVmcb->ctrl.u64IntShadow, (RTGCPTR)pCtx->rip));
    17791779        EMSetInhibitInterruptsPC(pVCpu, pCtx->rip);
    17801780    }
     
    17851785
    17861786    /* Sync back DR6 as it could have been changed by hitting breakpoints. */
    1787     pCtx->dr[6] = pvVMCB->guest.u64DR6;
     1787    pCtx->dr[6] = pVmcb->guest.u64DR6;
    17881788    /* DR7.GD can be cleared by debug exceptions, so sync it back as well. */
    1789     pCtx->dr[7] = pvVMCB->guest.u64DR7;
     1789    pCtx->dr[7] = pVmcb->guest.u64DR7;
    17901790
    17911791    /* Check if an injected event was interrupted prematurely. */
    1792     pVCpu->hm.s.Event.u64IntrInfo = pvVMCB->ctrl.ExitIntInfo.au64[0];
    1793     if (    pvVMCB->ctrl.ExitIntInfo.n.u1Valid
     1792    pVCpu->hm.s.Event.u64IntrInfo = pVmcb->ctrl.ExitIntInfo.au64[0];
     1793    if (    pVmcb->ctrl.ExitIntInfo.n.u1Valid
    17941794            /* we don't care about 'int xx' as the instruction will be restarted. */
    1795         &&  pvVMCB->ctrl.ExitIntInfo.n.u3Type != SVM_EVENT_SOFTWARE_INT)
     1795        &&  pVmcb->ctrl.ExitIntInfo.n.u3Type != SVM_EVENT_SOFTWARE_INT)
    17961796    {
    17971797        Log(("Pending inject %RX64 at %RGv exit=%08x\n", pVCpu->hm.s.Event.u64IntrInfo, (RTGCPTR)pCtx->rip, exitCode));
    17981798
    17991799#ifdef LOG_ENABLED
    1800         SVM_EVENT Event;
     1800        SVMEVENT Event;
    18011801        Event.au64[0] = pVCpu->hm.s.Event.u64IntrInfo;
    18021802
     
    18101810        pVCpu->hm.s.Event.fPending = true;
    18111811        /* Error code present? (redundant) */
    1812         if (pvVMCB->ctrl.ExitIntInfo.n.u1ErrorCodeValid)
    1813             pVCpu->hm.s.Event.u32ErrCode  = pvVMCB->ctrl.ExitIntInfo.n.u32ErrorCode;
     1812        if (pVmcb->ctrl.ExitIntInfo.n.u1ErrorCodeValid)
     1813            pVCpu->hm.s.Event.u32ErrCode  = pVmcb->ctrl.ExitIntInfo.n.u32ErrorCode;
    18141814        else
    18151815            pVCpu->hm.s.Event.u32ErrCode  = 0;
     
    18361836        else
    18371837        {
    1838             if ((uint8_t)(u8LastTPR >> 4) != pvVMCB->ctrl.IntCtrl.n.u8VTPR)
     1838            if ((uint8_t)(u8LastTPR >> 4) != pVmcb->ctrl.IntCtrl.n.u8VTPR)
    18391839            {
    18401840                /* cr8 bits 3-0 correspond to bits 7-4 of the task priority mmio register. */
    1841                 rc2 = PDMApicSetTPR(pVCpu, pvVMCB->ctrl.IntCtrl.n.u8VTPR << 4);
     1841                rc2 = PDMApicSetTPR(pVCpu, pVmcb->ctrl.IntCtrl.n.u8VTPR << 4);
    18421842                AssertRC(rc2);
    18431843            }
     
    18481848    RTTraceBufAddMsgF(pVM->CTX_SUFF(hTraceBuf), "vmexit %08x at %04:%08RX64 %RX64 %RX64 %RX64",
    18491849                      exitCode, pCtx->cs.Sel, pCtx->rip,
    1850                       pvVMCB->ctrl.u64ExitInfo1, pvVMCB->ctrl.u64ExitInfo2, pvVMCB->ctrl.ExitIntInfo.au64[0]);
     1850                      pVmcb->ctrl.u64ExitInfo1, pVmcb->ctrl.u64ExitInfo2, pVmcb->ctrl.ExitIntInfo.au64[0]);
    18511851#endif
    18521852#if ARCH_BITS == 64 /* for the time being */
    1853     VBOXVMM_R0_HMSVM_VMEXIT(pVCpu, pCtx, exitCode, pvVMCB->ctrl.u64ExitInfo1, pvVMCB->ctrl.u64ExitInfo2,
    1854                             pvVMCB->ctrl.ExitIntInfo.au64[0], UINT64_MAX);
     1853    VBOXVMM_R0_HMSVM_VMEXIT(pVCpu, pCtx, exitCode, pVmcb->ctrl.u64ExitInfo1, pVmcb->ctrl.u64ExitInfo2,
     1854                            pVmcb->ctrl.ExitIntInfo.au64[0], UINT64_MAX);
    18551855#endif
    18561856    STAM_PROFILE_ADV_STOP_START(&pVCpu->hm.s.StatExit1, &pVCpu->hm.s.StatExit2, x);
     
    18691869    {
    18701870        /* Pending trap. */
    1871         SVM_EVENT   Event;
     1871        SVMEVENT   Event;
    18721872        uint32_t    vector = exitCode - SVM_EXIT_EXCEPTION_0;
    18731873
     
    19331933        case X86_XCPT_PF: /* Page fault */
    19341934        {
    1935             uint32_t    errCode        = pvVMCB->ctrl.u64ExitInfo1;     /* EXITINFO1 = error code */
    1936             RTGCUINTPTR uFaultAddress  = pvVMCB->ctrl.u64ExitInfo2;     /* EXITINFO2 = fault address */
     1935            uint32_t    errCode        = pVmcb->ctrl.u64ExitInfo1;     /* EXITINFO1 = error code */
     1936            RTGCUINTPTR uFaultAddress  = pVmcb->ctrl.u64ExitInfo2;     /* EXITINFO2 = fault address */
    19371937
    19381938#ifdef VBOX_ALWAYS_TRAP_PF
     
    20812081                    STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestGP);
    20822082                    Event.n.u1ErrorCodeValid    = 1;
    2083                     Event.n.u32ErrorCode        = pvVMCB->ctrl.u64ExitInfo1; /* EXITINFO1 = error code */
     2083                    Event.n.u32ErrorCode        = pVmcb->ctrl.u64ExitInfo1; /* EXITINFO1 = error code */
    20842084                    break;
    20852085                case X86_XCPT_BP:
     
    20952095                    STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestSS);
    20962096                    Event.n.u1ErrorCodeValid    = 1;
    2097                     Event.n.u32ErrorCode        = pvVMCB->ctrl.u64ExitInfo1; /* EXITINFO1 = error code */
     2097                    Event.n.u32ErrorCode        = pVmcb->ctrl.u64ExitInfo1; /* EXITINFO1 = error code */
    20982098                    break;
    20992099                case X86_XCPT_NP:
    21002100                    STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestNP);
    21012101                    Event.n.u1ErrorCodeValid    = 1;
    2102                     Event.n.u32ErrorCode        = pvVMCB->ctrl.u64ExitInfo1; /* EXITINFO1 = error code */
     2102                    Event.n.u32ErrorCode        = pVmcb->ctrl.u64ExitInfo1; /* EXITINFO1 = error code */
    21032103                    break;
    21042104            }
     
    21202120    {
    21212121        /* EXITINFO1 contains fault errorcode; EXITINFO2 contains the guest physical address causing the fault. */
    2122         uint32_t    errCode        = pvVMCB->ctrl.u64ExitInfo1;     /* EXITINFO1 = error code */
    2123         RTGCPHYS    GCPhysFault    = pvVMCB->ctrl.u64ExitInfo2;     /* EXITINFO2 = fault address */
     2122        uint32_t    errCode        = pVmcb->ctrl.u64ExitInfo1;     /* EXITINFO1 = error code */
     2123        RTGCPHYS    GCPhysFault    = pVmcb->ctrl.u64ExitInfo2;     /* EXITINFO2 = fault address */
    21242124        PGMMODE     enmShwPagingMode;
    21252125
     
    22202220        /* A virtual interrupt is about to be delivered, which means IF=1. */
    22212221        Log(("SVM_EXIT_VINTR IF=%d\n", pCtx->eflags.Bits.u1IF));
    2222         pvVMCB->ctrl.IntCtrl.n.u1VIrqValid    = 0;
    2223         pvVMCB->ctrl.IntCtrl.n.u8VIrqVector   = 0;
     2222        pVmcb->ctrl.IntCtrl.n.u1VIrqValid    = 0;
     2223        pVmcb->ctrl.IntCtrl.n.u8VIrqVector   = 0;
    22242224        goto ResumeExecution;
    22252225
     
    23892389
    23902390            /* Disable drx move intercepts. */
    2391             pvVMCB->ctrl.u16InterceptRdDRx = 0;
    2392             pvVMCB->ctrl.u16InterceptWrDRx = 0;
     2391            pVmcb->ctrl.u16InterceptRdDRx = 0;
     2392            pVmcb->ctrl.u16InterceptWrDRx = 0;
    23932393
    23942394            /* Save the host and load the guest debug state. */
     
    24242424
    24252425            /* Disable DRx move intercepts. */
    2426             pvVMCB->ctrl.u16InterceptRdDRx = 0;
    2427             pvVMCB->ctrl.u16InterceptWrDRx = 0;
     2426            pVmcb->ctrl.u16InterceptRdDRx = 0;
     2427            pVmcb->ctrl.u16InterceptWrDRx = 0;
    24282428
    24292429            /* Save the host and load the guest debug state. */
     
    24472447    case SVM_EXIT_IOIO:              /* I/O instruction. */
    24482448    {
    2449         SVM_IOIO_EXIT   IoExitInfo;
    2450 
    2451         IoExitInfo.au32[0] = pvVMCB->ctrl.u64ExitInfo1;
     2449        SVMIOIOEXIT   IoExitInfo;
     2450
     2451        IoExitInfo.au32[0] = pVmcb->ctrl.u64ExitInfo1;
    24522452        unsigned uIdx      = (IoExitInfo.au32[0] >> 4) & 0x7;
    24532453        uint32_t uIOSize   = g_aIOSize[uIdx];
     
    25002500                if (rc == VINF_IOM_R3_IOPORT_WRITE)
    25012501                {
    2502                     HMR0SavePendingIOPortWrite(pVCpu, pCtx->rip, pvVMCB->ctrl.u64ExitInfo2, IoExitInfo.n.u16Port,
     2502                    HMR0SavePendingIOPortWrite(pVCpu, pCtx->rip, pVmcb->ctrl.u64ExitInfo2, IoExitInfo.n.u16Port,
    25032503                                                   uAndVal, uIOSize);
    25042504                }
     
    25192519                else if (rc == VINF_IOM_R3_IOPORT_READ)
    25202520                {
    2521                     HMR0SavePendingIOPortRead(pVCpu, pCtx->rip, pvVMCB->ctrl.u64ExitInfo2, IoExitInfo.n.u16Port,
     2521                    HMR0SavePendingIOPortRead(pVCpu, pCtx->rip, pVmcb->ctrl.u64ExitInfo2, IoExitInfo.n.u16Port,
    25222522                                                  uAndVal, uIOSize);
    25232523                }
     
    25322532        {
    25332533            /* Update EIP and continue execution. */
    2534             pCtx->rip = pvVMCB->ctrl.u64ExitInfo2;      /* RIP/EIP of the next instruction is saved in EXITINFO2. */
     2534            pCtx->rip = pVmcb->ctrl.u64ExitInfo2;      /* RIP/EIP of the next instruction is saved in EXITINFO2. */
    25352535            if (RT_LIKELY(rc == VINF_SUCCESS))
    25362536            {
     
    25502550                            &&  (pCtx->dr[7] & X86_DR7_RW(i, X86_DR7_RW_IO)) == X86_DR7_RW(i, X86_DR7_RW_IO))
    25512551                        {
    2552                             SVM_EVENT Event;
     2552                            SVMEVENT Event;
    25532553
    25542554                            Assert(CPUMIsGuestDebugStateActive(pVCpu));
     
    25632563                             * by software after the contents have been read.
    25642564                             */
    2565                             pvVMCB->guest.u64DR6 = pCtx->dr[6];
     2565                            pVmcb->guest.u64DR6 = pCtx->dr[6];
    25662566
    25672567                            /* X86_DR7_GD will be cleared if drx accesses should be trapped inside the guest. */
     
    25732573                            pCtx->dr[7] |= 0x400;                                                   /* must be one */
    25742574
    2575                             pvVMCB->guest.u64DR7 = pCtx->dr[7];
     2575                            pVmcb->guest.u64DR7 = pCtx->dr[7];
    25762576
    25772577                            /* Inject the exception. */
     
    26762676    {
    26772677        /* Unsupported instructions. */
    2678         SVM_EVENT Event;
     2678        SVMEVENT Event;
    26792679
    26802680        Event.au64[0]    = 0;
     
    26942694        if (    pVM->hm.s.fTPRPatchingActive
    26952695            &&  pCtx->ecx == MSR_K8_LSTAR
    2696             &&  pvVMCB->ctrl.u64ExitInfo1 == 1 /* wrmsr */)
     2696            &&  pVmcb->ctrl.u64ExitInfo1 == 1 /* wrmsr */)
    26972697        {
    26982698            if ((pCtx->eax & 0xff) != u8LastTPR)
     
    27162716         * so we play safe by completely disassembling the instruction.
    27172717         */
    2718         STAM_COUNTER_INC((pvVMCB->ctrl.u64ExitInfo1 == 0) ? &pVCpu->hm.s.StatExitRdmsr : &pVCpu->hm.s.StatExitWrmsr);
    2719         Log(("SVM: %s\n", (pvVMCB->ctrl.u64ExitInfo1 == 0) ? "rdmsr" : "wrmsr"));
     2718        STAM_COUNTER_INC((pVmcb->ctrl.u64ExitInfo1 == 0) ? &pVCpu->hm.s.StatExitRdmsr : &pVCpu->hm.s.StatExitWrmsr);
     2719        Log(("SVM: %s\n", (pVmcb->ctrl.u64ExitInfo1 == 0) ? "rdmsr" : "wrmsr"));
    27202720        rc = EMInterpretInstruction(pVCpu, CPUMCTX2CORE(pCtx), 0);
    27212721        if (rc == VINF_SUCCESS)
     
    27252725            goto ResumeExecution;
    27262726        }
    2727         AssertMsg(rc == VERR_EM_INTERPRETER, ("EMU: %s failed with %Rrc\n", (pvVMCB->ctrl.u64ExitInfo1 == 0) ? "rdmsr" : "wrmsr",
     2727        AssertMsg(rc == VERR_EM_INTERPRETER, ("EMU: %s failed with %Rrc\n", (pVmcb->ctrl.u64ExitInfo1 == 0) ? "rdmsr" : "wrmsr",
    27282728                                              VBOXSTRICTRC_VAL(rc)));
    27292729        break;
     
    27312731
    27322732    case SVM_EXIT_TASK_SWITCH:          /* too complicated to emulate, so fall back to the recompiler */
    2733         Log(("SVM_EXIT_TASK_SWITCH: exit2=%RX64\n", pvVMCB->ctrl.u64ExitInfo2));
    2734         if (    !(pvVMCB->ctrl.u64ExitInfo2 & (SVM_EXIT2_TASK_SWITCH_IRET | SVM_EXIT2_TASK_SWITCH_JMP))
     2733        Log(("SVM_EXIT_TASK_SWITCH: exit2=%RX64\n", pVmcb->ctrl.u64ExitInfo2));
     2734        if (    !(pVmcb->ctrl.u64ExitInfo2 & (SVM_EXIT2_TASK_SWITCH_IRET | SVM_EXIT2_TASK_SWITCH_JMP))
    27352735            &&  pVCpu->hm.s.Event.fPending)
    27362736        {
    2737             SVM_EVENT Event;
     2737            SVMEVENT Event;
    27382738            Event.au64[0] = pVCpu->hm.s.Event.u64IntrInfo;
    27392739
     
    29352935VMMR0DECL(int) SVMR0Leave(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
    29362936{
    2937     SVM_VMCB *pvVMCB = (SVM_VMCB *)pVCpu->hm.s.svm.pvVMCB;
     2937    PSVMVMCB pVmcb = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
    29382938
    29392939    Assert(pVM->hm.s.svm.fSupported);
     
    29522952
    29532953        /* Intercept all DRx reads and writes again. Changed later on. */
    2954         pvVMCB->ctrl.u16InterceptRdDRx = 0xFFFF;
    2955         pvVMCB->ctrl.u16InterceptWrDRx = 0xFFFF;
     2954        pVmcb->ctrl.u16InterceptRdDRx = 0xFFFF;
     2955        pVmcb->ctrl.u16InterceptWrDRx = 0xFFFF;
    29562956
    29572957        /* Resync the debug registers the next time. */
     
    29592959    }
    29602960    else
    2961         Assert(pvVMCB->ctrl.u16InterceptRdDRx == 0xFFFF && pvVMCB->ctrl.u16InterceptWrDRx == 0xFFFF);
     2961        Assert(pVmcb->ctrl.u16InterceptRdDRx == 0xFFFF && pVmcb->ctrl.u16InterceptWrDRx == 0xFFFF);
    29622962
    29632963    return VINF_SUCCESS;
     
    30563056    if (!fFlushPending)
    30573057    {
    3058         SVM_VMCB   *pvVMCB;
     3058        PSVMVMCB pVmcb;
    30593059
    30603060        Log2(("SVMR0InvalidatePage %RGv\n", GCVirt));
     
    30623062        Assert(pVM->hm.s.svm.fSupported);
    30633063
    3064         pvVMCB = (SVM_VMCB *)pVCpu->hm.s.svm.pvVMCB;
    3065         AssertMsgReturn(pvVMCB, ("Invalid pvVMCB\n"), VERR_SVM_INVALID_PVMCB);
     3064        pVmcb = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
     3065        AssertMsgReturn(pVmcb, ("Invalid pVmcb\n"), VERR_SVM_INVALID_PVMCB);
    30663066
    30673067#if HC_ARCH_BITS == 32
     
    30723072#endif
    30733073        {
    3074             SVMR0InvlpgA(GCVirt, pvVMCB->ctrl.TLBCtrl.n.u32ASID);
     3074            SVMR0InvlpgA(GCVirt, pVmcb->ctrl.TLBCtrl.n.u32ASID);
    30753075            STAM_COUNTER_INC(&pVCpu->hm.s.StatFlushTlbInvlpgVirt);
    30763076        }
     
    31053105 *
    31063106 * @returns VBox status code.
    3107  * @param   HCPhysVMCBHost  Physical address of host VMCB.
    3108  * @param   HCPhysVMCB      Physical address of the VMCB.
     3107 * @param   HCPhysVmcbHost  Physical address of host VMCB.
     3108 * @param   HCPhysVmcb      Physical address of the VMCB.
    31093109 * @param   pCtx            Pointer to the guest CPU context.
    31103110 * @param   pVM             Pointer to the VM.
    31113111 * @param   pVCpu           Pointer to the VMCPU.
    31123112 */
    3113 DECLASM(int) SVMR0VMSwitcherRun64(RTHCPHYS HCPhysVMCBHost, RTHCPHYS HCPhysVMCB, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu)
     3113DECLASM(int) SVMR0VMSwitcherRun64(RTHCPHYS HCPhysVmcbHost, RTHCPHYS HCPhysVmcb, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu)
    31143114{
    31153115    uint32_t aParam[4];
    31163116
    3117     aParam[0] = (uint32_t)(HCPhysVMCBHost);                  /* Param 1: HCPhysVMCBHost - Lo. */
    3118     aParam[1] = (uint32_t)(HCPhysVMCBHost >> 32);            /* Param 1: HCPhysVMCBHost - Hi. */
    3119     aParam[2] = (uint32_t)(HCPhysVMCB);                      /* Param 2: HCPhysVMCB - Lo. */
    3120     aParam[3] = (uint32_t)(HCPhysVMCB >> 32);                /* Param 2: HCPhysVMCB - Hi. */
     3117    aParam[0] = (uint32_t)(HCPhysVmcbHost);                  /* Param 1: HCPhysVmcbHost - Lo. */
     3118    aParam[1] = (uint32_t)(HCPhysVmcbHost >> 32);            /* Param 1: HCPhysVmcbHost - Hi. */
     3119    aParam[2] = (uint32_t)(HCPhysVmcb);                      /* Param 2: HCPhysVmcb - Lo. */
     3120    aParam[3] = (uint32_t)(HCPhysVmcb >> 32);                /* Param 2: HCPhysVmcb - Hi. */
    31213121
    31223122    return SVMR0Execute64BitsHandler(pVM, pVCpu, pCtx, HM64ON32OP_SVMRCVMRun64, 4, &aParam[0]);
  • trunk/src/VBox/VMM/VMMR3/HM.cpp

    r46297 r46304  
    331331    AssertCompile(sizeof(pVM->hm.s) <= sizeof(pVM->hm.padding));
    332332
    333     /* Some structure checks. */
    334     AssertCompileMemberOffset(SVM_VMCB, ctrl.EventInject,    0xA8);
    335     AssertCompileMemberOffset(SVM_VMCB, ctrl.ExitIntInfo,    0x88);
    336     AssertCompileMemberOffset(SVM_VMCB, ctrl.TLBCtrl,        0x58);
    337 
    338     AssertCompileMemberOffset(SVM_VMCB, guest,              0x400);
    339     AssertCompileMemberOffset(SVM_VMCB, guest.TR,           0x490);
    340     AssertCompileMemberOffset(SVM_VMCB, guest.u8CPL,        0x4CB);
    341     AssertCompileMemberOffset(SVM_VMCB, guest.u64EFER,      0x4D0);
    342     AssertCompileMemberOffset(SVM_VMCB, guest.u64CR4,       0x548);
    343     AssertCompileMemberOffset(SVM_VMCB, guest.u64RIP,       0x578);
    344     AssertCompileMemberOffset(SVM_VMCB, guest.u64RSP,       0x5D8);
    345     AssertCompileMemberOffset(SVM_VMCB, guest.u64CR2,       0x640);
    346     AssertCompileMemberOffset(SVM_VMCB, guest.u64GPAT,      0x668);
    347     AssertCompileMemberOffset(SVM_VMCB, guest.u64LASTEXCPTO,0x690);
    348     AssertCompileSize(SVM_VMCB, 0x1000);
    349 
    350333    /*
    351334     * Register the saved state data unit.
  • trunk/src/VBox/VMM/include/HMInternal.h

    r46286 r46304  
    532532
    533533/** SVM VMRun function. */
    534 typedef DECLCALLBACK(int) FNHMSVMVMRUN(RTHCPHYS pVMCBHostPhys, RTHCPHYS pVMCBPhys, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu);
     534typedef DECLCALLBACK(int) FNHMSVMVMRUN(RTHCPHYS pVmcbHostPhys, RTHCPHYS pVmcbPhys, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu);
    535535/** Pointer to a SVM VMRun function. */
    536536typedef R0PTRTYPE(FNHMSVMVMRUN *) PFNHMSVMVMRUN;
     
    694694    {
    695695        /** R0 memory object for the host VM control block (VMCB). */
    696         RTR0MEMOBJ                  hMemObjVMCBHost;
     696        RTR0MEMOBJ                  hMemObjVmcbHost;
    697697        /** Physical address of the host VM control block (VMCB). */
    698         RTHCPHYS                    HCPhysVMCBHost;
     698        RTHCPHYS                    HCPhysVmcbHost;
    699699        /** Virtual address of the host VM control block (VMCB). */
    700         R0PTRTYPE(void *)           pvVMCBHost;
     700        R0PTRTYPE(void *)           pvVmcbHost;
    701701
    702702        /** R0 memory object for the VM control block (VMCB). */
    703         RTR0MEMOBJ                  hMemObjVMCB;
     703        RTR0MEMOBJ                  hMemObjVmcb;
    704704        /** Physical address of the VM control block (VMCB). */
    705         RTHCPHYS                    HCPhysVMCB;
     705        RTHCPHYS                    HCPhysVmcb;
    706706        /** Virtual address of the VM control block (VMCB). */
    707         R0PTRTYPE(void *)           pvVMCB;
     707        R0PTRTYPE(void *)           pvVmcb;
    708708
    709709        /** Ring 0 handlers for VT-x. */
     
    934934# ifdef VBOX_WITH_KERNEL_USING_XMM
    935935DECLASM(int) HMR0VMXStartVMWrapXMM(RTHCUINT fResume, PCPUMCTX pCtx, PVMCSCACHE pCache, PVM pVM, PVMCPU pVCpu, PFNHMVMXSTARTVM pfnStartVM);
    936 DECLASM(int) HMR0SVMRunWrapXMM(RTHCPHYS pVMCBHostPhys, RTHCPHYS pVMCBPhys, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu, PFNHMSVMVMRUN pfnVMRun);
     936DECLASM(int) HMR0SVMRunWrapXMM(RTHCPHYS pVmcbHostPhys, RTHCPHYS pVmcbPhys, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu, PFNHMSVMVMRUN pfnVMRun);
    937937# endif
    938938
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