VirtualBox

Changeset 9817 in vbox


Ignore:
Timestamp:
Jun 19, 2008 11:47:38 AM (16 years ago)
Author:
vboxsync
Message:

fs & gs base cleanup

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/cpum.h

    r9806 r9817  
    328328    uint64_t        msrCSTAR;       /* compatibility mode syscall rip */
    329329    uint64_t        msrSFMASK;      /* syscall flag mask */
    330     uint64_t        msrFSBASE;
    331     uint64_t        msrGSBASE;
    332330    uint64_t        msrKERNELGSBASE;/* swapgs exchange value */
    333331    /** @} */
     
    340338
    341339    /* padding to get 32byte aligned size */
    342     uint32_t        padding[2];
     340    uint32_t        padding[6];
    343341} CPUMCTX;
    344342#pragma pack()
     
    445443CPUMDECL(CPUMSELREGHID *) CPUMGetGuestTRHid(PVM pVM);
    446444CPUMDECL(uint64_t)  CPUMGetGuestEFER(PVM pVM);
    447 CPUMDECL(uint64_t)  CPUMGetGuestFSBASE(PVM pVM);
    448 CPUMDECL(uint64_t)  CPUMGetGuestGSBASE(PVM pVM);
    449445/** @} */
    450446
  • trunk/include/VBox/cpum.mac

    r9430 r9817  
    193193    .msrCSTAR           resb    8
    194194    .msrSFMASK          resb    8
    195     .msrFSBASE          resb    8
    196     .msrGSBASE          resb    8
    197195    .msrKERNELGSBASE    resb    8
    198196
     
    206204
    207205    ; padding
    208     .padding            resd    2
     206    .padding            resd    6
    209207endstruc
    210208
  • trunk/src/VBox/VMM/CPUM.cpp

    r9795 r9817  
    944944                "%sLSTAR        =%016RX64\n"
    945945                "%sSFMASK       =%016RX64\n"
    946                 "%sFSBASE       =%016RX64\n"
    947                 "%sGSBASE       =%016RX64\n"
    948946                "%sKERNELGSBASE =%016RX64\n",
    949947                pszPrefix, pCtx->msrEFER,
     
    953951                pszPrefix, pCtx->msrLSTAR,
    954952                pszPrefix, pCtx->msrSFMASK,
    955                 pszPrefix, pCtx->msrFSBASE,
    956                 pszPrefix, pCtx->msrGSBASE,
    957953                pszPrefix, pCtx->msrKERNELGSBASE);
    958954
  • trunk/src/VBox/VMM/CPUMInternal.mac

    r9430 r9817  
    264264    .Hyper.msrCSTAR           resb    8
    265265    .Hyper.msrSFMASK          resb    8
    266     .Hyper.msrFSBASE          resb    8
    267     .Hyper.msrGSBASE          resb    8
    268266    .Hyper.msrKERNELGSBASE    resb    8
    269267
     
    277275
    278276    ; padding
    279     .Hyper.padding            resd    2
     277    .Hyper.padding            resd    6
    280278
    281279
     
    378376    .Guest.msrCSTAR           resb    8
    379377    .Guest.msrSFMASK          resb    8
    380     .Guest.msrFSBASE          resb    8
    381     .Guest.msrGSBASE          resb    8
    382378    .Guest.msrKERNELGSBASE    resb    8
    383379
     
    391387
    392388    ; padding
    393     .Guest.padding            resd    2
     389    .Guest.padding            resd    6
    394390
    395391
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r9675 r9817  
    889889}
    890890
    891 CPUMDECL(uint64_t) CPUMGetGuestFSBASE(PVM pVM)
    892 {
    893     return pVM->cpum.s.Guest.msrFSBASE;
    894 }
    895 
    896 CPUMDECL(uint64_t) CPUMGetGuestGSBASE(PVM pVM)
    897 {
    898     return pVM->cpum.s.Guest.msrGSBASE;
    899 }
    900 
    901891/**
    902892 * Gets a CpuId leaf.
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r9750 r9817  
    22442244
    22452245    case MSR_K8_FS_BASE:
    2246         val = pCtx->msrFSBASE;
     2246        val = pCtx->fsHid.u64Base;
    22472247        break;
    22482248
    22492249    case MSR_K8_GS_BASE:
    2250         val = pCtx->msrGSBASE;
     2250        val = pCtx->gsHid.u64Base;
    22512251        break;
    22522252
     
    23732373
    23742374    case MSR_K8_FS_BASE:
    2375         pCtx->msrFSBASE = val;
     2375        pCtx->fsHid.u64Base = val;
    23762376        break;
    23772377
    23782378    case MSR_K8_GS_BASE:
    2379         pCtx->msrGSBASE = val;
     2379        pCtx->gsHid.u64Base = val;
    23802380        break;
    23812381
  • trunk/src/VBox/VMM/VMMAll/SELMAll.cpp

    r9710 r9817  
    120120        {
    121121        case DIS_SELREG_FS:
    122             return (RTGCPTR)(CPUMGetGuestFSBASE(pVM) + Addr);
    123 
    124122        case DIS_SELREG_GS:
    125             return (RTGCPTR)(CPUMGetGuestGSBASE(pVM) + Addr);
     123            return (RTGCPTR)(pHiddenSel->u64Base + Addr);
    126124
    127125        default:
     
    200198            {
    201199            case DIS_SELREG_FS:
    202                 pvFlat = (CPUMGetGuestFSBASE(pVM) + Addr);
    203                 break;
    204 
    205200            case DIS_SELREG_GS:
    206                 pvFlat = (CPUMGetGuestGSBASE(pVM) + Addr);
     201                pvFlat = (pHiddenSel->u64Base + Addr);
    207202                break;
    208203
  • trunk/src/VBox/VMM/VMMR0/HWACCMR0A.asm

    r9815 r9817  
    457457    LOADGUESTMSR MSR_K8_KERNEL_GS_BASE, CPUMCTX.msrKERNELGSBASE
    458458
    459     ; Load the guest MSRs for FS & GS base (saved in MYPUSHSEGS)
    460     mov     rcx, MSR_K8_FS_BASE
    461     mov     rax, qword [xSI + CPUMCTX.msrFSBASE]
    462     wrmsr
    463 
    464     mov     rcx, MSR_K8_GS_BASE
    465     mov     rax, qword [xSI + CPUMCTX.msrGSBASE]
    466     wrmsr
    467 
    468459    ; Save the pCtx pointer
    469460    push    xSI
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp

    r9814 r9817  
    969969        pVM->hwaccm.s.vmx.pfnStartVM  = VMXR0StartVM64;
    970970#endif
     971        /* Unconditionally update these as wrmsr might have changed them. */
     972        rc = VMXWriteVMCS(VMX_VMCS_GUEST_FS_BASE, pCtx->fsHid.u64Base);
     973        AssertRC(rc);
     974        rc = VMXWriteVMCS(VMX_VMCS_GUEST_GS_BASE, pCtx->gsHid.u64Base);
     975        AssertRC(rc);
    971976    }
    972977    else
  • trunk/src/recompiler/VBoxRecompiler.c

    r9802 r9817  
    18251825        cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_DS, pCtx->ds, pCtx->dsHid.u64Base, pCtx->dsHid.u32Limit, (pCtx->dsHid.Attr.u << 8) & 0xFFFFFF);
    18261826        cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_ES, pCtx->es, pCtx->esHid.u64Base, pCtx->esHid.u32Limit, (pCtx->esHid.Attr.u << 8) & 0xFFFFFF);
    1827 
    1828         /* FS & GS base addresses need to be loaded from the MSRs if in 64 bits mode. */
    1829         if (CPUMIsGuestIn64BitCodeEx(pCtx))
    1830         {
    1831             /* Note that the base values in the hidden fs & gs registers are cut to 32 bits and can't be used in this case. */
    1832             cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_FS, pCtx->fs, pCtx->msrFSBASE, pCtx->fsHid.u32Limit, (pCtx->fsHid.Attr.u << 8) & 0xFFFFFF);
    1833             cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_GS, pCtx->gs, pCtx->msrGSBASE, pCtx->gsHid.u32Limit, (pCtx->gsHid.Attr.u << 8) & 0xFFFFFF);
    1834         }
    1835         else
    1836         {
    1837             cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_FS, pCtx->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, (pCtx->fsHid.Attr.u << 8) & 0xFFFFFF);
    1838             cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_GS, pCtx->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, (pCtx->gsHid.Attr.u << 8) & 0xFFFFFF);
    1839         }
     1827        cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_FS, pCtx->fs, pCtx->fsHid.u64Base, pCtx->fsHid.u32Limit, (pCtx->fsHid.Attr.u << 8) & 0xFFFFFF);
     1828        cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_GS, pCtx->gs, pCtx->gsHid.u64Base, pCtx->gsHid.u32Limit, (pCtx->gsHid.Attr.u << 8) & 0xFFFFFF);
    18401829    }
    18411830    else
     
    22222211    pCtx->msrCSTAR         = pVM->rem.s.Env.cstar;
    22232212    pCtx->msrSFMASK        = pVM->rem.s.Env.fmask;
    2224     pCtx->msrFSBASE        = pVM->rem.s.Env.segs[R_FS].base;
    2225     pCtx->msrGSBASE        = pVM->rem.s.Env.segs[R_GS].base;
    22262213    pCtx->msrKERNELGSBASE  = pVM->rem.s.Env.kernelgsbase;
    22272214#endif
     
    24242411    pCtx->msrCSTAR         = pVM->rem.s.Env.cstar;
    24252412    pCtx->msrSFMASK        = pVM->rem.s.Env.fmask;
    2426     pCtx->msrFSBASE        = pVM->rem.s.Env.segs[R_FS].base;
    2427     pCtx->msrGSBASE        = pVM->rem.s.Env.segs[R_GS].base;
    24282413    pCtx->msrKERNELGSBASE  = pVM->rem.s.Env.kernelgsbase;
    24292414#endif
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