VirtualBox

Changeset 17035 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Feb 23, 2009 10:26:39 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
43248
Message:

VMM,REM: Brushed up the TR/TSS shadowing. We're now relying on the hidden TR registers in SELM and CPUM/REM will make sure these are always in sync. Joined CPUMGetGuestTRHid and CPUMGetGuestTR. Kicked out sync_tr (unused now) and SELMGCGetRing1Stack.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r16859 r17035  
    520520{
    521521    PCPUMCPU pCpumCpu = cpumGetCpumCpu(pVM);
     522    AssertMsgFailed(("Need to load the hidden bits too!\n"));
    522523
    523524    pCpumCpu->Guest.tr  = tr;
     
    888889
    889890
    890 VMMDECL(RTSEL) CPUMGetGuestTR(PVM pVM)
    891 {
    892     PCPUMCPU pCpumCpu = cpumGetCpumCpu(pVM);
    893 
     891VMMDECL(RTSEL) CPUMGetGuestTR(PVM pVM, PCPUMSELREGHID pHidden)
     892{
     893    PCPUMCPU pCpumCpu = cpumGetCpumCpu(pVM);
     894    if (pHidden)
     895        *pHidden = pCpumCpu->Guest.trHid;
    894896    return pCpumCpu->Guest.tr;
    895897}
     
    10771079
    10781080    return pCpumCpu->Guest.eflags.u32;
    1079 }
    1080 
    1081 
    1082 VMMDECL(CPUMSELREGHID *) CPUMGetGuestTRHid(PVM pVM)
    1083 {
    1084     PCPUMCPU pCpumCpu = cpumGetCpumCpu(pVM);
    1085 
    1086     return &pCpumCpu->Guest.trHid;
    10871081}
    10881082
  • trunk/src/VBox/VMM/VMMAll/SELMAll.cpp

    r13832 r17035  
    929929    /* Else compatibility or 32 bits mode. */
    930930    return (pHiddenSel->Attr.n.u1DefBig) ? CPUMODE_32BIT : CPUMODE_16BIT;
    931 
    932931}
    933932
     
    961960 *
    962961 * @param   pVM     VM Handle.
    963  * @param   ss      Ring1 SS register value.
     962 * @param   ss      Ring1 SS register value. Pass 0 if invalid.
    964963 * @param   esp     Ring1 ESP register value.
    965964 */
    966 VMMDECL(void) SELMSetRing1Stack(PVM pVM, uint32_t ss, RTGCPTR32 esp)
    967 {
     965void selmSetRing1Stack(PVM pVM, uint32_t ss, RTGCPTR32 esp)
     966{
     967    Assert((ss & 1) || esp == 0);
    968968    pVM->selm.s.Tss.ss1  = ss;
    969969    pVM->selm.s.Tss.esp1 = (uint32_t)esp;
     
    974974/**
    975975 * Gets ss:esp for ring1 in main Hypervisor's TSS.
     976 *
     977 * Returns SS=0 if the ring-1 stack isn't valid.
    976978 *
    977979 * @returns VBox status code.
     
    979981 * @param   pSS     Ring1 SS register value.
    980982 * @param   pEsp    Ring1 ESP register value.
    981  *
    982  * @todo Merge in the GC version of this, eliminating it - or move this to
    983  *       SELM.cpp, making it SELMR3GetRing1Stack.
    984983 */
    985984VMMDECL(int) SELMGetRing1Stack(PVM pVM, uint32_t *pSS, PRTGCPTR32 pEsp)
     
    10401039# endif
    10411040        /* Update our TSS structure for the guest's ring 1 stack */
    1042         SELMSetRing1Stack(pVM, tss.ss0 | 1, (RTGCPTR32)tss.esp0);
     1041        selmSetRing1Stack(pVM, tss.ss0 | 1, (RTGCPTR32)tss.esp0);
    10431042        pVM->selm.s.fSyncTSSRing0Stack = false;
    10441043    }
     
    11901189VMMDECL(int) SELMGetTSSInfo(PVM pVM, PRTGCUINTPTR pGCPtrTss, PRTGCUINTPTR pcbTss, bool *pfCanHaveIOBitmap)
    11911190{
    1192     if (!CPUMAreHiddenSelRegsValid(pVM))
    1193     {
    1194         /*
    1195          * Do we have a valid TSS?
    1196          */
    1197         if (    pVM->selm.s.GCSelTss == RTSEL_MAX
    1198             || !pVM->selm.s.fGuestTss32Bit)
    1199             return VERR_SELM_NO_TSS;
    1200 
    1201         /*
    1202          * Fill in return values.
    1203          */
    1204         *pGCPtrTss = (RTGCUINTPTR)pVM->selm.s.GCPtrGuestTss;
    1205         *pcbTss = pVM->selm.s.cbGuestTss;
    1206         if (pfCanHaveIOBitmap)
    1207             *pfCanHaveIOBitmap = pVM->selm.s.fGuestTss32Bit;
    1208     }
    1209     else
    1210     {
    1211         CPUMSELREGHID *pHiddenTRReg;
    1212 
    1213         pHiddenTRReg = CPUMGetGuestTRHid(pVM);
    1214 
    1215         *pGCPtrTss = pHiddenTRReg->u64Base;
    1216         *pcbTss    = pHiddenTRReg->u32Limit;
    1217 
    1218         if (pfCanHaveIOBitmap)
    1219             *pfCanHaveIOBitmap =  pHiddenTRReg->Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_AVAIL
    1220                                || pHiddenTRReg->Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_BUSY;
    1221     }
     1191    /*
     1192     * The TR hidden register is always valid.
     1193     */
     1194    CPUMSELREGHID trHid;
     1195    RTSEL tr = CPUMGetGuestTR(pVM, &trHid);
     1196    if (!(tr & X86_SEL_MASK))
     1197        return VERR_SELM_NO_TSS;
     1198
     1199    *pGCPtrTss = trHid.u64Base;
     1200    *pcbTss    = trHid.u32Limit + (trHid.u32Limit != UINT32_MAX); /* be careful. */
     1201    if (pfCanHaveIOBitmap)
     1202        *pfCanHaveIOBitmap = trHid.Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_AVAIL
     1203                          || trHid.Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_BUSY;
    12221204    return VINF_SUCCESS;
    12231205}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette