VirtualBox

Changeset 41906 in vbox for trunk/src/VBox/VMM/VMMR0


Ignore:
Timestamp:
Jun 24, 2012 3:44:03 PM (12 years ago)
Author:
vboxsync
Message:

CPUM: Combined the visible and hidden selector register data into one structure. Preparing for lazily resolving+caching of hidden registers in raw-mode.

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

Legend:

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

    r41836 r41906  
    19311931    {
    19321932        Log(("rax=%016RX64 rbx=%016RX64 rcx=%016RX64 rdx=%016RX64\n"
    1933             "rsi=%016RX64 rdi=%016RX64 r8 =%016RX64 r9 =%016RX64\n"
    1934             "r10=%016RX64 r11=%016RX64 r12=%016RX64 r13=%016RX64\n"
    1935             "r14=%016RX64 r15=%016RX64\n"
    1936             "rip=%016RX64 rsp=%016RX64 rbp=%016RX64 iopl=%d %*s\n"
    1937             "cs={%04x base=%016RX64 limit=%08x flags=%08x}\n"
    1938             "ds={%04x base=%016RX64 limit=%08x flags=%08x}\n"
    1939             "es={%04x base=%016RX64 limit=%08x flags=%08x}\n"
    1940             "fs={%04x base=%016RX64 limit=%08x flags=%08x}\n"
    1941             "gs={%04x base=%016RX64 limit=%08x flags=%08x}\n"
    1942             "ss={%04x base=%016RX64 limit=%08x flags=%08x}\n"
    1943             "cr0=%016RX64 cr2=%016RX64 cr3=%016RX64 cr4=%016RX64\n"
    1944             "dr0=%016RX64 dr1=%016RX64 dr2=%016RX64 dr3=%016RX64\n"
    1945             "dr4=%016RX64 dr5=%016RX64 dr6=%016RX64 dr7=%016RX64\n"
    1946             "gdtr=%016RX64:%04x  idtr=%016RX64:%04x  eflags=%08x\n"
    1947             "ldtr={%04x base=%08RX64 limit=%08x flags=%08x}\n"
    1948             "tr  ={%04x base=%08RX64 limit=%08x flags=%08x}\n"
    1949             "SysEnter={cs=%04llx eip=%08llx esp=%08llx}\n"
    1950             ,
    1951             pCtx->rax, pCtx->rbx, pCtx->rcx, pCtx->rdx, pCtx->rsi, pCtx->rdi,
    1952             pCtx->r8, pCtx->r9, pCtx->r10, pCtx->r11, pCtx->r12, pCtx->r13,
    1953             pCtx->r14, pCtx->r15,
    1954             pCtx->rip, pCtx->rsp, pCtx->rbp, X86_EFL_GET_IOPL(efl), 31, szEFlags,
    1955             (RTSEL)pCtx->cs, pCtx->csHid.u64Base, pCtx->csHid.u32Limit, pCtx->csHid.Attr.u,
    1956             (RTSEL)pCtx->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u,
    1957             (RTSEL)pCtx->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u,
    1958             (RTSEL)pCtx->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u,
    1959             (RTSEL)pCtx->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, pCtx->gsHid.Attr.u,
    1960             (RTSEL)pCtx->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u,
    1961             pCtx->cr0,  pCtx->cr2, pCtx->cr3,  pCtx->cr4,
    1962             pCtx->dr[0],  pCtx->dr[1], pCtx->dr[2],  pCtx->dr[3],
    1963             pCtx->dr[4],  pCtx->dr[5], pCtx->dr[6],  pCtx->dr[7],
    1964             pCtx->gdtr.pGdt, pCtx->gdtr.cbGdt, pCtx->idtr.pIdt, pCtx->idtr.cbIdt, efl,
    1965             (RTSEL)pCtx->ldtr, pCtx->ldtrHid.u64Base, pCtx->ldtrHid.u32Limit, pCtx->ldtrHid.Attr.u,
    1966             (RTSEL)pCtx->tr, pCtx->trHid.u64Base, pCtx->trHid.u32Limit, pCtx->trHid.Attr.u,
    1967             pCtx->SysEnter.cs, pCtx->SysEnter.eip, pCtx->SysEnter.esp));
     1933             "rsi=%016RX64 rdi=%016RX64 r8 =%016RX64 r9 =%016RX64\n"
     1934             "r10=%016RX64 r11=%016RX64 r12=%016RX64 r13=%016RX64\n"
     1935             "r14=%016RX64 r15=%016RX64\n"
     1936             "rip=%016RX64 rsp=%016RX64 rbp=%016RX64 iopl=%d %*s\n"
     1937             "cs={%04x base=%016RX64 limit=%08x flags=%08x}\n"
     1938             "ds={%04x base=%016RX64 limit=%08x flags=%08x}\n"
     1939             "es={%04x base=%016RX64 limit=%08x flags=%08x}\n"
     1940             "fs={%04x base=%016RX64 limit=%08x flags=%08x}\n"
     1941             "gs={%04x base=%016RX64 limit=%08x flags=%08x}\n"
     1942             "ss={%04x base=%016RX64 limit=%08x flags=%08x}\n"
     1943             "cr0=%016RX64 cr2=%016RX64 cr3=%016RX64 cr4=%016RX64\n"
     1944             "dr0=%016RX64 dr1=%016RX64 dr2=%016RX64 dr3=%016RX64\n"
     1945             "dr4=%016RX64 dr5=%016RX64 dr6=%016RX64 dr7=%016RX64\n"
     1946             "gdtr=%016RX64:%04x  idtr=%016RX64:%04x  eflags=%08x\n"
     1947             "ldtr={%04x base=%08RX64 limit=%08x flags=%08x}\n"
     1948             "tr  ={%04x base=%08RX64 limit=%08x flags=%08x}\n"
     1949             "SysEnter={cs=%04llx eip=%08llx esp=%08llx}\n"
     1950             ,
     1951             pCtx->rax, pCtx->rbx, pCtx->rcx, pCtx->rdx, pCtx->rsi, pCtx->rdi,
     1952             pCtx->r8, pCtx->r9, pCtx->r10, pCtx->r11, pCtx->r12, pCtx->r13,
     1953             pCtx->r14, pCtx->r15,
     1954             pCtx->rip, pCtx->rsp, pCtx->rbp, X86_EFL_GET_IOPL(efl), 31, szEFlags,
     1955             pCtx->cs.Sel, pCtx->cs.u64Base, pCtx->cs.u32Limit, pCtx->cs.Attr.u,
     1956             pCtx->ds.Sel, pCtx->ds.u64Base, pCtx->ds.u32Limit, pCtx->ds.Attr.u,
     1957             pCtx->es.Sel, pCtx->es.u64Base, pCtx->es.u32Limit, pCtx->es.Attr.u,
     1958             pCtx->fs.Sel, pCtx->fs.u64Base, pCtx->fs.u32Limit, pCtx->fs.Attr.u,
     1959             pCtx->gs.Sel, pCtx->gs.u64Base, pCtx->gs.u32Limit, pCtx->gs.Attr.u,
     1960             pCtx->ss.Sel, pCtx->ss.u64Base, pCtx->ss.u32Limit, pCtx->ss.Attr.u,
     1961             pCtx->cr0,  pCtx->cr2, pCtx->cr3,  pCtx->cr4,
     1962             pCtx->dr[0],  pCtx->dr[1], pCtx->dr[2],  pCtx->dr[3],
     1963             pCtx->dr[4],  pCtx->dr[5], pCtx->dr[6],  pCtx->dr[7],
     1964             pCtx->gdtr.pGdt, pCtx->gdtr.cbGdt, pCtx->idtr.pIdt, pCtx->idtr.cbIdt, efl,
     1965             pCtx->ldtr.Sel, pCtx->ldtr.u64Base, pCtx->ldtr.u32Limit, pCtx->ldtr.Attr.u,
     1966             pCtx->tr.Sel, pCtx->tr.u64Base, pCtx->tr.u32Limit, pCtx->tr.Attr.u,
     1967             pCtx->SysEnter.cs, pCtx->SysEnter.eip, pCtx->SysEnter.esp));
    19681968    }
    19691969    else
    19701970        Log(("eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\n"
    1971             "eip=%08x esp=%08x ebp=%08x iopl=%d %*s\n"
    1972             "cs={%04x base=%016RX64 limit=%08x flags=%08x} dr0=%08RX64 dr1=%08RX64\n"
    1973             "ds={%04x base=%016RX64 limit=%08x flags=%08x} dr2=%08RX64 dr3=%08RX64\n"
    1974             "es={%04x base=%016RX64 limit=%08x flags=%08x} dr4=%08RX64 dr5=%08RX64\n"
    1975             "fs={%04x base=%016RX64 limit=%08x flags=%08x} dr6=%08RX64 dr7=%08RX64\n"
    1976             "gs={%04x base=%016RX64 limit=%08x flags=%08x} cr0=%08RX64 cr2=%08RX64\n"
    1977             "ss={%04x base=%016RX64 limit=%08x flags=%08x} cr3=%08RX64 cr4=%08RX64\n"
    1978             "gdtr=%016RX64:%04x  idtr=%016RX64:%04x  eflags=%08x\n"
    1979             "ldtr={%04x base=%08RX64 limit=%08x flags=%08x}\n"
    1980             "tr  ={%04x base=%08RX64 limit=%08x flags=%08x}\n"
    1981             "SysEnter={cs=%04llx eip=%08llx esp=%08llx}\n"
    1982             ,
    1983             pCtx->eax, pCtx->ebx, pCtx->ecx, pCtx->edx, pCtx->esi, pCtx->edi,
    1984             pCtx->eip, pCtx->esp, pCtx->ebp, X86_EFL_GET_IOPL(efl), 31, szEFlags,
    1985             (RTSEL)pCtx->cs, pCtx->csHid.u64Base, pCtx->csHid.u32Limit, pCtx->csHid.Attr.u, pCtx->dr[0],  pCtx->dr[1],
    1986             (RTSEL)pCtx->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, pCtx->dsHid.Attr.u, pCtx->dr[2],  pCtx->dr[3],
    1987             (RTSEL)pCtx->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, pCtx->esHid.Attr.u, pCtx->dr[4],  pCtx->dr[5],
    1988             (RTSEL)pCtx->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, pCtx->fsHid.Attr.u, pCtx->dr[6],  pCtx->dr[7],
    1989             (RTSEL)pCtx->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, pCtx->gsHid.Attr.u, pCtx->cr0,  pCtx->cr2,
    1990             (RTSEL)pCtx->ss, pCtx->ssHid.u64Base, pCtx->ssHid.u32Limit, pCtx->ssHid.Attr.u, pCtx->cr3,  pCtx->cr4,
    1991             pCtx->gdtr.pGdt, pCtx->gdtr.cbGdt, pCtx->idtr.pIdt, pCtx->idtr.cbIdt, efl,
    1992             (RTSEL)pCtx->ldtr, pCtx->ldtrHid.u64Base, pCtx->ldtrHid.u32Limit, pCtx->ldtrHid.Attr.u,
    1993             (RTSEL)pCtx->tr, pCtx->trHid.u64Base, pCtx->trHid.u32Limit, pCtx->trHid.Attr.u,
    1994             pCtx->SysEnter.cs, pCtx->SysEnter.eip, pCtx->SysEnter.esp));
     1971             "eip=%08x esp=%08x ebp=%08x iopl=%d %*s\n"
     1972             "cs={%04x base=%016RX64 limit=%08x flags=%08x} dr0=%08RX64 dr1=%08RX64\n"
     1973             "ds={%04x base=%016RX64 limit=%08x flags=%08x} dr2=%08RX64 dr3=%08RX64\n"
     1974             "es={%04x base=%016RX64 limit=%08x flags=%08x} dr4=%08RX64 dr5=%08RX64\n"
     1975             "fs={%04x base=%016RX64 limit=%08x flags=%08x} dr6=%08RX64 dr7=%08RX64\n"
     1976             "gs={%04x base=%016RX64 limit=%08x flags=%08x} cr0=%08RX64 cr2=%08RX64\n"
     1977             "ss={%04x base=%016RX64 limit=%08x flags=%08x} cr3=%08RX64 cr4=%08RX64\n"
     1978             "gdtr=%016RX64:%04x  idtr=%016RX64:%04x  eflags=%08x\n"
     1979             "ldtr={%04x base=%08RX64 limit=%08x flags=%08x}\n"
     1980             "tr  ={%04x base=%08RX64 limit=%08x flags=%08x}\n"
     1981             "SysEnter={cs=%04llx eip=%08llx esp=%08llx}\n"
     1982             ,
     1983             pCtx->eax, pCtx->ebx, pCtx->ecx, pCtx->edx, pCtx->esi, pCtx->edi,
     1984             pCtx->eip, pCtx->esp, pCtx->ebp, X86_EFL_GET_IOPL(efl), 31, szEFlags,
     1985             pCtx->cs.Sel, pCtx->cs.u64Base, pCtx->cs.u32Limit, pCtx->cs.Attr.u, pCtx->dr[0],  pCtx->dr[1],
     1986             pCtx->ds.Sel, pCtx->ds.u64Base, pCtx->ds.u32Limit, pCtx->ds.Attr.u, pCtx->dr[2],  pCtx->dr[3],
     1987             pCtx->es.Sel, pCtx->es.u64Base, pCtx->es.u32Limit, pCtx->es.Attr.u, pCtx->dr[4],  pCtx->dr[5],
     1988             pCtx->fs.Sel, pCtx->fs.u64Base, pCtx->fs.u32Limit, pCtx->fs.Attr.u, pCtx->dr[6],  pCtx->dr[7],
     1989             pCtx->gs.Sel, pCtx->gs.u64Base, pCtx->gs.u32Limit, pCtx->gs.Attr.u, pCtx->cr0,  pCtx->cr2,
     1990             pCtx->ss.Sel, pCtx->ss.u64Base, pCtx->ss.u32Limit, pCtx->ss.Attr.u, pCtx->cr3,  pCtx->cr4,
     1991             pCtx->gdtr.pGdt, pCtx->gdtr.cbGdt, pCtx->idtr.pIdt, pCtx->idtr.cbIdt, efl,
     1992             pCtx->ldtr.Sel, pCtx->ldtr.u64Base, pCtx->ldtr.u32Limit, pCtx->ldtr.Attr.u,
     1993             pCtx->tr.Sel, pCtx->tr.u64Base, pCtx->tr.u32Limit, pCtx->tr.Attr.u,
     1994             pCtx->SysEnter.cs, pCtx->SysEnter.eip, pCtx->SysEnter.esp));
    19951995
    19961996    Log(("FPU:\n"
  • trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp

    r41823 r41906  
    923923
    924924    /* Set CPL */
    925     pVMCB->guest.u8CPL     = pCtx->ssHid.Attr.n.u2Dpl;
     925    pVMCB->guest.u8CPL     = pCtx->ss.Attr.n.u2Dpl;
    926926
    927927    /* RAX/EAX too, as VMRUN uses RAX as an implicit parameter. */
     
    946946#endif
    947947        /* Unconditionally update these as wrmsr might have changed them. (HWACCM_CHANGED_GUEST_SEGMENT_REGS will not be set) */
    948         pVMCB->guest.FS.u64Base    = pCtx->fsHid.u64Base;
    949         pVMCB->guest.GS.u64Base    = pCtx->gsHid.u64Base;
     948        pVMCB->guest.FS.u64Base    = pCtx->fs.u64Base;
     949        pVMCB->guest.GS.u64Base    = pCtx->gs.u64Base;
    950950    }
    951951    else
     
    16441644     * register (yet).
    16451645     */
    1646     if (   !pCtx->csHid.Attr.n.u1Granularity
    1647         &&  pCtx->csHid.Attr.n.u1Present
    1648         &&  pCtx->csHid.u32Limit > UINT32_C(0xfffff))
    1649     {
    1650         Assert((pCtx->csHid.u32Limit & 0xfff) == 0xfff);
    1651         pCtx->csHid.Attr.n.u1Granularity = 1;
     1646    if (   !pCtx->cs.Attr.n.u1Granularity
     1647        &&  pCtx->cs.Attr.n.u1Present
     1648        &&  pCtx->cs.u32Limit > UINT32_C(0xfffff))
     1649    {
     1650        Assert((pCtx->cs.u32Limit & 0xfff) == 0xfff);
     1651        pCtx->cs.Attr.n.u1Granularity = 1;
    16521652    }
    16531653#define SVM_ASSERT_SEL_GRANULARITY(reg) \
    1654         AssertMsg(   !pCtx->reg##Hid.Attr.n.u1Present \
    1655                   || (   pCtx->reg##Hid.Attr.n.u1Granularity \
    1656                       ? (pCtx->reg##Hid.u32Limit & 0xfff) == 0xfff \
    1657                       :  pCtx->reg##Hid.u32Limit <= 0xfffff), \
    1658                   ("%#x %#x %#llx\n", pCtx->reg##Hid.u32Limit, pCtx->reg##Hid.Attr.u, pCtx->reg##Hid.u64Base))
     1654        AssertMsg(   !pCtx->reg.Attr.n.u1Present \
     1655                  || (   pCtx->reg.Attr.n.u1Granularity \
     1656                      ? (pCtx->reg.u32Limit & 0xfff) == 0xfff \
     1657                      :  pCtx->reg.u32Limit <= 0xfffff), \
     1658                  ("%#x %#x %#llx\n", pCtx->reg.u32Limit, pCtx->reg.Attr.u, pCtx->reg.u64Base))
    16591659    SVM_ASSERT_SEL_GRANULARITY(ss);
    16601660    SVM_ASSERT_SEL_GRANULARITY(cs);
     
    16721672     */
    16731673    Assert(!(pVMCB->guest.u8CPL & ~0x3));
    1674     pCtx->ssHid.Attr.n.u2Dpl = pVMCB->guest.u8CPL & 0x3;
     1674    pCtx->ss.Attr.n.u2Dpl = pVMCB->guest.u8CPL & 0x3;
    16751675
    16761676    /*
     
    17751775#ifdef DBGFTRACE_ENABLED /** @todo DTrace */
    17761776    RTTraceBufAddMsgF(pVM->CTX_SUFF(hTraceBuf), "vmexit %08x at %04:%08RX64 %RX64 %RX64 %RX64",
    1777                       exitCode, pCtx->cs, pCtx->rip,
     1777                      exitCode, pCtx->cs.Sel, pCtx->rip,
    17781778                      pVMCB->ctrl.u64ExitInfo1, pVMCB->ctrl.u64ExitInfo2, pVMCB->ctrl.ExitIntInfo.au64[0]);
    17791779#endif
     
    18251825            }
    18261826            /* Return to ring 3 to deal with the debug exit code. */
    1827             Log(("Debugger hardware BP at %04x:%RGv (rc=%Rrc)\n", pCtx->cs, pCtx->rip, VBOXSTRICTRC_VAL(rc)));
     1827            Log(("Debugger hardware BP at %04x:%RGv (rc=%Rrc)\n", pCtx->cs.Sel, pCtx->rip, VBOXSTRICTRC_VAL(rc)));
    18281828            break;
    18291829        }
     
    20312031                    break;
    20322032            }
    2033             Log(("Trap %x at %04x:%RGv esi=%x\n", vector, pCtx->cs, (RTGCPTR)pCtx->rip, pCtx->esi));
     2033            Log(("Trap %x at %04x:%RGv esi=%x\n", vector, pCtx->cs.Sel, (RTGCPTR)pCtx->rip, pCtx->esi));
    20342034            hmR0SvmInjectEvent(pVCpu, pVMCB, pCtx, &Event);
    20352035            goto ResumeExecution;
     
    29712971     * Only allow 32 & 64 bit code.
    29722972     */
    2973     DISCPUMODE enmMode = SELMGetCpuModeFromSelector(pVCpu, pRegFrame->eflags, pRegFrame->cs, &pRegFrame->csHid);
     2973    DISCPUMODE enmMode = SELMGetCpuModeFromSelector(pVCpu, pRegFrame->eflags, pRegFrame->cs.Sel, &pRegFrame->cs);
    29742974    if (enmMode != DISCPUMODE_16BIT)
    29752975    {
  • trunk/src/VBox/VMM/VMMR0/HWSVMR0.h

    r41335 r41906  
    200200#define SVM_HIDSEGATTR_SVM2VMX(a)     (a & 0xFF) | ((a & 0x0F00) << 4)
    201201
    202 #define SVM_WRITE_SELREG(REG, reg)                                                 \
    203 {                                                                                  \
    204         pVMCB->guest.REG.u16Sel   = pCtx->reg;                                     \
    205         pVMCB->guest.REG.u32Limit = pCtx->reg##Hid.u32Limit;                       \
    206         pVMCB->guest.REG.u64Base  = pCtx->reg##Hid.u64Base;                        \
    207         pVMCB->guest.REG.u16Attr  = SVM_HIDSEGATTR_VMX2SVM(pCtx->reg##Hid.Attr.u); \
    208 }
    209 
    210 #define SVM_READ_SELREG(REG, reg)                                                    \
    211 {                                                                                    \
    212         pCtx->reg                = pVMCB->guest.REG.u16Sel;                          \
    213         pCtx->reg##Hid.u32Limit  = pVMCB->guest.REG.u32Limit;                        \
    214         pCtx->reg##Hid.u64Base   = pVMCB->guest.REG.u64Base;                         \
    215         pCtx->reg##Hid.Attr.u    = SVM_HIDSEGATTR_SVM2VMX(pVMCB->guest.REG.u16Attr); \
    216 }
     202#define SVM_WRITE_SELREG(REG, reg) \
     203    do \
     204    { \
     205        Assert(pCtx->reg.fFlags & CPUMSELREG_FLAGS_VALID); \
     206        Assert(pCtx->reg.ValidSel == pCtx->reg.Sel); \
     207        pVMCB->guest.REG.u16Sel     = pCtx->reg.Sel; \
     208        pVMCB->guest.REG.u32Limit   = pCtx->reg.u32Limit; \
     209        pVMCB->guest.REG.u64Base    = pCtx->reg.u64Base; \
     210        pVMCB->guest.REG.u16Attr    = SVM_HIDSEGATTR_VMX2SVM(pCtx->reg.Attr.u); \
     211    } while (0)
     212
     213#define SVM_READ_SELREG(REG, reg) \
     214    do \
     215    { \
     216        pCtx->reg.Sel       = pVMCB->guest.REG.u16Sel; \
     217        pCtx->reg.ValidSel  = pVMCB->guest.REG.u16Sel; \
     218        pCtx->reg.fFlags    = CPUMSELREG_FLAGS_VALID; \
     219        pCtx->reg.u32Limit  = pVMCB->guest.REG.u32Limit; \
     220        pCtx->reg.u64Base   = pVMCB->guest.REG.u64Base; \
     221        pCtx->reg.Attr.u    = SVM_HIDSEGATTR_SVM2VMX(pVMCB->guest.REG.u16Attr); \
     222    } while (0)
    217223
    218224#endif /* IN_RING0 */
     
    222228RT_C_DECLS_END
    223229
    224 #endif /* ___VMMR0_HWSVMR0_h */
    225 
     230#endif /* !___VMMR0_HWSVMR0_h */
     231
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp

    r41834 r41906  
    904904        /** @todo Check stack limit. */
    905905        pCtx->sp -= 2;
    906         LogFlow(("ss:sp %04X:%04X eflags=%x\n", pCtx->ss, pCtx->sp, pCtx->eflags.u));
    907         rc = PGMPhysSimpleWriteGCPhys(pVM, pCtx->ssHid.u64Base + pCtx->sp, &pCtx->eflags, sizeof(uint16_t)); AssertRC(rc);
     906        LogFlow(("ss:sp %04X:%04X eflags=%x\n", pCtx->ss.Sel, pCtx->sp, pCtx->eflags.u));
     907        rc = PGMPhysSimpleWriteGCPhys(pVM, pCtx->ss.u64Base + pCtx->sp, &pCtx->eflags, sizeof(uint16_t)); AssertRC(rc);
    908908        pCtx->sp -= 2;
    909         LogFlow(("ss:sp %04X:%04X cs=%x\n", pCtx->ss, pCtx->sp, pCtx->cs));
    910         rc = PGMPhysSimpleWriteGCPhys(pVM, pCtx->ssHid.u64Base + pCtx->sp, &pCtx->cs, sizeof(uint16_t)); AssertRC(rc);
     909        LogFlow(("ss:sp %04X:%04X cs=%x\n", pCtx->ss.Sel, pCtx->sp, pCtx->cs.Sel));
     910        rc = PGMPhysSimpleWriteGCPhys(pVM, pCtx->ss.u64Base + pCtx->sp, &pCtx->cs, sizeof(uint16_t)); AssertRC(rc);
    911911        pCtx->sp -= 2;
    912         LogFlow(("ss:sp %04X:%04X ip=%x\n", pCtx->ss, pCtx->sp, ip));
    913         rc = PGMPhysSimpleWriteGCPhys(pVM, pCtx->ssHid.u64Base + pCtx->sp, &ip, sizeof(ip)); AssertRC(rc);
     912        LogFlow(("ss:sp %04X:%04X ip=%x\n", pCtx->ss.Sel, pCtx->sp, ip));
     913        rc = PGMPhysSimpleWriteGCPhys(pVM, pCtx->ss.u64Base + pCtx->sp, &ip, sizeof(ip)); AssertRC(rc);
    914914
    915915        /*
     
    917917         */
    918918        pCtx->rip           = offset;
    919         pCtx->cs            = sel;
    920         pCtx->csHid.u64Base = sel << 4;
     919        pCtx->cs.Sel        = sel;
     920        pCtx->cs.u64Base    = sel << 4;
    921921        pCtx->eflags.u     &= ~(X86_EFL_IF | X86_EFL_TF | X86_EFL_RF | X86_EFL_AC);
    922922
     
    10091009                rc = PDMGetInterrupt(pVCpu, &u8Interrupt);
    10101010                Log(("CPU%d: Dispatch interrupt: u8Interrupt=%x (%d) rc=%Rrc cs:rip=%04X:%RGv\n", pVCpu->idCpu,
    1011                      u8Interrupt, u8Interrupt, rc, pCtx->cs, (RTGCPTR)pCtx->rip));
     1011                     u8Interrupt, u8Interrupt, rc, pCtx->cs.Sel, (RTGCPTR)pCtx->rip));
    10121012                if (RT_SUCCESS(rc))
    10131013                {
     
    16421642                     * DPL of all hidden selector registers must match the current CPL (0).
    16431643                     */
    1644                     pCtx->csHid.Attr.n.u2Dpl  = 0;
    1645                     pCtx->csHid.Attr.n.u4Type = X86_SEL_TYPE_CODE | X86_SEL_TYPE_RW_ACC;
    1646 
    1647                     pCtx->dsHid.Attr.n.u2Dpl  = 0;
    1648                     pCtx->esHid.Attr.n.u2Dpl  = 0;
    1649                     pCtx->fsHid.Attr.n.u2Dpl  = 0;
    1650                     pCtx->gsHid.Attr.n.u2Dpl  = 0;
    1651                     pCtx->ssHid.Attr.n.u2Dpl  = 0;
     1644                    pCtx->cs.Attr.n.u2Dpl  = 0;
     1645                    pCtx->cs.Attr.n.u4Type = X86_SEL_TYPE_CODE | X86_SEL_TYPE_RW_ACC;
     1646
     1647                    pCtx->ds.Attr.n.u2Dpl  = 0;
     1648                    pCtx->es.Attr.n.u2Dpl  = 0;
     1649                    pCtx->fs.Attr.n.u2Dpl  = 0;
     1650                    pCtx->gs.Attr.n.u2Dpl  = 0;
     1651                    pCtx->ss.Attr.n.u2Dpl  = 0;
    16521652                }
    16531653                pVCpu->hwaccm.s.vmx.enmLastSeenGuestMode = enmGuestMode;
    16541654            }
    16551655            else if (   CPUMIsGuestInRealModeEx(pCtx)
    1656                      && pCtx->csHid.u64Base == 0xffff0000)
     1656                     && pCtx->cs.u64Base == 0xffff0000)
    16571657            {
    16581658                /* VT-x will fail with a guest invalid state otherwise... (CPU state after a reset) */
    1659                 pCtx->csHid.u64Base = 0xf0000;
    1660                 pCtx->cs = 0xf000;
     1659                pCtx->cs.u64Base = 0xf0000;
     1660                pCtx->cs.Sel     = 0xf000;
    16611661            }
    16621662        }
     
    16861686    if (pVCpu->hwaccm.s.fContextUseFlags & HWACCM_CHANGED_GUEST_LDTR)
    16871687    {
    1688         if (pCtx->ldtr == 0)
     1688        if (pCtx->ldtr.Sel == 0)
    16891689        {
    16901690            rc =  VMXWriteVMCS(VMX_VMCS16_GUEST_FIELD_LDTR,         0);
     
    16961696        else
    16971697        {
    1698             rc =  VMXWriteVMCS(VMX_VMCS16_GUEST_FIELD_LDTR,         pCtx->ldtr);
    1699             rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_LDTR_LIMIT,         pCtx->ldtrHid.u32Limit);
    1700             rc |= VMXWriteVMCS64(VMX_VMCS64_GUEST_LDTR_BASE,        pCtx->ldtrHid.u64Base);
    1701             rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_LDTR_ACCESS_RIGHTS, pCtx->ldtrHid.Attr.u);
     1698            rc =  VMXWriteVMCS(VMX_VMCS16_GUEST_FIELD_LDTR,         pCtx->ldtr.Sel);
     1699            rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_LDTR_LIMIT,         pCtx->ldtr.u32Limit);
     1700            rc |= VMXWriteVMCS64(VMX_VMCS64_GUEST_LDTR_BASE,        pCtx->ldtr.u64Base);
     1701            rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_LDTR_ACCESS_RIGHTS, pCtx->ldtr.Attr.u);
    17021702        }
    17031703        AssertRC(rc);
     
    17351735        else
    17361736        {
    1737             rc =  VMXWriteVMCS(VMX_VMCS16_GUEST_FIELD_TR,         pCtx->tr);
    1738             rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_TR_LIMIT,         pCtx->trHid.u32Limit);
    1739             rc |= VMXWriteVMCS64(VMX_VMCS64_GUEST_TR_BASE,        pCtx->trHid.u64Base);
    1740 
    1741             val = pCtx->trHid.Attr.u;
     1737            rc =  VMXWriteVMCS(VMX_VMCS16_GUEST_FIELD_TR,         pCtx->tr.Sel);
     1738            rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_TR_LIMIT,         pCtx->tr.u32Limit);
     1739            rc |= VMXWriteVMCS64(VMX_VMCS64_GUEST_TR_BASE,        pCtx->tr.u64Base);
     1740
     1741            val = pCtx->tr.Attr.u;
    17421742
    17431743            /* The TSS selector must be busy (REM bugs? see defect #XXXX). */
     
    20762076        {
    20772077            /* Update these as wrmsr might have changed them. */
    2078             rc = VMXWriteVMCS64(VMX_VMCS64_GUEST_FS_BASE, pCtx->fsHid.u64Base);
     2078            rc = VMXWriteVMCS64(VMX_VMCS64_GUEST_FS_BASE, pCtx->fs.u64Base);
    20792079            AssertRC(rc);
    2080             rc = VMXWriteVMCS64(VMX_VMCS64_GUEST_GS_BASE, pCtx->gsHid.u64Base);
     2080            rc = VMXWriteVMCS64(VMX_VMCS64_GUEST_GS_BASE, pCtx->gs.u64Base);
    20812081            AssertRC(rc);
    20822082        }
     
    32153215#endif
    32163216
    3217     Log2(("E%d: New EIP=%x:%RGv\n", (uint32_t)exitReason, pCtx->cs, (RTGCPTR)pCtx->rip));
     3217    Log2(("E%d: New EIP=%x:%RGv\n", (uint32_t)exitReason, pCtx->cs.Sel, (RTGCPTR)pCtx->rip));
    32183218    Log2(("Exit reason %d, exitQualification %RGv\n", (uint32_t)exitReason, exitQualification));
    32193219    Log2(("instrInfo=%d instrError=%d instr length=%d\n", (uint32_t)instrInfo, (uint32_t)instrError, (uint32_t)cbInstr));
     
    32333233#ifdef DBGFTRACE_ENABLED /** @todo DTrace later. */
    32343234    RTTraceBufAddMsgF(pVM->CTX_SUFF(hTraceBuf), "vmexit %08x %016RX64 at %04:%08RX64 %RX64",
    3235                       exitReason, (uint64_t)exitQualification, pCtx->cs, pCtx->rip, (uint64_t)intInfo);
     3235                      exitReason, (uint64_t)exitQualification, pCtx->cs.Sel, pCtx->rip, (uint64_t)intInfo);
    32363236#endif
    32373237    STAM_PROFILE_ADV_STOP_START(&pVCpu->hwaccm.s.StatExit1, &pVCpu->hwaccm.s.StatExit2, x);
     
    34453445                    break;
    34463446                }
    3447                 Log(("Trap %x at %04X:%RGv\n", vector, pCtx->cs, (RTGCPTR)pCtx->rip));
     3447                Log(("Trap %x at %04X:%RGv\n", vector, pCtx->cs.Sel, (RTGCPTR)pCtx->rip));
    34483448                rc2 = hmR0VmxInjectEvent(pVM, pVCpu, pCtx, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(intInfo),
    34493449                                         cbInstr, errCode);
     
    35063506                }
    35073507                /* Return to ring 3 to deal with the debug exit code. */
    3508                 Log(("Debugger hardware BP at %04x:%RGv (rc=%Rrc)\n", pCtx->cs, pCtx->rip, VBOXSTRICTRC_VAL(rc)));
     3508                Log(("Debugger hardware BP at %04x:%RGv (rc=%Rrc)\n", pCtx->cs.Sel, pCtx->rip, VBOXSTRICTRC_VAL(rc)));
    35093509                break;
    35103510            }
     
    35163516                if (rc == VINF_EM_RAW_GUEST_TRAP)
    35173517                {
    3518                     Log(("Guest #BP at %04x:%RGv\n", pCtx->cs, pCtx->rip));
     3518                    Log(("Guest #BP at %04x:%RGv\n", pCtx->cs.Sel, pCtx->rip));
    35193519                    rc2 = hmR0VmxInjectEvent(pVM, pVCpu, pCtx, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(intInfo),
    35203520                                             cbInstr, errCode);
     
    35283528                    goto ResumeExecution;
    35293529                }
    3530                 Log(("Debugger BP at %04x:%RGv (rc=%Rrc)\n", pCtx->cs, pCtx->rip, VBOXSTRICTRC_VAL(rc)));
     3530                Log(("Debugger BP at %04x:%RGv (rc=%Rrc)\n", pCtx->cs.Sel, pCtx->rip, VBOXSTRICTRC_VAL(rc)));
    35313531                break;
    35323532            }
     
    35423542                    ||  !pVM->hwaccm.s.vmx.pRealModeTSS)
    35433543                {
    3544                     Log(("Trap %x at %04X:%RGv errorCode=%RGv\n", vector, pCtx->cs, (RTGCPTR)pCtx->rip, errCode));
     3544                    Log(("Trap %x at %04X:%RGv errorCode=%RGv\n", vector, pCtx->cs.Sel, (RTGCPTR)pCtx->rip, errCode));
    35453545                    rc2 = hmR0VmxInjectEvent(pVM, pVCpu, pCtx, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(intInfo),
    35463546                                             cbInstr, errCode);
     
    35523552                Assert(CPUMIsGuestInRealModeEx(pCtx));
    35533553
    3554                 LogFlow(("Real mode X86_XCPT_GP instruction emulation at %x:%RGv\n", pCtx->cs, (RTGCPTR)pCtx->rip));
     3554                LogFlow(("Real mode X86_XCPT_GP instruction emulation at %x:%RGv\n", pCtx->cs.Sel, (RTGCPTR)pCtx->rip));
    35553555
    35563556                rc2 = EMInterpretDisasOne(pVM, pVCpu, CPUMCTX2CORE(pCtx), pDis, &cbOp);
     
    36953695                        }
    36963696                        pCtx->ip            = aIretFrame[0];
    3697                         pCtx->cs            = aIretFrame[1];
    3698                         pCtx->csHid.u64Base = pCtx->cs << 4;
     3697                        pCtx->cs.Sel        = aIretFrame[1];
     3698                        pCtx->cs.ValidSel   = aIretFrame[1];
     3699                        pCtx->cs.u64Base    = (uint32_t)pCtx->cs.Sel << 4;
    36993700                        pCtx->eflags.u      =   (pCtx->eflags.u & ~(X86_EFL_POPF_BITS & uMask))
    37003701                                              | (aIretFrame[2] & X86_EFL_POPF_BITS & uMask);
    37013702                        pCtx->sp           += sizeof(aIretFrame);
    37023703
    3703                         LogFlow(("iret to %04x:%x\n", pCtx->cs, pCtx->ip));
     3704                        LogFlow(("iret to %04x:%x\n", pCtx->cs.Sel, pCtx->ip));
    37043705                        fUpdateRIP = false;
    37053706                        STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatExitIret);
     
    38133814                }
    38143815
    3815                 Log(("Trap %x at %04X:%RGv\n", vector, pCtx->cs, (RTGCPTR)pCtx->rip));
     3816                Log(("Trap %x at %04X:%RGv\n", vector, pCtx->cs.Sel, (RTGCPTR)pCtx->rip));
    38163817                rc2 = hmR0VmxInjectEvent(pVM, pVCpu, pCtx, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(intInfo),
    38173818                                         cbInstr, errCode);
     
    38273828                    &&  pVM->hwaccm.s.vmx.pRealModeTSS)
    38283829                {
    3829                     Log(("Real Mode Trap %x at %04x:%04X error code %x\n", vector, pCtx->cs, pCtx->eip, errCode));
     3830                    Log(("Real Mode Trap %x at %04x:%04X error code %x\n", vector, pCtx->cs.Sel, pCtx->eip, errCode));
    38303831                    rc = hmR0VmxInjectEvent(pVM, pVCpu, pCtx, VMX_VMCS_CTRL_ENTRY_IRQ_INFO_FROM_EXIT_INT_INFO(intInfo),
    38313832                                            cbInstr, errCode);
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.h

    r41330 r41906  
    217217
    218218# define VMX_WRITE_SELREG(REG, reg) \
    219 {                                                                                               \
    220         rc  = VMXWriteVMCS(VMX_VMCS16_GUEST_FIELD_##REG,      pCtx->reg);                       \
    221         rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_##REG##_LIMIT,    pCtx->reg##Hid.u32Limit);         \
    222         rc |= VMXWriteVMCS64(VMX_VMCS64_GUEST_##REG##_BASE,     pCtx->reg##Hid.u64Base);        \
     219    do \
     220    { \
     221        rc  = VMXWriteVMCS(VMX_VMCS16_GUEST_FIELD_##REG,        pCtx->reg.Sel);                 \
     222        rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_##REG##_LIMIT,      pCtx->reg.u32Limit);            \
     223        rc |= VMXWriteVMCS64(VMX_VMCS64_GUEST_##REG##_BASE,     pCtx->reg.u64Base);             \
    223224        if ((pCtx->eflags.u32 & X86_EFL_VM))                                                    \
    224225        {                                                                                       \
    225226            /* Must override this or else VT-x will fail with invalid guest state errors. */    \
    226227            /* DPL=3, present, code/data, r/w/accessed. */                                      \
    227             val = (pCtx->reg##Hid.Attr.u & ~0xFF) | 0xF3;                                       \
     228            val = (pCtx->reg.Attr.u & ~0xFF) | 0xF3;                                            \
    228229        }                                                                                       \
    229230        else                                                                                    \
     
    236237        }                                                                                       \
    237238        else                                                                                    \
    238         if (   (   pCtx->reg                                                                    \
     239        if (   (   pCtx->reg.Sel                                                                \
    239240                || !CPUMIsGuestInPagedProtectedModeEx(pCtx)                                     \
    240                 || (!pCtx->csHid.Attr.n.u1DefBig && !CPUMIsGuestIn64BitCodeEx(pCtx))            \
     241                || (!pCtx->cs.Attr.n.u1DefBig && !CPUMIsGuestIn64BitCodeEx(pCtx))               \
    241242                )                                                                               \
    242             && pCtx->reg##Hid.Attr.n.u1Present == 1)                                            \
     243            && pCtx->reg.Attr.n.u1Present == 1)                                                 \
    243244        {                                                                                       \
    244             val = pCtx->reg##Hid.Attr.u | X86_SEL_TYPE_ACCESSED;                                \
     245            val = pCtx->reg.Attr.u | X86_SEL_TYPE_ACCESSED;                                     \
    245246        }                                                                                       \
    246247        else                                                                                    \
     
    248249                                                                                                \
    249250        rc |= VMXWriteVMCS(VMX_VMCS32_GUEST_##REG##_ACCESS_RIGHTS, val);                        \
    250 }
     251    } while (0)
    251252
    252253# define VMX_READ_SELREG(REG, reg) \
    253 {                                                                          \
    254         VMXReadCachedVMCS(VMX_VMCS16_GUEST_FIELD_##REG,           &val);   \
    255         pCtx->reg                = val;                                    \
    256         VMXReadCachedVMCS(VMX_VMCS32_GUEST_##REG##_LIMIT,         &val);   \
    257         pCtx->reg##Hid.u32Limit    = val;                                  \
    258         VMXReadCachedVMCS(VMX_VMCS64_GUEST_##REG##_BASE,          &val);   \
    259         pCtx->reg##Hid.u64Base     = val;                                  \
    260         VMXReadCachedVMCS(VMX_VMCS32_GUEST_##REG##_ACCESS_RIGHTS, &val);   \
    261         pCtx->reg##Hid.Attr.u    = val;                                    \
    262 }
     254    do \
     255    { \
     256        VMXReadCachedVMCS(VMX_VMCS16_GUEST_FIELD_##REG,           &val); \
     257        pCtx->reg.Sel       = val; \
     258        pCtx->reg.ValidSel  = val; \
     259        pCtx->reg.fFlags    = CPUMSELREG_FLAGS_VALID; \
     260        VMXReadCachedVMCS(VMX_VMCS32_GUEST_##REG##_LIMIT,         &val); \
     261        pCtx->reg.u32Limit  = val; \
     262        VMXReadCachedVMCS(VMX_VMCS64_GUEST_##REG##_BASE,          &val); \
     263        pCtx->reg.u64Base   = val; \
     264        VMXReadCachedVMCS(VMX_VMCS32_GUEST_##REG##_ACCESS_RIGHTS, &val); \
     265        pCtx->reg.Attr.u    = val; \
     266    } while (0)
    263267
    264268/* Don't read from the cache in this macro; used only in case of failure where the cache is out of sync. */
    265269# define VMX_LOG_SELREG(REG, szSelReg, val) \
    266 {                                                                          \
    267         VMXReadVMCS(VMX_VMCS16_GUEST_FIELD_##REG,           &(val));       \
    268         Log(("%s Selector     %x\n", szSelReg, (val)));                    \
    269         VMXReadVMCS(VMX_VMCS32_GUEST_##REG##_LIMIT,         &(val));       \
    270         Log(("%s Limit        %x\n", szSelReg, (val)));                    \
    271         VMXReadVMCS(VMX_VMCS64_GUEST_##REG##_BASE,          &(val));       \
    272         Log(("%s Base         %RX64\n", szSelReg, (uint64_t)(val)));       \
    273         VMXReadVMCS(VMX_VMCS32_GUEST_##REG##_ACCESS_RIGHTS, &(val));       \
    274         Log(("%s Attributes   %x\n", szSelReg, (val)));                    \
    275 }
     270    do \
     271    { \
     272        VMXReadVMCS(VMX_VMCS16_GUEST_FIELD_##REG,           &(val)); \
     273        Log(("%s Selector     %x\n", szSelReg, (val))); \
     274        VMXReadVMCS(VMX_VMCS32_GUEST_##REG##_LIMIT,         &(val)); \
     275        Log(("%s Limit        %x\n", szSelReg, (val))); \
     276        VMXReadVMCS(VMX_VMCS64_GUEST_##REG##_BASE,          &(val)); \
     277        Log(("%s Base         %RX64\n", szSelReg, (uint64_t)(val))); \
     278        VMXReadVMCS(VMX_VMCS32_GUEST_##REG##_ACCESS_RIGHTS, &(val)); \
     279        Log(("%s Attributes   %x\n", szSelReg, (val))); \
     280    } while (0)
    276281
    277282/**
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