VirtualBox

Changeset 22885 in vbox for trunk/include


Ignore:
Timestamp:
Sep 9, 2009 9:58:49 PM (15 years ago)
Author:
vboxsync
Message:

VMM: Realigned VM and VMCPU members for 64 byte cache lines. Made VMCPU and VM::aCpus page aligned for potentially increasing the TLB efficiency. (This is expected to burn on 64-bit hosts.)

Location:
trunk/include/VBox
Files:
2 edited

Legend:

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

    r22789 r22885  
    134134        struct PGMCPU       s;
    135135#endif
    136         char                padding[32*1024];   /* multiple of 64 */
     136        char                padding[28*1024];   /* multiple of 64 */
    137137    } pgm;
    138138
     
    143143        struct HWACCMCPU    s;
    144144#endif
    145         char                padding[6144];      /* multiple of 64 */
     145        char                padding[5248];      /* multiple of 64 */
    146146    } hwaccm;
    147147
     
    152152        struct EMCPU        s;
    153153#endif
    154         char                padding[2048];      /* multiple of 64 */
     154        char                padding[1280];      /* multiple of 64 */
    155155    } em;
    156156
     
    179179        struct VMMCPU       s;
    180180#endif
    181         char                padding[384];       /* multiple of 64 */
     181        char                padding[256];       /* multiple of 64 */
    182182    } vmm;
    183183
     
    210210    } dbgf;
    211211
     212    /** Align at page boundrary. */
     213    uint8_t                 abReserved[HC_ARCH_BITS == 32 ? 448 : 64];
    212214} VMCPU;
    213215
     
    716718     * @remark  Assume interrupts disabled.
    717719     */
    718     RTRCPTR             pfnVMMGCGuestToHostAsmGuestCtx/*(int32_t eax, CPUMCTXCORE Ctx)*/;
     720    RTRCPTR                     pfnVMMGCGuestToHostAsmGuestCtx/*(int32_t eax, CPUMCTXCORE Ctx)*/;
    719721
    720722    /**
     
    731733     * @remark  Assume interrupts disabled.
    732734     */
    733     RTRCPTR             pfnVMMGCGuestToHostAsmHyperCtx/*(int32_t eax, PCPUMCTXCORE ecx)*/;
     735    RTRCPTR                     pfnVMMGCGuestToHostAsmHyperCtx/*(int32_t eax, PCPUMCTXCORE ecx)*/;
    734736
    735737    /**
     
    743745     * @remark  Assume interrupts disabled.
    744746     */
    745     RTRCPTR             pfnVMMGCGuestToHostAsm/*(int32_t eax)*/;
     747    RTRCPTR                     pfnVMMGCGuestToHostAsm/*(int32_t eax)*/;
    746748    /** @} */
    747749
     
    749751    /** @name Various VM data owned by VM.
    750752     * @{ */
    751     RTTHREAD            uPadding1;
     753    RTTHREAD                    uPadding1;
    752754    /** The native handle of ThreadEMT. Getting the native handle
    753755     * is generally faster than getting the IPRT one (except on OS/2 :-). */
    754     RTNATIVETHREAD      uPadding2;
     756    RTNATIVETHREAD              uPadding2;
    755757    /** @} */
    756758
     
    759761     * @{ */
    760762    /** Raw ring-3 indicator.  */
    761     bool                fRawR3Enabled;
     763    bool                        fRawR3Enabled;
    762764    /** Raw ring-0 indicator. */
    763     bool                fRawR0Enabled;
     765    bool                        fRawR0Enabled;
    764766    /** PATM enabled flag.
    765767     * This is placed here for performance reasons. */
    766     bool                fPATMEnabled;
     768    bool                        fPATMEnabled;
    767769    /** CSAM enabled flag.
    768770     * This is placed here for performance reasons. */
    769     bool                fCSAMEnabled;
     771    bool                        fCSAMEnabled;
    770772    /** Hardware VM support is available and enabled.
    771773     * This is placed here for performance reasons. */
    772     bool                fHWACCMEnabled;
     774    bool                        fHWACCMEnabled;
    773775    /** Hardware VM support is required and non-optional.
    774776     * This is initialized together with the rest of the VM structure. */
    775     bool                fHwVirtExtForced;
     777    bool                        fHwVirtExtForced;
    776778    /** PARAV enabled flag. */
    777     bool                fPARAVEnabled;
     779    bool                        fPARAVEnabled;
    778780    /** @} */
    779781
     
    781783    /* padding to make gnuc put the StatQemuToGC where msc does. */
    782784#if HC_ARCH_BITS == 32
    783     uint32_t            padding0;
     785    uint32_t                    padding0;
    784786#endif
    785787
    786788    /** Profiling the total time from Qemu to GC. */
    787     STAMPROFILEADV      StatTotalQemuToGC;
     789    STAMPROFILEADV              StatTotalQemuToGC;
    788790    /** Profiling the total time from GC to Qemu. */
    789     STAMPROFILEADV      StatTotalGCToQemu;
     791    STAMPROFILEADV              StatTotalGCToQemu;
    790792    /** Profiling the total time spent in GC. */
    791     STAMPROFILEADV      StatTotalInGC;
     793    STAMPROFILEADV              StatTotalInGC;
    792794    /** Profiling the total time spent not in Qemu. */
    793     STAMPROFILEADV      StatTotalInQemu;
     795    STAMPROFILEADV              StatTotalInQemu;
    794796    /** Profiling the VMMSwitcher code for going to GC. */
    795     STAMPROFILEADV      StatSwitcherToGC;
     797    STAMPROFILEADV              StatSwitcherToGC;
    796798    /** Profiling the VMMSwitcher code for going to HC. */
    797     STAMPROFILEADV      StatSwitcherToHC;
    798     STAMPROFILEADV      StatSwitcherSaveRegs;
    799     STAMPROFILEADV      StatSwitcherSysEnter;
    800     STAMPROFILEADV      StatSwitcherDebug;
    801     STAMPROFILEADV      StatSwitcherCR0;
    802     STAMPROFILEADV      StatSwitcherCR4;
    803     STAMPROFILEADV      StatSwitcherJmpCR3;
    804     STAMPROFILEADV      StatSwitcherRstrRegs;
    805     STAMPROFILEADV      StatSwitcherLgdt;
    806     STAMPROFILEADV      StatSwitcherLidt;
    807     STAMPROFILEADV      StatSwitcherLldt;
    808     STAMPROFILEADV      StatSwitcherTSS;
     799    STAMPROFILEADV              StatSwitcherToHC;
     800    STAMPROFILEADV              StatSwitcherSaveRegs;
     801    STAMPROFILEADV              StatSwitcherSysEnter;
     802    STAMPROFILEADV              StatSwitcherDebug;
     803    STAMPROFILEADV              StatSwitcherCR0;
     804    STAMPROFILEADV              StatSwitcherCR4;
     805    STAMPROFILEADV              StatSwitcherJmpCR3;
     806    STAMPROFILEADV              StatSwitcherRstrRegs;
     807    STAMPROFILEADV              StatSwitcherLgdt;
     808    STAMPROFILEADV              StatSwitcherLidt;
     809    STAMPROFILEADV              StatSwitcherLldt;
     810    STAMPROFILEADV              StatSwitcherTSS;
    809811
    810812/** @todo Realign everything on 64 byte boundaries to better match the
    811813 *        cache-line size. */
    812814    /* padding - the unions must be aligned on 32 bytes boundraries. */
    813     uint32_t            padding[HC_ARCH_BITS == 32 ? 4+8 : 6];
     815    uint32_t                padding[HC_ARCH_BITS == 32 ? 4+8 : 6];
    814816
    815817    /** CPUM part. */
     
    819821        struct CPUM s;
    820822#endif
    821         char        padding[2048];        /* multiple of 32 */
     823        uint8_t     padding[1472];      /* multiple of 64 */
    822824    } cpum;
    823825
     
    828830        struct VMM  s;
    829831#endif
    830         char        padding[1600];       /* multiple of 32 */
     832        uint8_t     padding[1536];      /* multiple of 64 */
    831833    } vmm;
    832834
     
    837839        struct PGM  s;
    838840#endif
    839         char        padding[16*1024];   /* multiple of 32 */
     841        uint8_t     padding[5184];      /* multiple of 64 */
    840842    } pgm;
    841843
     
    846848        struct HWACCM s;
    847849#endif
    848         char        padding[8192];       /* multiple of 32 */
     850        uint8_t     padding[5376];      /* multiple of 64 */
    849851    } hwaccm;
    850852
     
    855857        struct TRPM s;
    856858#endif
    857         char        padding[5344];      /* multiple of 32 */
     859        uint8_t     padding[5184];      /* multiple of 64 */
    858860    } trpm;
    859861
     
    864866        struct SELM s;
    865867#endif
    866         char        padding[544];      /* multiple of 32 */
     868        uint8_t     padding[576];       /* multiple of 64 */
    867869    } selm;
    868870
     
    873875        struct MM   s;
    874876#endif
    875         char        padding[192];       /* multiple of 32 */
     877        uint8_t     padding[192];       /* multiple of 64 */
    876878    } mm;
    877 
    878     /** CFGM part. */
    879     union
    880     {
    881 #ifdef ___CFGMInternal_h
    882         struct CFGM s;
    883 #endif
    884         char        padding[32];        /* multiple of 32 */
    885     } cfgm;
    886879
    887880    /** PDM part. */
     
    891884        struct PDM s;
    892885#endif
    893         char        padding[1824];      /* multiple of 32 */
     886        uint8_t     padding[1024];      /* multiple of 64 */
    894887    } pdm;
    895888
     
    900893        struct IOM s;
    901894#endif
    902         char        padding[4544];      /* multiple of 32 */
     895        uint8_t     padding[768];       /* multiple of 64 */
    903896    } iom;
    904897
     
    909902        struct PATM s;
    910903#endif
    911         char        padding[768];       /* multiple of 32 */
     904        uint8_t     padding[768];       /* multiple of 64 */
    912905    } patm;
    913906
     
    918911        struct CSAM s;
    919912#endif
    920         char        padding[3328];    /* multiple of 32 */
     913        uint8_t     padding[1024];      /* multiple of 64 */
    921914    } csam;
    922 
    923     /** PARAV part. */
    924     union
    925     {
    926 #ifdef ___PARAVInternal_h
    927         struct PARAV s;
    928 #endif
    929         char        padding[128];
    930     } parav;
    931915
    932916    /** EM part. */
     
    936920        struct EM   s;
    937921#endif
    938         char        padding[256];         /* multiple of 32 */
     922        uint8_t     padding[256];       /* multiple of 64 */
    939923    } em;
    940924
     
    945929        struct TM   s;
    946930#endif
    947         char        padding[2112];      /* multiple of 32 */
     931        uint8_t     padding[2112];      /* multiple of 64 */
    948932    } tm;
    949933
     
    954938        struct DBGF s;
    955939#endif
    956         char        padding[2368];      /* multiple of 32 */
     940        uint8_t     padding[2368];      /* multiple of 64 */
    957941    } dbgf;
    958942
     
    963947        struct SSM  s;
    964948#endif
    965         char        padding[32];        /* multiple of 32 */
     949        uint8_t     padding[64];        /* multiple of 64 */
    966950    } ssm;
    967 
    968     /** VM part. */
    969     union
    970     {
    971 #ifdef ___VMInternal_h
    972         struct VMINT    s;
    973 #endif
    974         char        padding[768];       /* multiple of 32 */
    975     } vm;
    976951
    977952    /** REM part. */
     
    985960 * Must be multiple of 32 and coherent with REM_ENV_SIZE from REMInternal.h. */
    986961# define VM_REM_SIZE        0x11100
    987         char        padding[VM_REM_SIZE];   /* multiple of 32 */
     962        uint8_t     padding[VM_REM_SIZE];   /* multiple of 32 */
    988963    } rem;
    989964
     965    /* ---- begin small stuff ---- */
     966
     967    /** VM part. */
     968    union
     969    {
     970#ifdef ___VMInternal_h
     971        struct VMINT    s;
     972#endif
     973        uint8_t     padding[24];        /* multiple of 8 */
     974    } vm;
     975
     976    /** PARAV part. */
     977    union
     978    {
     979#ifdef ___PARAVInternal_h
     980        struct PARAV s;
     981#endif
     982        uint8_t     padding[24];        /* multiple of 8 */
     983    } parav;
     984
     985    /** CFGM part. */
     986    union
     987    {
     988#ifdef ___CFGMInternal_h
     989        struct CFGM s;
     990#endif
     991        uint8_t     padding[8];         /* multiple of 8 */
     992    } cfgm;
     993
    990994    /** Padding for aligning the cpu array on a 64 byte boundrary. */
    991     uint32_t    u32Reserved2[8];
     995    uint8_t         abReserved2[8 + (HC_ARCH_BITS == 32 ? 3712 : 0)];
     996
     997    /* ---- end small stuff ---- */
    992998
    993999    /** VMCPU array for the configured number of virtual CPUs.
    994      * Must be aligned on a 64-byte boundrary.  */
    995     VMCPU       aCpus[1];
     1000     * Must be aligned on a page boundrary for TLB hit reasons as well as
     1001     * alignment of VMCPU members. */
     1002    VMCPU           aCpus[1];
    9961003} VM;
    9971004
  • trunk/include/VBox/vm.mac

    r22042 r22885  
    9797
    9898    alignb 64
    99     .cpum                   resb 2048
    100     .vmm                    resb 1024
     99    .cpum                   resb 1472
     100    .vmm                    resb 1536
    101101
    102102endstruc
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