- Timestamp:
- May 30, 2017 7:58:21 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
-
include/VBox/sup.h (modified) (2 diffs)
-
include/VBox/vmm/hm_vmx.h (modified) (3 diffs)
-
include/VBox/vmm/hm_vmx.mac (modified) (3 diffs)
-
src/VBox/HostDrivers/Support/SUPDrv.cpp (modified) (2 diffs)
-
src/VBox/HostDrivers/Support/SUPDrvInternal.h (modified) (1 diff)
-
src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c (modified) (3 diffs)
-
src/VBox/VMM/VMMR0/HMR0A.asm (modified) (2 diffs)
-
src/VBox/VMM/VMMR0/HMVMXR0.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/sup.h
r64364 r67136 101 101 */ 102 102 /** GDT is read-only. */ 103 #define SUPKERNELFEATURES_GDT_READ_ONLY RT_BIT(0)103 #define SUPKERNELFEATURES_GDT_READ_ONLY RT_BIT(0) 104 104 /** SMAP is possibly enabled. */ 105 #define SUPKERNELFEATURES_SMAP RT_BIT(1) 105 #define SUPKERNELFEATURES_SMAP RT_BIT(1) 106 /** GDT is read-only but the writable GDT can be fetched by SUPR0GetCurrentGdtRw(). */ 107 #define SUPKERNELFEATURES_GDT_NEED_WRITABLE RT_BIT(2) 106 108 /** @} */ 107 109 … … 1894 1896 SUPR0DECL(int) SUPR0GetSvmUsability(bool fInitSvm); 1895 1897 SUPR0DECL(int) SUPR0GetVmxUsability(bool *pfIsSmxModeAmbiguous); 1898 SUPR0DECL(int) SUPR0GetCurrentGdtRw(RTHCUINTPTR *pGdtRw); 1896 1899 SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *pfCaps); 1897 1900 SUPR0DECL(int) SUPR0GipUnmap(PSUPDRVSESSION pSession); -
trunk/include/VBox/vmm/hm_vmx.h
r64143 r67136 112 112 #define VMX_RESTORE_HOST_GDT_READ_ONLY RT_BIT(7) 113 113 #define VMX_RESTORE_HOST_REQUIRED RT_BIT(8) 114 #define VMX_RESTORE_HOST_GDT_NEED_WRITABLE RT_BIT(9) 114 115 /** @} */ 115 116 … … 127 128 RTSEL uHostSelTR; /* 0x08 */ 128 129 uint8_t abPadding0[4]; 129 X86XDTR64 HostGdtr; /**< 0x0e - should be aligned by it's 64-bit member. */130 X86XDTR64 HostGdtr; /**< 0x0e - should be aligned by it's 64-bit member. */ 130 131 uint8_t abPadding1[6]; 131 X86XDTR64 HostIdtr; /**< 0x1e - should be aligned by it's 64-bit member. */ 132 uint64_t uHostFSBase; /* 0x28 */ 133 uint64_t uHostGSBase; /* 0x30 */ 132 X86XDTR64 HostGdtrRw; /**< 0x1e - should be aligned by it's 64-bit member. */ 133 uint8_t abPadding2[6]; 134 X86XDTR64 HostIdtr; /**< 0x2e - should be aligned by it's 64-bit member. */ 135 uint64_t uHostFSBase; /* 0x38 */ 136 uint64_t uHostGSBase; /* 0x40 */ 134 137 } VMXRESTOREHOST; 135 138 /** Pointer to VMXRESTOREHOST. */ … … 137 140 AssertCompileSize(X86XDTR64, 10); 138 141 AssertCompileMemberOffset(VMXRESTOREHOST, HostGdtr.uAddr, 16); 139 AssertCompileMemberOffset(VMXRESTOREHOST, HostIdtr.uAddr, 32); 140 AssertCompileMemberOffset(VMXRESTOREHOST, uHostFSBase, 40); 141 AssertCompileSize(VMXRESTOREHOST, 56); 142 AssertCompileMemberOffset(VMXRESTOREHOST, HostGdtrRw.uAddr, 32); 143 AssertCompileMemberOffset(VMXRESTOREHOST, HostIdtr.uAddr, 48); 144 AssertCompileMemberOffset(VMXRESTOREHOST, uHostFSBase, 56); 145 AssertCompileSize(VMXRESTOREHOST, 72); 142 146 AssertCompileSizeAlignment(VMXRESTOREHOST, 8); 143 147 -
trunk/include/VBox/vmm/hm_vmx.mac
r62476 r67136 161 161 %define VMX_RESTORE_HOST_GDT_READ_ONLY 80h ;RT_BIT(7) 162 162 %define VMX_RESTORE_HOST_REQUIRED 100h ;RT_BIT(8) 163 %define VMX_RESTORE_HOST_GDT_NEED_WRITABLE 200h ;RT_BIT(9) 163 164 164 165 ;; C version hm_vmx.h. … … 172 173 .HostGdtr resb 10 173 174 .abPadding1 resb 6 175 .HostGdtrRw resb 10 176 .abPadding2 resb 6 174 177 .HostIdtr resb 10 175 178 .uHostFSBase resq 1 … … 177 180 endstruc 178 181 AssertCompileMemberOffset(VMXRESTOREHOST, HostGdtr, 16-2) 179 AssertCompileMemberOffset(VMXRESTOREHOST, HostIdtr, 32-2) 180 AssertCompileMemberOffset(VMXRESTOREHOST, uHostFSBase, 40) 181 AssertCompileSize(VMXRESTOREHOST, 56) 182 AssertCompileMemberOffset(VMXRESTOREHOST, HostGdtrRw, 32-2) 183 AssertCompileMemberOffset(VMXRESTOREHOST, HostIdtr, 48-2) 184 AssertCompileMemberOffset(VMXRESTOREHOST, uHostFSBase, 56) 185 AssertCompileSize(VMXRESTOREHOST, 72) 182 186 -
trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp
r66581 r67136 199 199 { "SUPR0SuspendVTxOnCpu", (void *)(uintptr_t)SUPR0SuspendVTxOnCpu }, 200 200 { "SUPR0ResumeVTxOnCpu", (void *)(uintptr_t)SUPR0ResumeVTxOnCpu }, 201 { "SUPR0GetCurrentGdtRw", (void *)(uintptr_t)SUPR0GetCurrentGdtRw }, 201 202 { "SUPR0GetKernelFeatures", (void *)(uintptr_t)SUPR0GetKernelFeatures }, 202 203 { "SUPR0GetPagingMode", (void *)(uintptr_t)SUPR0GetPagingMode }, … … 3877 3878 3878 3879 3880 SUPR0DECL(int) SUPR0GetCurrentGdtRw(RTHCUINTPTR *pGdtRw) 3881 { 3882 #ifdef RT_OS_LINUX 3883 return supdrvOSetCurrentGdtRw(pGdtRw); 3884 #else 3885 return VERR_NOT_IMPLEMENTED; 3886 #endif 3887 } 3888 3889 3879 3890 /** 3880 3891 * Checks if Intel VT-x feature is usable on this CPU. -
trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h
r64872 r67136 842 842 bool VBOXCALL supdrvOSSuspendVTxOnCpu(void); 843 843 void VBOXCALL supdrvOSResumeVTxOnCpu(bool fSuspended); 844 int VBOXCALL supdrvOSetCurrentGdtRw(RTHCUINTPTR *pGdtRw); 844 845 845 846 /** -
trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
r62694 r67136 61 61 # include <asm/msr.h> 62 62 #endif 63 64 #include <asm/desc.h> 63 65 64 66 #include <iprt/asm-amd64-x86.h> … … 1401 1403 fFlags |= SUPKERNELFEATURES_GDT_READ_ONLY; 1402 1404 #endif 1405 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) 1406 fFlags |= SUPKERNELFEATURES_GDT_NEED_WRITABLE; 1407 #endif 1403 1408 #if defined(VBOX_STRICT) || defined(VBOX_WITH_EFLAGS_AC_SET_IN_VBOXDRV) 1404 1409 fFlags |= SUPKERNELFEATURES_SMAP; … … 1411 1416 1412 1417 1418 int supdrvOSetCurrentGdtRw(RTHCUINTPTR *pGdtRw) 1419 { 1420 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) 1421 *pGdtRw = (RTHCUINTPTR)get_current_gdt_rw(); 1422 return VINF_SUCCESS; 1423 #else 1424 return VERR_NOT_IMPLEMENTED; 1425 #endif 1426 } 1427 1428 1413 1429 module_init(VBoxDrvLinuxInit); 1414 1430 module_exit(VBoxDrvLinuxUnload); -
trunk/src/VBox/VMM/VMMR0/HMR0A.asm
r66878 r67136 285 285 mov ax, dx 286 286 and eax, X86_SEL_MASK_OFF_RPL ; Mask away TI and RPL bits leaving only the descriptor offset. 287 test edi, VMX_RESTORE_HOST_GDT_READ_ONLY | VMX_RESTORE_HOST_GDT_NEED_WRITABLE 288 jnz .gdt_readonly 287 289 add rax, qword [rsi + VMXRESTOREHOST.HostGdtr + 2] ; xAX <- descriptor offset + GDTR.pGdt. 288 test edi, VMX_RESTORE_HOST_GDT_READ_ONLY289 jnz .gdt_readonly290 290 and dword [rax + 4], ~RT_BIT(9) ; Clear the busy flag in TSS desc (bits 0-7=base, bit 9=busy bit). 291 291 ltr dx 292 292 jmp short .test_fs 293 293 .gdt_readonly: 294 test edi, VMX_RESTORE_HOST_GDT_NEED_WRITABLE 295 jnz .gdt_readonly_need_writable 294 296 mov rcx, cr0 295 297 mov r9, rcx 298 add rax, qword [rsi + VMXRESTOREHOST.HostGdtr + 2] ; xAX <- descriptor offset + GDTR.pGdt. 296 299 and rcx, ~X86_CR0_WP 297 300 mov cr0, rcx … … 299 302 ltr dx 300 303 mov cr0, r9 304 jmp short .test_fs 305 .gdt_readonly_need_writable: 306 add rax, qword [rsi + VMXRESTOREHOST.HostGdtrRw + 2] ; xAX <- descriptor offset + GDTR.pGdtRw. 307 and dword [rax + 4], ~RT_BIT(9) ; Clear the busy flag in TSS desc (bits 0-7=base, bit 9=busy bit). 308 lgdt [rsi + VMXRESTOREHOST.HostGdtrRw] 309 ltr dx 310 lgdt [rsi + VMXRESTOREHOST.HostGdtr] ; Load the original GDT 301 311 302 312 .test_fs: -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r67050 r67136 3038 3038 */ 3039 3039 if (Gdtr.cbGdt != 0xffff) 3040 {3041 3040 pVCpu->hm.s.vmx.fRestoreHostFlags |= VMX_RESTORE_HOST_GDTR; 3042 AssertCompile(sizeof(Gdtr) == sizeof(X86XDTR64));3043 memcpy(&pVCpu->hm.s.vmx.RestoreHost.HostGdtr, &Gdtr, sizeof(X86XDTR64));3044 }3045 3041 3046 3042 /* … … 3094 3090 pVCpu->hm.s.vmx.fRestoreHostFlags |= VMX_RESTORE_HOST_GDT_READ_ONLY; 3095 3091 pVCpu->hm.s.vmx.RestoreHost.uHostSelTR = uSelTR; 3096 3097 /* Store the GDTR here as we need it while restoring TR. */ 3092 } 3093 3094 /* 3095 * Store the GDTR as we need it when restoring the GDT and while restoring the TR. 3096 */ 3097 if (pVCpu->hm.s.vmx.fRestoreHostFlags & (VMX_RESTORE_HOST_GDTR | VMX_RESTORE_HOST_SEL_TR)) 3098 { 3099 AssertCompile(sizeof(Gdtr) == sizeof(X86XDTR64)); 3098 3100 memcpy(&pVCpu->hm.s.vmx.RestoreHost.HostGdtr, &Gdtr, sizeof(X86XDTR64)); 3101 if (pVM->hm.s.fHostKernelFeatures & SUPKERNELFEATURES_GDT_NEED_WRITABLE) 3102 { 3103 /* The GDT is read-only but the writable GDT is available. */ 3104 pVCpu->hm.s.vmx.fRestoreHostFlags |= VMX_RESTORE_HOST_GDT_NEED_WRITABLE; 3105 pVCpu->hm.s.vmx.RestoreHost.HostGdtrRw.cb = Gdtr.cbGdt; 3106 rc = SUPR0GetCurrentGdtRw(&pVCpu->hm.s.vmx.RestoreHost.HostGdtrRw.uAddr); 3107 AssertRCReturn(rc, rc); 3108 } 3099 3109 } 3100 3110 #else
Note:
See TracChangeset
for help on using the changeset viewer.

