Changeset 23725 in vbox
- Timestamp:
- Oct 13, 2009 1:44:46 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/sup.h
r23699 r23725 935 935 936 936 /** 937 * Check if the host kernel can run in VMX root mode. 938 * 939 * @returns VINF_SUCCESS if supported, error code indicating why if not. 937 * Check if the host kernel can run in VMX root mode. 938 * 939 * @returns VINF_SUCCESS if supported, error code indicating why if not. 940 940 */ 941 941 SUPR3DECL(int) SUPR3QueryVTxSupported(void); … … 943 943 944 944 /** 945 * Return VT-x/AMD-V capabilities 946 * 947 * @returns VINF_SUCCESS if supported, error code indicating why if not. 948 * @param p Caps Pointer to capability dword (out)949 */ 950 SUPR3DECL(int) SUPR3QueryVTCaps(uint32_t *p Caps);945 * Return VT-x/AMD-V capabilities. 946 * 947 * @returns VINF_SUCCESS if supported, error code indicating why if not. 948 * @param pfCaps Pointer to capability dword (out). 949 */ 950 SUPR3DECL(int) SUPR3QueryVTCaps(uint32_t *pfCaps); 951 951 952 952 /** @} */ … … 1015 1015 SUPR0DECL(int) SUPR0PageFree(PSUPDRVSESSION pSession, RTR3PTR pvR3); 1016 1016 SUPR0DECL(int) SUPR0GipMap(PSUPDRVSESSION pSession, PRTR3PTR ppGipR3, PRTHCPHYS pHCPhysGip); 1017 SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *p Caps);1017 SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *pfCaps); 1018 1018 SUPR0DECL(int) SUPR0GipUnmap(PSUPDRVSESSION pSession); 1019 1019 SUPR0DECL(int) SUPR0Printf(const char *pszFormat, ...); -
trunk/src/VBox/HostDrivers/Support/Makefile.kmk
r23538 r23725 179 179 win/SUPDrvA-win.asm \ 180 180 SUPDrv.c \ 181 SUPDrvAgnostic.c \ 181 182 win/VBoxDrv.rc 182 183 VBoxDrv_LDFLAGS.x86 = -Entry:DriverEntry@8 … … 234 235 vboxdrv_SOURCES = \ 235 236 $(KBUILD_TARGET)/SUPDrv-$(KBUILD_TARGET).c \ 236 SUPDrv.c 237 SUPDrv.c \ 238 SUPDrvAgnostic.c 237 239 ifndef VBOX_LINUX_VERSION_2_4 238 240 vboxdrv_SOURCES += \ … … 318 320 VBoxDrvTiger_SOURCES = \ 319 321 SUPDrv.c \ 322 SUPDrvAgnostic.c \ 320 323 $(KBUILD_TARGET)/SUPDrv-$(KBUILD_TARGET).cpp 321 324 … … 397 400 VBoxDrvLib_SOURCES = \ 398 401 os2/SUPDrv-os2.cpp \ 399 SUPDrv.c 402 SUPDrv.c \ 403 SUPDrvAgnostic.c 400 404 401 405 endif # os2 … … 412 416 $(KBUILD_TARGET)/SUPDrv-$(KBUILD_TARGET).c \ 413 417 $(PATH_SUB_CURRENT)/$(KBUILD_TARGET)/SUPDrv-$(KBUILD_TARGET).def \ 414 SUPDrv.c 418 SUPDrv.c \ 419 SUPDrvAgnostic.c 415 420 ## @todo the SUPDrv-freebsd.def is most probably gonna break it and require build system hacking... 416 421 … … 454 459 vboxdrv_SOURCES = \ 455 460 $(KBUILD_TARGET)/SUPDrv-$(KBUILD_TARGET).c \ 456 SUPDrv.c 461 SUPDrv.c \ 462 SUPDrvAgnostic.c 457 463 458 464 endif # solaris -
trunk/src/VBox/HostDrivers/Support/SUPDrv.c
r23699 r23725 50 50 #include <VBox/log.h> 51 51 #include <VBox/err.h> 52 #include <VBox/hwacc_svm.h>53 #include <VBox/hwacc_vmx.h>54 52 #if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) 55 53 # include <iprt/crc32.h> … … 3679 3677 3680 3678 3681 SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *p Caps)3679 SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *pfCaps) 3682 3680 { 3683 3681 /* … … 3685 3683 */ 3686 3684 AssertReturn(SUP_IS_SESSION_VALID(pSession), VERR_INVALID_PARAMETER); 3687 AssertReturn(pCaps, VERR_INVALID_POINTER); 3688 3689 *pCaps = 0; 3690 3691 if (ASMHasCpuId()) 3692 { 3693 uint32_t u32FeaturesECX; 3694 uint32_t u32Dummy; 3695 uint32_t u32FeaturesEDX; 3696 uint32_t u32VendorEBX, u32VendorECX, u32VendorEDX, u32AMDFeatureEDX, u32AMDFeatureECX; 3697 uint64_t val; 3698 3699 ASMCpuId(0, &u32Dummy, &u32VendorEBX, &u32VendorECX, &u32VendorEDX); 3700 ASMCpuId(1, &u32Dummy, &u32Dummy, &u32FeaturesECX, &u32FeaturesEDX); 3701 /* Query AMD features. */ 3702 ASMCpuId(0x80000001, &u32Dummy, &u32Dummy, &u32AMDFeatureECX, &u32AMDFeatureEDX); 3703 3704 if ( u32VendorEBX == X86_CPUID_VENDOR_INTEL_EBX 3705 && u32VendorECX == X86_CPUID_VENDOR_INTEL_ECX 3706 && u32VendorEDX == X86_CPUID_VENDOR_INTEL_EDX 3707 ) 3708 { 3709 if ( (u32FeaturesECX & X86_CPUID_FEATURE_ECX_VMX) 3710 && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_MSR) 3711 && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_FXSR) 3712 ) 3713 { 3714 val = ASMRdMsr(MSR_IA32_FEATURE_CONTROL); 3715 /* 3716 * Both the LOCK and VMXON bit must be set; otherwise VMXON will generate a #GP. 3717 * Once the lock bit is set, this MSR can no longer be modified. 3718 */ 3719 if ( (val & (MSR_IA32_FEATURE_CONTROL_VMXON|MSR_IA32_FEATURE_CONTROL_LOCK)) 3720 == (MSR_IA32_FEATURE_CONTROL_VMXON|MSR_IA32_FEATURE_CONTROL_LOCK) /* enabled and locked */ 3721 || !(val & MSR_IA32_FEATURE_CONTROL_LOCK) /* not enabled, but not locked either */) 3722 { 3723 VMX_CAPABILITY vtCaps; 3724 3725 *pCaps |= SUPVTCAPS_VT_X; 3726 3727 vtCaps.u = ASMRdMsr(MSR_IA32_VMX_PROCBASED_CTLS); 3728 if (vtCaps.n.allowed1 & VMX_VMCS_CTRL_PROC_EXEC_USE_SECONDARY_EXEC_CTRL) 3729 { 3730 vtCaps.u = ASMRdMsr(MSR_IA32_VMX_PROCBASED_CTLS2); 3731 if (vtCaps.n.allowed1 & VMX_VMCS_CTRL_PROC_EXEC2_EPT) 3732 *pCaps |= SUPVTCAPS_NESTED_PAGING; 3733 } 3734 return VINF_SUCCESS; 3735 } 3736 else 3737 return VERR_VMX_MSR_LOCKED_OR_DISABLED; 3738 } 3739 else 3740 return VERR_VMX_NO_VMX; 3741 } 3742 else 3743 if ( u32VendorEBX == X86_CPUID_VENDOR_AMD_EBX 3744 && u32VendorECX == X86_CPUID_VENDOR_AMD_ECX 3745 && u32VendorEDX == X86_CPUID_VENDOR_AMD_EDX 3746 ) 3747 { 3748 if ( (u32AMDFeatureECX & X86_CPUID_AMD_FEATURE_ECX_SVM) 3749 && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_MSR) 3750 && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_FXSR) 3751 ) 3752 { 3753 /* Check if SVM is disabled */ 3754 val = ASMRdMsr(MSR_K8_VM_CR); 3755 if (!(val & MSR_K8_VM_CR_SVM_DISABLE)) 3756 { 3757 *pCaps |= SUPVTCAPS_AMD_V; 3758 3759 /* Query AMD features. */ 3760 ASMCpuId(0x8000000A, &u32Dummy, &u32Dummy, &u32Dummy, &u32FeaturesEDX); 3761 3762 if (u32FeaturesEDX & AMD_CPUID_SVM_FEATURE_EDX_NESTED_PAGING) 3763 *pCaps |= SUPVTCAPS_NESTED_PAGING; 3764 3765 return VINF_SUCCESS; 3766 } 3767 else 3768 return VERR_SVM_DISABLED; 3769 } 3770 else 3771 return VERR_SVM_NO_SVM; 3772 } 3773 } 3774 return VERR_UNSUPPORTED_CPU; 3685 AssertPtrReturn(pfCaps, VERR_INVALID_POINTER); 3686 3687 return supR0QueryVTCaps(pfCaps); 3775 3688 } 3776 3689 -
trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h
r23526 r23725 47 47 #include <iprt/err.h> 48 48 49 50 #if defined(RT_OS_WINDOWS) 49 #ifdef SUPDRV_AGNOSTIC 50 /* do nothing */ 51 52 #elif defined(RT_OS_WINDOWS) 51 53 RT_C_DECLS_BEGIN 52 54 # if (_MSC_VER >= 1400) && !defined(VBOX_WITH_PATCHED_DDK) … … 186 188 187 189 /* check kernel version */ 188 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0) 189 # error Unsupported kernel version! 190 #endif 190 # ifndef SUPDRV_AGNOSTIC 191 # if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0) 192 # error Unsupported kernel version! 193 # endif 194 # endif 191 195 192 196 RT_C_DECLS_BEGIN … … 531 535 * This is NIL_RTR0PROCESS for kernel sessions and valid for user ones. */ 532 536 RTR0PROCESS R0Process; 533 #if defined(RT_OS_DARWIN) 537 #ifndef SUPDRV_AGNOSTIC 538 # if defined(RT_OS_DARWIN) 534 539 /** Pointer to the associated org_virtualbox_SupDrvClient object. */ 535 540 void *pvSupDrvClient; 536 541 /** Whether this session has been opened or not. */ 537 542 bool fOpened; 538 # endif539 # if defined(RT_OS_OS2)543 # endif 544 # if defined(RT_OS_OS2) 540 545 /** The system file number of this session. */ 541 546 uint16_t sfn; 542 547 uint16_t Alignment; /**< Alignment */ 543 # endif544 # if defined(RT_OS_DARWIN) || defined(RT_OS_OS2) || defined(RT_OS_SOLARIS)548 # endif 549 # if defined(RT_OS_DARWIN) || defined(RT_OS_OS2) || defined(RT_OS_SOLARIS) 545 550 /** Pointer to the next session with the same hash. */ 546 551 PSUPDRVSESSION pNextHash; 547 #endif 552 # endif 553 #endif /* !SUPDRV_AGNOSTIC */ 548 554 } SUPDRVSESSION; 549 555 … … 607 613 RTCPUID volatile idGipMaster; 608 614 609 #ifdef RT_OS_WINDOWS610 /* Callback object returned by ExCreateCallback. */611 PCALLBACK_OBJECT pObjPowerCallback;612 /* Callback handle returned by ExRegisterCallback. */613 PVOID hPowerCallback;614 #endif615 616 615 /** Component factory mutex. 617 616 * This protects pComponentFactoryHead and component factory querying. */ … … 619 618 /** The head of the list of registered component factories. */ 620 619 PSUPDRVFACTORYREG pComponentFactoryHead; 620 621 #ifndef SUPDRV_AGNOSTIC 622 # ifdef RT_OS_WINDOWS 623 /* Callback object returned by ExCreateCallback. */ 624 PCALLBACK_OBJECT pObjPowerCallback; 625 /* Callback handle returned by ExRegisterCallback. */ 626 PVOID hPowerCallback; 627 # endif 628 #endif 621 629 } SUPDRVDEVEXT; 622 630 … … 632 640 int VBOXCALL supdrvOSEnableVTx(bool fEnabled); 633 641 642 634 643 /******************************************************************************* 635 644 * Shared Functions * 636 645 *******************************************************************************/ 646 /* SUPDrv.c */ 637 647 int VBOXCALL supdrvIOCtl(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr); 638 648 int VBOXCALL supdrvIOCtlFast(uintptr_t uIOCtl, VMCPUID idCpu, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession); … … 649 659 bool VBOXCALL supdrvDetermineAsyncTsc(uint64_t *pu64DiffCores); 650 660 661 /* SUPDrvAgnostic.c */ 662 int VBOXCALL supR0QueryVTCaps(uint32_t *pfCaps); 663 651 664 RT_C_DECLS_END 652 665 -
trunk/src/VBox/HostDrivers/Support/SUPLib.cpp
r23704 r23725 2067 2067 } 2068 2068 2069 SUPR3DECL(int) SUPR3QueryVTCaps(uint32_t *pCaps) 2070 { 2071 AssertPtrReturn(pCaps, VERR_INVALID_POINTER); 2072 2073 *pCaps = 0; 2069 2070 SUPR3DECL(int) SUPR3QueryVTCaps(uint32_t *pfCaps) 2071 { 2072 AssertPtrReturn(pfCaps, VERR_INVALID_POINTER); 2073 2074 *pfCaps = 0; 2074 2075 2075 2076 /* fake */ … … 2093 2094 rc = Req.Hdr.rc; 2094 2095 if (RT_SUCCESS(rc)) 2095 *p Caps = Req.u.Out.Caps;2096 } 2097 return rc; 2098 } 2099 2096 *pfCaps = Req.u.Out.Caps; 2097 } 2098 return rc; 2099 } 2100 -
trunk/src/VBox/HostDrivers/Support/freebsd/Makefile
r23526 r23725 43 43 freebsd/SUPDrv-freebsd.c \ 44 44 SUPDrv.c \ 45 SUPDrvAgnostic.c \ 45 46 alloc/heapsimple.c \ 46 47 common/err/RTErrConvertFromErrno.c \ -
trunk/src/VBox/HostDrivers/Support/freebsd/files_vboxdrv
r23711 r23725 76 76 ${PATH_ROOT}/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c=>freebsd/SUPDrv-freebsd.c \ 77 77 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrv.c=>SUPDrv.c \ 78 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvAgnostic.c=>SUPDrvAgnostic.c \ 78 79 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvIDC.h=>SUPDrvIDC.h \ 79 80 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvIOC.h=>SUPDrvIOC.h \ -
trunk/src/VBox/HostDrivers/Support/linux/Makefile
r21549 r23725 77 77 linux/SUPDrv-linux.o \ 78 78 SUPDrv.o \ 79 SUPDrvAgnostic.o \ 79 80 r0drv/alloc-r0drv.o \ 80 81 r0drv/initterm-r0drv.o \ -
trunk/src/VBox/HostDrivers/Support/linux/files_vboxdrv
r23710 r23725 68 68 ${PATH_ROOT}/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c=>linux/SUPDrv-linux.c \ 69 69 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrv.c=>SUPDrv.c \ 70 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvAgnostic.c=>SUPDrvAgnostic.c \ 70 71 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvIDC.h=>SUPDrvIDC.h \ 71 72 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvIOC.h=>SUPDrvIOC.h \
Note:
See TracChangeset
for help on using the changeset viewer.