VirtualBox

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


Ignore:
Timestamp:
May 26, 2013 11:29:24 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
86004
Message:

VMM: Optimized 64-bit host VT-x world-switch.

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

Legend:

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

    r46004 r46267  
    3737 */
    3838
     39/** @name Host-state restoration flags.
     40 * @{
     41 */
     42/* If you change these values don't forget to update the assembly defines as well! */
     43#define VMX_RESTORE_HOST_SEL_DS               RT_BIT(0)
     44#define VMX_RESTORE_HOST_SEL_ES               RT_BIT(1)
     45#define VMX_RESTORE_HOST_SEL_FS               RT_BIT(2)
     46#define VMX_RESTORE_HOST_SEL_GS               RT_BIT(3)
     47#define VMX_RESTORE_HOST_GDTR                 RT_BIT(4)
     48#define VMX_RESTORE_HOST_IDTR                 RT_BIT(5)
     49#define VMX_RESTORE_HOST_LDTR                 RT_BIT(6)
     50/** @} */
     51
     52/**
     53 * Host-state restoration structure.
     54 * This holds host-state fields that require manual restoration. The layout is
     55 * critical as it's used from assembly code.
     56 */
     57#pragma pack(1)
     58typedef struct VMXRESTOREHOST
     59{
     60    RTSEL       uHostSelDS;     /* 0x00 */
     61    RTSEL       uHostSelES;     /* 0x02 */
     62    RTSEL       uHostSelFS;     /* 0x04 */
     63    RTSEL       uHostSelGS;     /* 0x06 */
     64    uint64_t    uHostFSBase;    /* 0x08 */
     65    uint64_t    uHostGSBase;    /* 0x10 */
     66    X86XDTR64   HostGdtr;       /* 0x18 */
     67    X86XDTR64   HostIdtr;       /* 0x22 */
     68} VMXRESTOREHOST;
     69#pragma pack()
     70/** Pointer to VMXRESTOREHOST. */
     71typedef VMXRESTOREHOST *PVMXRESTOREHOST;
     72AssertCompileSize(X86XDTR64, 10);
     73AssertCompileMemberOffset(VMXRESTOREHOST, uHostSelES, 2);
     74AssertCompileMemberOffset(VMXRESTOREHOST, uHostSelFS, 4);
     75AssertCompileMemberOffset(VMXRESTOREHOST, uHostSelGS, 6);
     76AssertCompileMemberOffset(VMXRESTOREHOST, uHostFSBase, 8);
     77AssertCompileMemberOffset(VMXRESTOREHOST, uHostGSBase, 16);
     78AssertCompileMemberOffset(VMXRESTOREHOST, HostGdtr, 24);
     79AssertCompileMemberOffset(VMXRESTOREHOST, HostIdtr, 34);
     80AssertCompileSize(VMXRESTOREHOST, 44);
     81
    3982/** @name VMX VMCS-Read cache indices.
    4083 * @{
    4184 */
    4285#ifndef VBOX_WITH_OLD_VTX_CODE
    43 # define VMX_VMCS_GUEST_ES_BASE_CACHE_IDX                                     0
    44 # define VMX_VMCS_GUEST_CS_BASE_CACHE_IDX                                     1
    45 # define VMX_VMCS_GUEST_SS_BASE_CACHE_IDX                                     2
    46 # define VMX_VMCS_GUEST_DS_BASE_CACHE_IDX                                     3
    47 # define VMX_VMCS_GUEST_FS_BASE_CACHE_IDX                                     4
    48 # define VMX_VMCS_GUEST_GS_BASE_CACHE_IDX                                     5
    49 # define VMX_VMCS_GUEST_LDTR_BASE_CACHE_IDX                                   6
    50 # define VMX_VMCS_GUEST_TR_BASE_CACHE_IDX                                     7
    51 # define VMX_VMCS_GUEST_GDTR_BASE_CACHE_IDX                                   8
    52 # define VMX_VMCS_GUEST_IDTR_BASE_CACHE_IDX                                   9
    53 # define VMX_VMCS_GUEST_RSP_CACHE_IDX                                         10
    54 # define VMX_VMCS_GUEST_RIP_CACHE_IDX                                         11
    55 # define VMX_VMCS_GUEST_SYSENTER_ESP_CACHE_IDX                                12
    56 # define VMX_VMCS_GUEST_SYSENTER_EIP_CACHE_IDX                                13
    57 # define VMX_VMCS_RO_EXIT_QUALIFICATION_CACHE_IDX                             14
    58 # define VMX_VMCS_MAX_CACHE_IDX                                               (VMX_VMCS_RO_EXIT_QUALIFICATION_CACHE_IDX + 1)
    59 # define VMX_VMCS_GUEST_CR3_CACHE_IDX                                         15
    60 # define VMX_VMCS_MAX_NESTED_PAGING_CACHE_IDX                                 (VMX_VMCS_GUEST_CR3_CACHE_IDX + 1)
     86# define VMX_VMCS_GUEST_ES_BASE_CACHE_IDX                       0
     87# define VMX_VMCS_GUEST_CS_BASE_CACHE_IDX                       1
     88# define VMX_VMCS_GUEST_SS_BASE_CACHE_IDX                       2
     89# define VMX_VMCS_GUEST_DS_BASE_CACHE_IDX                       3
     90# define VMX_VMCS_GUEST_FS_BASE_CACHE_IDX                       4
     91# define VMX_VMCS_GUEST_GS_BASE_CACHE_IDX                       5
     92# define VMX_VMCS_GUEST_LDTR_BASE_CACHE_IDX                     6
     93# define VMX_VMCS_GUEST_TR_BASE_CACHE_IDX                       7
     94# define VMX_VMCS_GUEST_GDTR_BASE_CACHE_IDX                     8
     95# define VMX_VMCS_GUEST_IDTR_BASE_CACHE_IDX                     9
     96# define VMX_VMCS_GUEST_RSP_CACHE_IDX                           10
     97# define VMX_VMCS_GUEST_RIP_CACHE_IDX                           11
     98# define VMX_VMCS_GUEST_SYSENTER_ESP_CACHE_IDX                  12
     99# define VMX_VMCS_GUEST_SYSENTER_EIP_CACHE_IDX                  13
     100# define VMX_VMCS_RO_EXIT_QUALIFICATION_CACHE_IDX               14
     101# define VMX_VMCS_MAX_CACHE_IDX                                 (VMX_VMCS_RO_EXIT_QUALIFICATION_CACHE_IDX + 1)
     102# define VMX_VMCS_GUEST_CR3_CACHE_IDX                           15
     103# define VMX_VMCS_MAX_NESTED_PAGING_CACHE_IDX                   (VMX_VMCS_GUEST_CR3_CACHE_IDX + 1)
    61104#else /* VBOX_WITH_OLD_VTX_CODE */
    62 # define VMX_VMCS_GUEST_RIP_CACHE_IDX                                        0
    63 # define VMX_VMCS_GUEST_RSP_CACHE_IDX                                        1
    64 # define VMX_VMCS_GUEST_RFLAGS_CACHE_IDX                                     2
    65 # define VMX_VMCS32_GUEST_INTERRUPTIBILITY_STATE_CACHE_IDX                   3
    66 # define VMX_VMCS_CTRL_CR0_READ_SHADOW_CACHE_IDX                             4
    67 # define VMX_VMCS_GUEST_CR0_CACHE_IDX                                        5
    68 # define VMX_VMCS_CTRL_CR4_READ_SHADOW_CACHE_IDX                             6
    69 # define VMX_VMCS_GUEST_CR4_CACHE_IDX                                        7
    70 # define VMX_VMCS_GUEST_DR7_CACHE_IDX                                        8
    71 # define VMX_VMCS32_GUEST_SYSENTER_CS_CACHE_IDX                              9
    72 # define VMX_VMCS_GUEST_SYSENTER_EIP_CACHE_IDX                               10
    73 # define VMX_VMCS_GUEST_SYSENTER_ESP_CACHE_IDX                               11
    74 # define VMX_VMCS32_GUEST_GDTR_LIMIT_CACHE_IDX                               12
    75 # define VMX_VMCS_GUEST_GDTR_BASE_CACHE_IDX                                  13
    76 # define VMX_VMCS32_GUEST_IDTR_LIMIT_CACHE_IDX                               14
    77 # define VMX_VMCS_GUEST_IDTR_BASE_CACHE_IDX                                  15
    78 # define VMX_VMCS16_GUEST_FIELD_CS_CACHE_IDX                                 16
    79 # define VMX_VMCS32_GUEST_CS_LIMIT_CACHE_IDX                                 17
    80 # define VMX_VMCS_GUEST_CS_BASE_CACHE_IDX                                    18
    81 # define VMX_VMCS32_GUEST_CS_ACCESS_RIGHTS_CACHE_IDX                         19
    82 # define VMX_VMCS16_GUEST_FIELD_DS_CACHE_IDX                                 20
    83 # define VMX_VMCS32_GUEST_DS_LIMIT_CACHE_IDX                                 21
    84 # define VMX_VMCS_GUEST_DS_BASE_CACHE_IDX                                    22
    85 # define VMX_VMCS32_GUEST_DS_ACCESS_RIGHTS_CACHE_IDX                         23
    86 # define VMX_VMCS16_GUEST_FIELD_ES_CACHE_IDX                                 24
    87 # define VMX_VMCS32_GUEST_ES_LIMIT_CACHE_IDX                                 25
    88 # define VMX_VMCS_GUEST_ES_BASE_CACHE_IDX                                    26
    89 # define VMX_VMCS32_GUEST_ES_ACCESS_RIGHTS_CACHE_IDX                         27
    90 # define VMX_VMCS16_GUEST_FIELD_FS_CACHE_IDX                                 28
    91 # define VMX_VMCS32_GUEST_FS_LIMIT_CACHE_IDX                                 29
    92 # define VMX_VMCS_GUEST_FS_BASE_CACHE_IDX                                    30
    93 # define VMX_VMCS32_GUEST_FS_ACCESS_RIGHTS_CACHE_IDX                         31
    94 # define VMX_VMCS16_GUEST_FIELD_GS_CACHE_IDX                                 32
    95 # define VMX_VMCS32_GUEST_GS_LIMIT_CACHE_IDX                                 33
    96 # define VMX_VMCS_GUEST_GS_BASE_CACHE_IDX                                    34
    97 # define VMX_VMCS32_GUEST_GS_ACCESS_RIGHTS_CACHE_IDX                         35
    98 # define VMX_VMCS16_GUEST_FIELD_SS_CACHE_IDX                                 36
    99 # define VMX_VMCS32_GUEST_SS_LIMIT_CACHE_IDX                                 37
    100 # define VMX_VMCS_GUEST_SS_BASE_CACHE_IDX                                    38
    101 # define VMX_VMCS32_GUEST_SS_ACCESS_RIGHTS_CACHE_IDX                         39
    102 # define VMX_VMCS16_GUEST_FIELD_TR_CACHE_IDX                                 40
    103 # define VMX_VMCS32_GUEST_TR_LIMIT_CACHE_IDX                                 41
    104 # define VMX_VMCS_GUEST_TR_BASE_CACHE_IDX                                    42
    105 # define VMX_VMCS32_GUEST_TR_ACCESS_RIGHTS_CACHE_IDX                         43
    106 # define VMX_VMCS16_GUEST_FIELD_LDTR_CACHE_IDX                               44
    107 # define VMX_VMCS32_GUEST_LDTR_LIMIT_CACHE_IDX                               45
    108 # define VMX_VMCS_GUEST_LDTR_BASE_CACHE_IDX                                  46
    109 # define VMX_VMCS32_GUEST_LDTR_ACCESS_RIGHTS_CACHE_IDX                       47
    110 # define VMX_VMCS32_RO_EXIT_REASON_CACHE_IDX                                 48
    111 # define VMX_VMCS32_RO_VM_INSTR_ERROR_CACHE_IDX                              49
    112 # define VMX_VMCS32_RO_EXIT_INSTR_LENGTH_CACHE_IDX                           50
    113 # define VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE_CACHE_IDX                51
    114 # define VMX_VMCS32_RO_EXIT_INSTR_INFO_CACHE_IDX                             52
    115 # define VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO_CACHE_IDX                      53
    116 # define VMX_VMCS_RO_EXIT_QUALIFICATION_CACHE_IDX                            54
    117 # define VMX_VMCS32_RO_IDT_INFO_CACHE_IDX                                    55
    118 # define VMX_VMCS32_RO_IDT_ERROR_CODE_CACHE_IDX                              56
    119 # define VMX_VMCS_MAX_CACHE_IDX                                              (VMX_VMCS32_RO_IDT_ERROR_CODE_CACHE_IDX + 1)
    120 # define VMX_VMCS_GUEST_CR3_CACHE_IDX                                        57
    121 # define VMX_VMCS64_EXIT_GUEST_PHYS_ADDR_FULL_CACHE_IDX                      58
    122 # define VMX_VMCS_MAX_NESTED_PAGING_CACHE_IDX                                (VMX_VMCS64_EXIT_GUEST_PHYS_ADDR_FULL_CACHE_IDX + 1)
     105# define VMX_VMCS_GUEST_RIP_CACHE_IDX                           0
     106# define VMX_VMCS_GUEST_RSP_CACHE_IDX                           1
     107# define VMX_VMCS_GUEST_RFLAGS_CACHE_IDX                        2
     108# define VMX_VMCS32_GUEST_INTERRUPTIBILITY_STATE_CACHE_IDX      3
     109# define VMX_VMCS_CTRL_CR0_READ_SHADOW_CACHE_IDX                4
     110# define VMX_VMCS_GUEST_CR0_CACHE_IDX                           5
     111# define VMX_VMCS_CTRL_CR4_READ_SHADOW_CACHE_IDX                6
     112# define VMX_VMCS_GUEST_CR4_CACHE_IDX                           7
     113# define VMX_VMCS_GUEST_DR7_CACHE_IDX                           8
     114# define VMX_VMCS32_GUEST_SYSENTER_CS_CACHE_IDX                 9
     115# define VMX_VMCS_GUEST_SYSENTER_EIP_CACHE_IDX                  10
     116# define VMX_VMCS_GUEST_SYSENTER_ESP_CACHE_IDX                  11
     117# define VMX_VMCS32_GUEST_GDTR_LIMIT_CACHE_IDX                  12
     118# define VMX_VMCS_GUEST_GDTR_BASE_CACHE_IDX                     13
     119# define VMX_VMCS32_GUEST_IDTR_LIMIT_CACHE_IDX                  14
     120# define VMX_VMCS_GUEST_IDTR_BASE_CACHE_IDX                     15
     121# define VMX_VMCS16_GUEST_FIELD_CS_CACHE_IDX                    16
     122# define VMX_VMCS32_GUEST_CS_LIMIT_CACHE_IDX                    17
     123# define VMX_VMCS_GUEST_CS_BASE_CACHE_IDX                       18
     124# define VMX_VMCS32_GUEST_CS_ACCESS_RIGHTS_CACHE_IDX            19
     125# define VMX_VMCS16_GUEST_FIELD_DS_CACHE_IDX                    20
     126# define VMX_VMCS32_GUEST_DS_LIMIT_CACHE_IDX                    21
     127# define VMX_VMCS_GUEST_DS_BASE_CACHE_IDX                       22
     128# define VMX_VMCS32_GUEST_DS_ACCESS_RIGHTS_CACHE_IDX            23
     129# define VMX_VMCS16_GUEST_FIELD_ES_CACHE_IDX                    24
     130# define VMX_VMCS32_GUEST_ES_LIMIT_CACHE_IDX                    25
     131# define VMX_VMCS_GUEST_ES_BASE_CACHE_IDX                       26
     132# define VMX_VMCS32_GUEST_ES_ACCESS_RIGHTS_CACHE_IDX            27
     133# define VMX_VMCS16_GUEST_FIELD_FS_CACHE_IDX                    28
     134# define VMX_VMCS32_GUEST_FS_LIMIT_CACHE_IDX                    29
     135# define VMX_VMCS_GUEST_FS_BASE_CACHE_IDX                       30
     136# define VMX_VMCS32_GUEST_FS_ACCESS_RIGHTS_CACHE_IDX            31
     137# define VMX_VMCS16_GUEST_FIELD_GS_CACHE_IDX                    32
     138# define VMX_VMCS32_GUEST_GS_LIMIT_CACHE_IDX                    33
     139# define VMX_VMCS_GUEST_GS_BASE_CACHE_IDX                       34
     140# define VMX_VMCS32_GUEST_GS_ACCESS_RIGHTS_CACHE_IDX            35
     141# define VMX_VMCS16_GUEST_FIELD_SS_CACHE_IDX                    36
     142# define VMX_VMCS32_GUEST_SS_LIMIT_CACHE_IDX                    37
     143# define VMX_VMCS_GUEST_SS_BASE_CACHE_IDX                       38
     144# define VMX_VMCS32_GUEST_SS_ACCESS_RIGHTS_CACHE_IDX            39
     145# define VMX_VMCS16_GUEST_FIELD_TR_CACHE_IDX                    40
     146# define VMX_VMCS32_GUEST_TR_LIMIT_CACHE_IDX                    41
     147# define VMX_VMCS_GUEST_TR_BASE_CACHE_IDX                       42
     148# define VMX_VMCS32_GUEST_TR_ACCESS_RIGHTS_CACHE_IDX            43
     149# define VMX_VMCS16_GUEST_FIELD_LDTR_CACHE_IDX                  44
     150# define VMX_VMCS32_GUEST_LDTR_LIMIT_CACHE_IDX                  45
     151# define VMX_VMCS_GUEST_LDTR_BASE_CACHE_IDX                     46
     152# define VMX_VMCS32_GUEST_LDTR_ACCESS_RIGHTS_CACHE_IDX          47
     153# define VMX_VMCS32_RO_EXIT_REASON_CACHE_IDX                    48
     154# define VMX_VMCS32_RO_VM_INSTR_ERROR_CACHE_IDX                 49
     155# define VMX_VMCS32_RO_EXIT_INSTR_LENGTH_CACHE_IDX              50
     156# define VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE_CACHE_IDX   51
     157# define VMX_VMCS32_RO_EXIT_INSTR_INFO_CACHE_IDX                52
     158# define VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO_CACHE_IDX         53
     159# define VMX_VMCS_RO_EXIT_QUALIFICATION_CACHE_IDX               54
     160# define VMX_VMCS32_RO_IDT_INFO_CACHE_IDX                       55
     161# define VMX_VMCS32_RO_IDT_ERROR_CODE_CACHE_IDX                 56
     162# define VMX_VMCS_MAX_CACHE_IDX                                 (VMX_VMCS32_RO_IDT_ERROR_CODE_CACHE_IDX + 1)
     163# define VMX_VMCS_GUEST_CR3_CACHE_IDX                           57
     164# define VMX_VMCS64_EXIT_GUEST_PHYS_ADDR_FULL_CACHE_IDX         58
     165# define VMX_VMCS_MAX_NESTED_PAGING_CACHE_IDX                   (VMX_VMCS64_EXIT_GUEST_PHYS_ADDR_FULL_CACHE_IDX + 1)
    123166#endif  /* VBOX_WITH_OLD_VTX_CODE */
    124167/** @} */
    125 
    126168
    127169/** @name VMX EPT paging structures
     
    14771519
    14781520/**
     1521 * Restores some host-state fields that need not be done on every VM-exit.
     1522 *
     1523 * @returns VBox status code.
     1524 * @param   fRestoreHostFlags   Flags of which host registers needs to be
     1525 *                              restored.
     1526 * @param   pRestoreHost        Pointer to the host-restore structure.
     1527 */
     1528DECLASM(int) VMXRestoreHostState(uint32_t fRestoreHostFlags, PVMXRESTOREHOST pRestoreHost);
     1529
     1530
     1531/**
    14791532 * Executes VMXON
    14801533 *
  • trunk/include/VBox/vmm/hm_vmx.mac

    r45947 r46267  
    152152%define VMX_VMCS_HOST_RIP                                       06C16h
    153153
     154%define VMX_RESTORE_HOST_SEL_DS                                 1h      ;RT_BIT(0)
     155%define VMX_RESTORE_HOST_SEL_ES                                 2h      ;RT_BIT(1)
     156%define VMX_RESTORE_HOST_SEL_FS                                 4h      ;RT_BIT(2)
     157%define VMX_RESTORE_HOST_SEL_GS                                 8h      ;RT_BIT(3)
     158%define VMX_RESTORE_HOST_GDTR                                   10h     ;RT_BIT(4)
     159%define VMX_RESTORE_HOST_IDTR                                   20h     ;RT_BIT(5)
     160%define VMX_RESTORE_HOST_LDTR                                   40h     ;RT_BIT(6)
     161
  • trunk/include/VBox/vmm/vm.h

    r46155 r46267  
    149149        struct HMCPU    s;
    150150#endif
    151         uint8_t             padding[5440];      /* multiple of 64 */
     151        uint8_t             padding[5504];      /* multiple of 64 */
    152152    } hm;
    153153
     
    226226
    227227    /** Align the following members on page boundary. */
    228     uint8_t                 abAlignment2[320];
     228    uint8_t                 abAlignment2[256];
    229229
    230230    /** PGM part. */
  • trunk/include/VBox/vmm/vm.mac

    r45870 r46267  
    135135
    136136    .cpum                   resb 3584
    137     .hm                     resb 5440
     137    .hm                     resb 5504
    138138    .em                     resb 1472
    139139    .iem                    resb 3072
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