VirtualBox

Changeset 42407 in vbox for trunk/include/VBox/vmm


Ignore:
Timestamp:
Jul 26, 2012 11:41:35 AM (12 years ago)
Author:
vboxsync
Message:

VMM: Futher work on dealing with hidden segment register, esp. when going stale.

Location:
trunk/include/VBox/vmm
Files:
4 edited

Legend:

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

    r42186 r42407  
    191191VMMDECL(bool)       CPUMIsGuestInLongMode(PVMCPU pVCpu);
    192192VMMDECL(bool)       CPUMIsGuestInPAEMode(PVMCPU pVCpu);
     193VMM_INT_DECL(bool)  CPUMIsGuestInRawMode(PVMCPU pVCpu);
    193194
    194195#ifndef VBOX_WITHOUT_UNNAMED_UNIONS
     
    252253    if (!(pCtx->msrEFER & MSR_K6_EFER_LMA))
    253254        return false;
    254     if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(&pCtx->cs))
     255    if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(NULL, &pCtx->cs))
    255256        return CPUMIsGuestIn64BitCodeSlow(pCtx);
    256257    return pCtx->cs.Attr.n.u1Long;
  • trunk/include/VBox/vmm/cpumctx.h

    r42337 r42407  
    8181
    8282/** Checks if the hidden parts of the selector register are valid. */
    83 #define CPUMSELREG_ARE_HIDDEN_PARTS_VALID(a_pSelReg) (   ((a_pSelReg)->fFlags & CPUMSELREG_FLAGS_VALID) \
    84                                                       && (a_pSelReg)->ValidSel == (a_pSelReg)->Sel )
     83#ifdef VBOX_WITH_RAW_MODE_NOT_R0
     84# define CPUMSELREG_ARE_HIDDEN_PARTS_VALID(a_pVCpu, a_pSelReg) \
     85    (   ((a_pSelReg)->fFlags & CPUMSELREG_FLAGS_VALID) \
     86     && (   (a_pSelReg)->ValidSel == (a_pSelReg)->Sel \
     87         || (   (a_pVCpu) != NULL \
     88             && (a_pSelReg)->ValidSel == ((a_pSelReg)->Sel & X86_SEL_MASK_RPL) \
     89             && ((a_pSelReg)->Sel      & X86_SEL_RPL) == 1 \
     90             && ((a_pSelReg)->ValidSel & X86_SEL_RPL) == 0 \
     91             && CPUMIsGuestInRawMode(a_pVCpu) \
     92            ) \
     93        ) \
     94    )
     95#else
     96# define CPUMSELREG_ARE_HIDDEN_PARTS_VALID(a_pVCpu, a_pSelReg) \
     97    (   ((a_pSelReg)->fFlags & CPUMSELREG_FLAGS_VALID) \
     98     && (a_pSelReg)->ValidSel == (a_pSelReg)->Sel  )
     99#endif
    85100
    86101/** Old type used for the hidden register part.
  • trunk/include/VBox/vmm/selm.h

    r42186 r42407  
    44
    55/*
    6  * Copyright (C) 2006-2010 Oracle Corporation
     6 * Copyright (C) 2006-2012 Oracle Corporation
    77 *
    88 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3939 */
    4040
    41 VMMDECL(RTSEL)      SELMGetTrap8Selector(PVM pVM);
    42 VMMDECL(void)       SELMSetTrap8EIP(PVM pVM, uint32_t u32EIP);
    43 VMMDECL(int)        SELMGetRing1Stack(PVM pVM, uint32_t *pSS, PRTGCPTR32 pEsp);
    44 VMMDECL(RTGCPTR)    SELMGetGuestTSS(PVM pVM);
    45 VMMDECL(RTSEL)      SELMGetHyperCS(PVM pVM);
    46 VMMDECL(RTSEL)      SELMGetHyperCS64(PVM pVM);
    47 VMMDECL(RTSEL)      SELMGetHyperDS(PVM pVM);
    48 VMMDECL(RTSEL)      SELMGetHyperTSS(PVM pVM);
    49 VMMDECL(RTSEL)      SELMGetHyperTSSTrap08(PVM pVM);
    50 VMMDECL(RTRCPTR)    SELMGetHyperGDT(PVM pVM);
    51 VMMDECL(int)        SELMGetTSSInfo(PVM pVM, PVMCPU pVCpu, PRTGCUINTPTR pGCPtrTss, PRTGCUINTPTR pcbTss, bool *pfCanHaveIOBitmap);
    52 VMMDECL(RTGCPTR)    SELMToFlat(PVM pVM, DISSELREG SelReg, PCPUMCTXCORE pCtxCore, RTGCPTR Addr);
    53 VMMDECL(RTGCPTR)    SELMToFlatBySel(PVM pVM, RTSEL Sel, RTGCPTR Addr);
    54 VMMDECL(void)       SELMShadowCR3Changed(PVM pVM, PVMCPU pVCpu);
     41VMMDECL(RTSEL)          SELMGetTrap8Selector(PVM pVM);
     42VMMDECL(void)           SELMSetTrap8EIP(PVM pVM, uint32_t u32EIP);
     43VMMDECL(int)            SELMGetRing1Stack(PVM pVM, uint32_t *pSS, PRTGCPTR32 pEsp);
     44VMMDECL(RTGCPTR)        SELMGetGuestTSS(PVM pVM);
     45VMMDECL(RTSEL)          SELMGetHyperCS(PVM pVM);
     46VMMDECL(RTSEL)          SELMGetHyperCS64(PVM pVM);
     47VMMDECL(RTSEL)          SELMGetHyperDS(PVM pVM);
     48VMMDECL(RTSEL)          SELMGetHyperTSS(PVM pVM);
     49VMMDECL(RTSEL)          SELMGetHyperTSSTrap08(PVM pVM);
     50VMMDECL(RTRCPTR)        SELMGetHyperGDT(PVM pVM);
     51VMMDECL(int)            SELMGetTSSInfo(PVM pVM, PVMCPU pVCpu, PRTGCUINTPTR pGCPtrTss, PRTGCUINTPTR pcbTss, bool *pfCanHaveIOBitmap);
     52VMMDECL(RTGCPTR)        SELMToFlat(PVM pVM, DISSELREG SelReg, PCPUMCTXCORE pCtxCore, RTGCPTR Addr);
     53VMMDECL(RTGCPTR)        SELMToFlatBySel(PVM pVM, RTSEL Sel, RTGCPTR Addr);
     54VMMDECL(void)           SELMShadowCR3Changed(PVM pVM, PVMCPU pVCpu);
    5555
    5656/** Flags for SELMToFlatEx().
     
    7474/** @} */
    7575
    76 VMMDECL(int)        SELMToFlatEx(PVMCPU pVCpu, DISSELREG SelReg, PCPUMCTXCORE pCtxCore, RTGCPTR Addr, uint32_t fFlags,
    77                                  PRTGCPTR ppvGC);
    78 VMMDECL(int)        SELMToFlatBySelEx(PVMCPU pVCpu, X86EFLAGS eflags, RTSEL Sel, RTGCPTR Addr, uint32_t fFlags,
    79                                       PRTGCPTR ppvGC, uint32_t *pcb);
    80 VMMDECL(int)        SELMValidateAndConvertCSAddr(PVMCPU pVCpu, X86EFLAGS eflags, RTSEL SelCPL, RTSEL SelCS, PCPUMSELREG pSRegCS,
    81                                                  RTGCPTR Addr, PRTGCPTR ppvFlat);
    82 VMMDECL(int)        SELMGetLDTFromSel(PVM pVM, RTSEL SelLdt, PRTGCPTR ppvLdt, unsigned *pcbLimit);
     76VMMDECL(int)            SELMToFlatEx(PVMCPU pVCpu, DISSELREG SelReg, PCPUMCTXCORE pCtxCore, RTGCPTR Addr, uint32_t fFlags,
     77                                     PRTGCPTR ppvGC);
     78VMMDECL(int)            SELMToFlatBySelEx(PVMCPU pVCpu, X86EFLAGS eflags, RTSEL Sel, RTGCPTR Addr, uint32_t fFlags,
     79                                          PRTGCPTR ppvGC, uint32_t *pcb);
     80VMMDECL(int)            SELMValidateAndConvertCSAddr(PVMCPU pVCpu, X86EFLAGS eflags, RTSEL SelCPL, RTSEL SelCS,
     81                                                     PCPUMSELREG pSRegCS, RTGCPTR Addr, PRTGCPTR ppvFlat);
     82VMMDECL(int)            SELMGetLDTFromSel(PVM pVM, RTSEL SelLdt, PRTGCPTR ppvLdt, unsigned *pcbLimit);
    8383#ifdef VBOX_WITH_RAW_MODE
    84 VMM_INT_DECL(void)  SELMLoadHiddenSelectorReg(PVMCPU pVCpu, PCCPUMCTX pCtx, PCPUMSELREG pSReg);
     84VMM_INT_DECL(void)      SELMLoadHiddenSelectorReg(PVMCPU pVCpu, PCCPUMCTX pCtx, PCPUMSELREG pSReg);
    8585#endif
    8686
     
    9191 * @{
    9292 */
    93 VMMR3DECL(int)      SELMR3Init(PVM pVM);
    94 VMMR3DECL(int)      SELMR3InitFinalize(PVM pVM);
    95 VMMR3DECL(void)     SELMR3Relocate(PVM pVM);
    96 VMMR3DECL(int)      SELMR3Term(PVM pVM);
    97 VMMR3DECL(void)     SELMR3Reset(PVM pVM);
    98 VMMR3DECL(int)      SELMR3UpdateFromCPUM(PVM pVM, PVMCPU pVCpu);
    99 VMMR3DECL(int)      SELMR3SyncTSS(PVM pVM, PVMCPU pVCpu);
    100 VMMR3DECL(int)      SELMR3GetSelectorInfo(PVM pVM, PVMCPU pVCpu, RTSEL Sel, PDBGFSELINFO pSelInfo);
    101 VMMR3DECL(int)      SELMR3GetShadowSelectorInfo(PVM pVM, RTSEL Sel, PDBGFSELINFO pSelInfo);
    102 VMMR3DECL(void)     SELMR3DisableMonitoring(PVM pVM);
    103 VMMR3DECL(void)     SELMR3DumpDescriptor(X86DESC  Desc, RTSEL Sel, const char *pszMsg);
    104 VMMR3DECL(void)     SELMR3DumpHyperGDT(PVM pVM);
    105 VMMR3DECL(void)     SELMR3DumpHyperLDT(PVM pVM);
    106 VMMR3DECL(void)     SELMR3DumpGuestGDT(PVM pVM);
    107 VMMR3DECL(void)     SELMR3DumpGuestLDT(PVM pVM);
    108 VMMR3DECL(bool)     SELMR3CheckTSS(PVM pVM);
    109 VMMR3DECL(int)      SELMR3DebugCheck(PVM pVM);
     93VMMR3DECL(int)          SELMR3Init(PVM pVM);
     94VMMR3DECL(int)          SELMR3InitFinalize(PVM pVM);
     95VMMR3DECL(void)         SELMR3Relocate(PVM pVM);
     96VMMR3DECL(int)          SELMR3Term(PVM pVM);
     97VMMR3DECL(void)         SELMR3Reset(PVM pVM);
     98VMMR3DECL(VBOXSTRICTRC) SELMR3UpdateFromCPUM(PVM pVM, PVMCPU pVCpu);
     99VMMR3DECL(int)          SELMR3SyncTSS(PVM pVM, PVMCPU pVCpu);
     100VMMR3DECL(int)          SELMR3GetSelectorInfo(PVM pVM, PVMCPU pVCpu, RTSEL Sel, PDBGFSELINFO pSelInfo);
     101VMMR3DECL(int)          SELMR3GetShadowSelectorInfo(PVM pVM, RTSEL Sel, PDBGFSELINFO pSelInfo);
     102VMMR3DECL(void)         SELMR3DisableMonitoring(PVM pVM);
     103VMMR3DECL(void)         SELMR3DumpDescriptor(X86DESC  Desc, RTSEL Sel, const char *pszMsg);
     104VMMR3DECL(void)         SELMR3DumpHyperGDT(PVM pVM);
     105VMMR3DECL(void)         SELMR3DumpHyperLDT(PVM pVM);
     106VMMR3DECL(void)         SELMR3DumpGuestGDT(PVM pVM);
     107VMMR3DECL(void)         SELMR3DumpGuestLDT(PVM pVM);
     108VMMR3DECL(bool)         SELMR3CheckTSS(PVM pVM);
     109VMMR3DECL(int)          SELMR3DebugCheck(PVM pVM);
    110110/** @def SELMR3_DEBUG_CHECK
    111111 * Invokes SELMR3DebugCheck in stricts builds. */
  • trunk/include/VBox/vmm/vm.h

    r41976 r42407  
    496496 * @param   fFlag   The flag to check.
    497497 */
    498 #define VM_FF_ISSET(pVM, fFlag)             (((pVM)->fGlobalForcedActions & (fFlag)) == (fFlag))
     498#define VM_FF_IS_SET(pVM, fFlag)            (((pVM)->fGlobalForcedActions & (fFlag)) == (fFlag))
     499/** @deprecated  */
     500#define VM_FF_ISSET(pVM, fFlag)             VM_FF_IS_SET(pVM, fFlag)
    499501
    500502/** @def VMCPU_FF_ISSET
     
    504506 * @param   fFlag   The flag to check.
    505507 */
    506 #define VMCPU_FF_ISSET(pVCpu, fFlag)        (((pVCpu)->fLocalForcedActions & (fFlag)) == (fFlag))
     508#define VMCPU_FF_IS_SET(pVCpu, fFlag)       (((pVCpu)->fLocalForcedActions & (fFlag)) == (fFlag))
     509/** @deprecated  */
     510#define VMCPU_FF_ISSET(pVCpu, fFlag)        VMCPU_FF_IS_SET(pVCpu, fFlag)
    507511
    508512/** @def VM_FF_ISPENDING
     
    512516 * @param   fFlags  The flags to check for.
    513517 */
    514 #define VM_FF_ISPENDING(pVM, fFlags)        ((pVM)->fGlobalForcedActions & (fFlags))
     518#define VM_FF_IS_PENDING(pVM, fFlags)       ((pVM)->fGlobalForcedActions & (fFlags))
     519/** @deprecated  */
     520#define VM_FF_ISPENDING(pVM, fFlags)        VM_FF_IS_PENDING(pVM, fFlags)
    515521
    516522/** @def VM_FF_TESTANDCLEAR
     
    522528 * @param   iBit    Bit position to check and clear
    523529 */
    524 #define VM_FF_TESTANDCLEAR(pVM, iBit)        (ASMAtomicBitTestAndClear(&(pVM)->fGlobalForcedActions, iBit##_BIT))
     530#define VM_FF_TEST_AND_CLEAR(pVM, iBit)     (ASMAtomicBitTestAndClear(&(pVM)->fGlobalForcedActions, iBit##_BIT))
     531/** @deprecated  */
     532#define VM_FF_TESTANDCLEAR(pVM, iBit)       (ASMAtomicBitTestAndClear(&(pVM)->fGlobalForcedActions, iBit##_BIT))
    525533
    526534/** @def VMCPU_FF_TESTANDCLEAR
     
    532540 * @param   iBit    Bit position to check and clear
    533541 */
    534 #define VMCPU_FF_TESTANDCLEAR(pVCpu, iBit)    (ASMAtomicBitTestAndClear(&(pVCpu)->fLocalForcedActions, iBit##_BIT))
     542#define VMCPU_FF_TEST_AND_CLEAR(pVCpu, iBit) (ASMAtomicBitTestAndClear(&(pVCpu)->fLocalForcedActions, iBit##_BIT))
     543/** @deprecated  */
     544#define VMCPU_FF_TESTANDCLEAR(pVCpu, iBit)  (ASMAtomicBitTestAndClear(&(pVCpu)->fLocalForcedActions, iBit##_BIT))
    535545
    536546/** @def VMCPU_FF_ISPENDING
     
    540550 * @param   fFlags  The flags to check for.
    541551 */
    542 #define VMCPU_FF_ISPENDING(pVCpu, fFlags) ((pVCpu)->fLocalForcedActions & (fFlags))
     552#define VMCPU_FF_IS_PENDING(pVCpu, fFlags)  ((pVCpu)->fLocalForcedActions & (fFlags))
     553/** @deprecated  */
     554#define VMCPU_FF_ISPENDING(pVCpu, fFlags)   VMCPU_FF_IS_PENDING(pVCpu, fFlags)
    543555
    544556/** @def VM_FF_ISPENDING
     
    942954        struct SELM s;
    943955#endif
    944         uint8_t     padding[576];       /* multiple of 64 */
     956        uint8_t     padding[768];       /* multiple of 64 */
    945957    } selm;
    946958
     
    10661078
    10671079    /** Padding for aligning the cpu array on a page boundary. */
    1068     uint8_t         abAlignment2[734];
     1080    uint8_t         abAlignment2[542];
    10691081
    10701082    /* ---- end small stuff ---- */
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