VirtualBox

Changeset 79202 in vbox for trunk/include


Ignore:
Timestamp:
Jun 18, 2019 9:13:29 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
131377
Message:

VMM: Nested VMX: bugref:9180 VMCS shadowing, work in progress.

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

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/include/VBox/vmm/hm_vmx.h

    r79195 r79202  
    466466/**
    467467 * EPT Page Directory Pointer Entry. Bit view.
     468 * In accordance with the VT-x spec.
     469 *
    468470 * @todo uint64_t isn't safe for bitfields (gcc pedantic warnings, and IIRC,
    469471 *       this did cause trouble with one compiler/version).
     
    497499/**
    498500 * EPT PML4E.
     501 * In accordance with the VT-x spec.
    499502 */
    500503typedef union EPTPML4E
     
    517520/**
    518521 * EPT PML4 Table.
     522 * In accordance with the VT-x spec.
    519523 */
    520524typedef struct EPTPML4
     
    530534/**
    531535 * EPT Page Directory Pointer Entry. Bit view.
     536 * In accordance with the VT-x spec.
    532537 */
    533538typedef struct EPTPDPTEBITS
     
    559564/**
    560565 * EPT Page Directory Pointer.
     566 * In accordance with the VT-x spec.
    561567 */
    562568typedef union EPTPDPTE
     
    579585/**
    580586 * EPT Page Directory Pointer Table.
     587 * In accordance with the VT-x spec.
    581588 */
    582589typedef struct EPTPDPT
     
    592599/**
    593600 * EPT Page Directory Table Entry. Bit view.
     601 * In accordance with the VT-x spec.
    594602 */
    595603typedef struct EPTPDEBITS
     
    623631/**
    624632 * EPT 2MB Page Directory Table Entry. Bit view.
     633 * In accordance with the VT-x spec.
    625634 */
    626635typedef struct EPTPDE2MBITS
     
    654663/**
    655664 * EPT Page Directory Table Entry.
     665 * In accordance with the VT-x spec.
    656666 */
    657667typedef union EPTPDE
     
    676686/**
    677687 * EPT Page Directory Table.
     688 * In accordance with the VT-x spec.
    678689 */
    679690typedef struct EPTPD
     
    689700/**
    690701 * EPT Page Table Entry. Bit view.
     702 * In accordance with the VT-x spec.
    691703 */
    692704typedef struct EPTPTEBITS
     
    725737/**
    726738 * EPT Page Table Entry.
     739 * In accordance with the VT-x spec.
    727740 */
    728741typedef union EPTPTE
     
    745758/**
    746759 * EPT Page Table.
     760 * In accordance with the VT-x spec.
    747761 */
    748762typedef struct EPTPT
     
    816830/**
    817831 * VMX VMCS revision identifier.
     832 * In accordance with the VT-x spec.
    818833 */
    819834typedef union
     
    837852/**
    838853 * VMX VM-exit instruction information.
     854 * In accordance with the VT-x spec.
    839855 */
    840856typedef union
     
    11261142/**
    11271143 * VMX controls MSR.
     1144 * In accordance with the VT-x spec.
    11281145 */
    11291146typedef union
     
    13511368
    13521369/** @name VM Instruction Errors.
     1370 * In accordance with the VT-x spec.
    13531371 * See Intel spec. "30.4 VM Instruction Error Numbers"
    13541372 * @{
     
    14131431
    14141432/** @name VMX abort reasons.
     1433 * In accordance with the VT-x spec.
    14151434 * See Intel spec. "27.7 VMX Aborts".
    14161435 * Update HMGetVmxAbortDesc() if new reasons are added. @{
     
    16931712
    16941713
    1695 /** @name VMCS field encoding: 16-bit control fields.
    1696  * @{
    1697  */
     1714/** @name VMCS fields and encoding.
     1715 *
     1716 *  When adding a new field:
     1717 *    - Always add it to g_aVmcsFields.
     1718 *    - Consider if it needs to be added to VMXVVMCS.
     1719 * @{
     1720 */
     1721/** 16-bit control fields.  */
    16981722#define VMX_VMCS16_VPID                                         0x0000
    16991723#define VMX_VMCS16_POSTED_INT_NOTIFY_VECTOR                     0x0002
    17001724#define VMX_VMCS16_EPTP_INDEX                                   0x0004
    1701 /** @} */
    1702 
    1703 
    1704 /** @name VMCS field encoding: 16-bit guest-state fields.
    1705  * @{
    1706  */
     1725
     1726/** 16-bit guest-state fields.  */
    17071727#define VMX_VMCS16_GUEST_ES_SEL                                 0x0800
    17081728#define VMX_VMCS16_GUEST_CS_SEL                                 0x0802
     
    17151735#define VMX_VMCS16_GUEST_INTR_STATUS                            0x0810
    17161736#define VMX_VMCS16_GUEST_PML_INDEX                              0x0812
    1717 /** @} */
    1718 
    1719 
    1720 /** @name VMCS field encoding: 16-bits host-state fields.
    1721  * @{
    1722  */
     1737
     1738/** 16-bits host-state fields.  */
    17231739#define VMX_VMCS16_HOST_ES_SEL                                  0x0c00
    17241740#define VMX_VMCS16_HOST_CS_SEL                                  0x0c02
     
    17281744#define VMX_VMCS16_HOST_GS_SEL                                  0x0c0a
    17291745#define VMX_VMCS16_HOST_TR_SEL                                  0x0c0c
    1730 /** @} */
    1731 
    1732 
    1733 /** @name VMCS field encoding: 64-bit control fields.
    1734  * @{
    1735  */
     1746
     1747/** 64-bit control fields. */
    17361748#define VMX_VMCS64_CTRL_IO_BITMAP_A_FULL                        0x2000
    17371749#define VMX_VMCS64_CTRL_IO_BITMAP_A_HIGH                        0x2001
     
    17841796#define VMX_VMCS64_CTRL_TSC_MULTIPLIER_FULL                     0x2032
    17851797#define VMX_VMCS64_CTRL_TSC_MULTIPLIER_HIGH                     0x2033
    1786 /** @} */
    1787 
    1788 
    1789 /** @name VMCS field encoding: 64-bit read-only data fields.
    1790  * @{
    1791  */
     1798
     1799/** 64-bit read-only data fields.  */
    17921800#define VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL                      0x2400
    17931801#define VMX_VMCS64_RO_GUEST_PHYS_ADDR_HIGH                      0x2401
    1794 /** @} */
    1795 
    1796 
    1797 /** @name VMCS field encoding: 64-bit guest-state fields.
    1798  * @{
    1799  */
     1802
     1803/** 64-bit guest-state fields.  */
    18001804#define VMX_VMCS64_GUEST_VMCS_LINK_PTR_FULL                     0x2800
    18011805#define VMX_VMCS64_GUEST_VMCS_LINK_PTR_HIGH                     0x2801
     
    18181822#define VMX_VMCS64_GUEST_BNDCFGS_FULL                           0x2812
    18191823#define VMX_VMCS64_GUEST_BNDCFGS_HIGH                           0x2813
    1820 /** @} */
    1821 
    1822 
    1823 /** @name VMCS field encoding: 64-bit host-state fields.
    1824  * @{
    1825  */
     1824
     1825/** 64-bit host-state fields.  */
    18261826#define VMX_VMCS64_HOST_PAT_FULL                                0x2c00
    18271827#define VMX_VMCS64_HOST_PAT_HIGH                                0x2c01
     
    18301830#define VMX_VMCS64_HOST_PERF_GLOBAL_CTRL_FULL                   0x2c04
    18311831#define VMX_VMCS64_HOST_PERF_GLOBAL_CTRL_HIGH                   0x2c05
    1832 /** @} */
    1833 
    1834 
    1835 /** @name VMCS field encoding: 32-bit control fields.
    1836  * @{
    1837  */
     1832
     1833/** 32-bit control fields.  */
    18381834#define VMX_VMCS32_CTRL_PIN_EXEC                                0x4000
    18391835#define VMX_VMCS32_CTRL_PROC_EXEC                               0x4002
     
    18541850#define VMX_VMCS32_CTRL_PLE_GAP                                 0x4020
    18551851#define VMX_VMCS32_CTRL_PLE_WINDOW                              0x4022
    1856 /** @} */
    1857 
    1858 
    1859 /** @name VMCS field encoding: 32-bits read-only fields.
    1860  * @{
    1861  */
     1852
     1853/** 32-bits read-only fields. */
    18621854#define VMX_VMCS32_RO_VM_INSTR_ERROR                            0x4400
    18631855#define VMX_VMCS32_RO_EXIT_REASON                               0x4402
     
    18681860#define VMX_VMCS32_RO_EXIT_INSTR_LENGTH                         0x440c
    18691861#define VMX_VMCS32_RO_EXIT_INSTR_INFO                           0x440e
    1870 /** @} */
    1871 
    1872 
    1873 /** @name VMCS field encoding: 32-bit guest-state fields.
    1874  * @{
    1875  */
     1862
     1863/** 32-bit guest-state fields. */
    18761864#define VMX_VMCS32_GUEST_ES_LIMIT                               0x4800
    18771865#define VMX_VMCS32_GUEST_CS_LIMIT                               0x4802
     
    18971885#define VMX_VMCS32_GUEST_SYSENTER_CS                            0x482a
    18981886#define VMX_VMCS32_PREEMPT_TIMER_VALUE                          0x482e
    1899 /** @} */
    1900 
    1901 
    1902 /** @name VMCS field encoding: 32-bit host-state fields.
    1903  * @{
    1904  */
     1887
     1888/** 32-bit host-state fields. */
    19051889#define VMX_VMCS32_HOST_SYSENTER_CS                             0x4C00
    1906 /** @} */
    1907 
    1908 
    1909 /** @name VMCS field encoding: Natural-width control fields.
    1910  * @{
    1911  */
     1890
     1891/** Natural-width control fields.  */
    19121892#define VMX_VMCS_CTRL_CR0_MASK                                  0x6000
    19131893#define VMX_VMCS_CTRL_CR4_MASK                                  0x6002
     
    19181898#define VMX_VMCS_CTRL_CR3_TARGET_VAL2                           0x600c
    19191899#define VMX_VMCS_CTRL_CR3_TARGET_VAL3                           0x600e
    1920 /** @} */
    1921 
    1922 
    1923 /** @name Natural-width read-only data fields.
    1924  * @{
    1925  */
     1900
     1901/** Natural-width read-only data fields. */
    19261902#define VMX_VMCS_RO_EXIT_QUALIFICATION                          0x6400
    19271903#define VMX_VMCS_RO_IO_RCX                                      0x6402
     
    19301906#define VMX_VMCS_RO_IO_RIP                                      0x6408
    19311907#define VMX_VMCS_RO_GUEST_LINEAR_ADDR                           0x640a
    1932 /** @} */
    1933 
    1934 
    1935 /** @name VMCS field encoding: Natural-width guest-state fields.
    1936  * @{
    1937  */
     1908
     1909/** Natural-width guest-state fields. */
    19381910#define VMX_VMCS_GUEST_CR0                                      0x6800
    19391911#define VMX_VMCS_GUEST_CR3                                      0x6802
     
    19561928#define VMX_VMCS_GUEST_SYSENTER_ESP                             0x6824
    19571929#define VMX_VMCS_GUEST_SYSENTER_EIP                             0x6826
    1958 /** @} */
    1959 
    1960 
    1961 /** @name VMCS field encoding: Natural-width host-state fields.
    1962  * @{
    1963  */
     1930
     1931/** Natural-width host-state fields. */
    19641932#define VMX_VMCS_HOST_CR0                                       0x6c00
    19651933#define VMX_VMCS_HOST_CR3                                       0x6c02
     
    19741942#define VMX_VMCS_HOST_RSP                                       0x6c14
    19751943#define VMX_VMCS_HOST_RIP                                       0x6c16
    1976 /** @} */
    1977 
    1978 
    1979 /** @name VMCS field encoding: Access.
    1980  * @{ */
    1981 typedef enum
    1982 {
    1983     VMXVMCSFIELDACCESS_FULL = 0,
    1984     VMXVMCSFIELDACCESS_HIGH
    1985 } VMXVMCSFIELDACCESS;
    1986 AssertCompileSize(VMXVMCSFIELDACCESS, 4);
    1987 
    1988 /** VMCS field encoding type: Full. */
    1989 #define VMX_VMCS_ENC_ACCESS_TYPE_FULL                           0
    1990 /** VMCS field encoding type: High. */
    1991 #define VMX_VMCS_ENC_ACCESS_TYPE_HIGH                           1
    1992 /** @} */
    1993 
    1994 
    1995 /** @name VMCS field encoding: Type.
    1996  * @{ */
    1997 typedef enum
    1998 {
    1999     VMXVMCSFIELDTYPE_CONTROL = 0,
    2000     VMXVMCSFIELDTYPE_VMEXIT_INFO,
    2001     VMXVMCSFIELDTYPE_GUEST_STATE,
    2002     VMXVMCSFIELDTYPE_HOST_STATE
    2003 } VMXVMCSFIELDTYPE;
    2004 AssertCompileSize(VMXVMCSFIELDTYPE, 4);
    2005 
    2006 /** VMCS field encoding type: Control. */
    2007 #define VMX_VMCS_ENC_TYPE_CONTROL                               0
    2008 /** VMCS field encoding type: VM-exit information / read-only fields. */
    2009 #define VMX_VMCS_ENC_TYPE_VMEXIT_INFO                           1
    2010 /** VMCS field encoding type: Guest-state. */
    2011 #define VMX_VMCS_ENC_TYPE_GUEST_STATE                           2
    2012 /** VMCS field encoding type: Host-state. */
    2013 #define VMX_VMCS_ENC_TYPE_HOST_STATE                            3
    2014 /** @} */
    2015 
    2016 
    2017 /** @name VMCS field encoding: Width.
    2018  * @{ */
    2019 typedef enum
    2020 {
    2021     VMXVMCSFIELDWIDTH_16BIT = 0,
    2022     VMXVMCSFIELDWIDTH_64BIT,
    2023     VMXVMCSFIELDWIDTH_32BIT,
    2024     VMXVMCSFIELDWIDTH_NATURAL
    2025 } VMXVMCSFIELDWIDTH;
    2026 AssertCompileSize(VMXVMCSFIELDWIDTH, 4);
    2027 
    2028 /** VMCS field encoding width: 16-bit. */
    2029 #define VMX_VMCS_ENC_WIDTH_16BIT                                0
    2030 /** VMCS field encoding width: 64-bit. */
    2031 #define VMX_VMCS_ENC_WIDTH_64BIT                                1
    2032 /** VMCS field encoding width: 32-bit. */
    2033 #define VMX_VMCS_ENC_WIDTH_32BIT                                2
    2034 /** VMCS field encoding width: Natural width. */
    2035 #define VMX_VMCS_ENC_WIDTH_NATURAL                              3
    2036 /** @} */
    2037 
    2038 
    2039 /** @name VMCS field.
    2040  * @{ */
     1944
     1945/**
     1946 * VMCS field.
     1947 * In accordance with the VT-x spec.
     1948 */
    20411949typedef union
    20421950{
     
    20611969} VMXVMCSFIELD;
    20621970AssertCompileSize(VMXVMCSFIELD, 4);
    2063 /** Pointer to a VMCS field encoding. */
     1971/** Pointer to a VMCS field. */
    20641972typedef VMXVMCSFIELD *PVMXVMCSFIELD;
    2065 /** Pointer to a const VMCS field encoding. */
     1973/** Pointer to a const VMCS field. */
    20661974typedef const VMXVMCSFIELD *PCVMXVMCSFIELD;
    20671975
    2068 /** VMCS field encoding: Mask of reserved bits (bits 63:15 MBZ), bit 12 is
    2069  *  not included! */
    2070 #define VMX_VMCS_ENC_RSVD_MASK                                  UINT64_C(0xffffffffffff8000)
    2071 
    2072 /** Bits fields for VMCS field encoding. */
    2073 #define VMX_BF_VMCS_ENC_ACCESS_TYPE_SHIFT                       0
    2074 #define VMX_BF_VMCS_ENC_ACCESS_TYPE_MASK                        UINT32_C(0x00000001)
    2075 #define VMX_BF_VMCS_ENC_INDEX_SHIFT                             1
    2076 #define VMX_BF_VMCS_ENC_INDEX_MASK                              UINT32_C(0x000003fe)
    2077 #define VMX_BF_VMCS_ENC_TYPE_SHIFT                              10
    2078 #define VMX_BF_VMCS_ENC_TYPE_MASK                               UINT32_C(0x00000c00)
    2079 #define VMX_BF_VMCS_ENC_RSVD_12_SHIFT                           12
    2080 #define VMX_BF_VMCS_ENC_RSVD_12_MASK                            UINT32_C(0x00001000)
    2081 #define VMX_BF_VMCS_ENC_WIDTH_SHIFT                             13
    2082 #define VMX_BF_VMCS_ENC_WIDTH_MASK                              UINT32_C(0x00006000)
    2083 #define VMX_BF_VMCS_ENC_RSVD_15_31_SHIFT                        15
    2084 #define VMX_BF_VMCS_ENC_RSVD_15_31_MASK                         UINT32_C(0xffff8000)
    2085 RT_BF_ASSERT_COMPILE_CHECKS(VMX_BF_VMCS_ENC_, UINT32_C(0), UINT32_MAX,
     1976/** VMCS field: Mask of reserved bits (bits 63:15 MBZ), bit 12 is not included! */
     1977#define VMX_VMCSFIELD_RSVD_MASK                                 UINT64_C(0xffffffffffff8000)
     1978
     1979/** Bits fields for a VMCS field. */
     1980#define VMX_BF_VMCSFIELD_ACCESS_TYPE_SHIFT                      0
     1981#define VMX_BF_VMCSFIELD_ACCESS_TYPE_MASK                       UINT32_C(0x00000001)
     1982#define VMX_BF_VMCSFIELD_INDEX_SHIFT                            1
     1983#define VMX_BF_VMCSFIELD_INDEX_MASK                             UINT32_C(0x000003fe)
     1984#define VMX_BF_VMCSFIELD_TYPE_SHIFT                             10
     1985#define VMX_BF_VMCSFIELD_TYPE_MASK                              UINT32_C(0x00000c00)
     1986#define VMX_BF_VMCSFIELD_RSVD_12_SHIFT                          12
     1987#define VMX_BF_VMCSFIELD_RSVD_12_MASK                           UINT32_C(0x00001000)
     1988#define VMX_BF_VMCSFIELD_WIDTH_SHIFT                            13
     1989#define VMX_BF_VMCSFIELD_WIDTH_MASK                             UINT32_C(0x00006000)
     1990#define VMX_BF_VMCSFIELD_RSVD_15_31_SHIFT                       15
     1991#define VMX_BF_VMCSFIELD_RSVD_15_31_MASK                        UINT32_C(0xffff8000)
     1992RT_BF_ASSERT_COMPILE_CHECKS(VMX_BF_VMCSFIELD_, UINT32_C(0), UINT32_MAX,
    20861993                            (ACCESS_TYPE, INDEX, TYPE, RSVD_12, WIDTH, RSVD_15_31));
     1994
     1995/**
     1996 * VMCS field encoding: Access type.
     1997 * In accordance with the VT-x spec.
     1998 */
     1999typedef enum
     2000{
     2001    VMXVMCSFIELDACCESS_FULL = 0,
     2002    VMXVMCSFIELDACCESS_HIGH
     2003} VMXVMCSFIELDACCESS;
     2004AssertCompileSize(VMXVMCSFIELDACCESS, 4);
     2005/** VMCS field encoding type: Full. */
     2006#define VMX_VMCSFIELD_ACCESS_FULL                               0
     2007/** VMCS field encoding type: High. */
     2008#define VMX_VMCSFIELD_ACCESS_HIGH                               1
     2009
     2010/**
     2011 * VMCS field encoding: Type.
     2012 * In accordance with the VT-x spec.
     2013 */
     2014typedef enum
     2015{
     2016    VMXVMCSFIELDTYPE_CONTROL = 0,
     2017    VMXVMCSFIELDTYPE_VMEXIT_INFO,
     2018    VMXVMCSFIELDTYPE_GUEST_STATE,
     2019    VMXVMCSFIELDTYPE_HOST_STATE
     2020} VMXVMCSFIELDTYPE;
     2021AssertCompileSize(VMXVMCSFIELDTYPE, 4);
     2022/** VMCS field encoding type: Control. */
     2023#define VMX_VMCSFIELD_TYPE_CONTROL                              0
     2024/** VMCS field encoding type: VM-exit information / read-only fields. */
     2025#define VMX_VMCSFIELD_TYPE_VMEXIT_INFO                          1
     2026/** VMCS field encoding type: Guest-state. */
     2027#define VMX_VMCSFIELD_TYPE_GUEST_STATE                          2
     2028/** VMCS field encoding type: Host-state. */
     2029#define VMX_VMCSFIELD_TYPE_HOST_STATE                           3
     2030
     2031/**
     2032 * VMCS field encoding: Width.
     2033 * In accordance with the VT-x spec.
     2034 */
     2035typedef enum
     2036{
     2037    VMXVMCSFIELDWIDTH_16BIT = 0,
     2038    VMXVMCSFIELDWIDTH_64BIT,
     2039    VMXVMCSFIELDWIDTH_32BIT,
     2040    VMXVMCSFIELDWIDTH_NATURAL
     2041} VMXVMCSFIELDWIDTH;
     2042AssertCompileSize(VMXVMCSFIELDWIDTH, 4);
     2043/** VMCS field encoding width: 16-bit. */
     2044#define VMX_VMCSFIELD_WIDTH_16BIT                               0
     2045/** VMCS field encoding width: 64-bit. */
     2046#define VMX_VMCSFIELD_WIDTH_64BIT                               1
     2047/** VMCS field encoding width: 32-bit. */
     2048#define VMX_VMCSFIELD_WIDTH_32BIT                               2
     2049/** VMCS field encoding width: Natural width. */
     2050#define VMX_VMCSFIELD_WIDTH_NATURAL                             3
    20872051/** @} */
    20882052
     
    31113075/**
    31123076 * APIC-access type.
     3077 * In accordance with the VT-x spec.
    31133078 */
    31143079typedef enum
     
    33853350
    33863351/** The highest index value used for supported virtual VMCS field encoding. */
    3387 #define VMX_V_VMCS_MAX_INDEX                                    RT_BF_GET(VMX_VMCS64_CTRL_TSC_MULTIPLIER_HIGH, VMX_BF_VMCS_ENC_INDEX)
     3352#define VMX_V_VMCS_MAX_INDEX                                    RT_BF_GET(VMX_VMCS64_CTRL_TSC_MULTIPLIER_HIGH, VMX_BF_VMCSFIELD_INDEX)
    33883353
    33893354/**
     
    34723437 *
    34733438 * Note! Any fields that are added or modified here, make sure to update the
    3474  *       corresponding fields in g_aoffVmcsMap in IEM.
     3439 *       corresponding fields in IEM (g_aoffVmcsMap), the corresponding saved
     3440 *       state structure in CPUM (g_aVmxHwvirtVmcs) and bump the SSM version.
    34753441 */
    34763442#pragma pack(1)
  • TabularUnified trunk/include/VBox/vmm/hmvmxinline.h

    r78220 r79202  
    8484 * @param   uFieldEnc   The VMCS field encoding.
    8585 *
    86  * @remarks Warning! This function does not verify the encoding is for a valid and
    87  *          supported VMCS field.
     86 * @remarks Warning! This function does not verify that the encoding is for a valid
     87 *          and/or supported VMCS field.
    8888 */
    8989DECLINLINE(bool) HMVmxIsVmcsFieldReadOnly(uint32_t uFieldEnc)
    9090{
    9191    /* See Intel spec. B.4.2 "Natural-Width Read-Only Data Fields". */
    92     return (RT_BF_GET(uFieldEnc, VMX_BF_VMCS_ENC_TYPE) == VMXVMCSFIELDTYPE_VMEXIT_INFO);
     92    return (RT_BF_GET(uFieldEnc, VMX_BF_VMCSFIELD_TYPE) == VMXVMCSFIELDTYPE_VMEXIT_INFO);
    9393}
    9494
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