Changeset 43379 in vbox for trunk/src/VBox/HostDrivers/Support/darwin
- Timestamp:
- Sep 20, 2012 11:29:12 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 80845
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
r43308 r43379 43 43 #include <VBox/version.h> 44 44 #include <iprt/asm.h> 45 #include <iprt/asm-amd64-x86.h> 45 46 #include <iprt/initterm.h> 46 47 #include <iprt/assert.h> … … 50 51 #include <iprt/alloc.h> 51 52 #include <iprt/power.h> 53 #include <iprt/dbg.h> 52 54 #include <VBox/err.h> 53 55 #include <VBox/log.h> … … 99 101 static IOReturn VBoxDrvDarwinSleepHandler(void *pvTarget, void *pvRefCon, UInt32 uMessageType, IOService *pProvider, void *pvMessageArgument, vm_size_t argSize); 100 102 RT_C_DECLS_END 103 104 static void vboxdrvDarwinResolveSymbols(void); 101 105 102 106 … … 211 215 static int32_t volatile g_cSessions = 0; 212 216 /** The notifier handle for the sleep callback handler. */ 213 static IONotifier *g_pSleepNotifier = NULL; 214 217 static IONotifier *g_pSleepNotifier = NULL; 218 219 /** Pointer to vmx_suspend(). */ 220 static PFNRT g_pfnVmxSuspend = NULL; 221 /** Pointer to vmx_resume(). */ 222 static PFNRT g_pfnVmxResume = NULL; 223 /** Pointer to vmx_use_count. */ 224 static int volatile *g_pVmxUseCount = NULL; 215 225 216 226 … … 267 277 LogRel(("VBoxDrv: register for sleep/wakeup events failed\n")); 268 278 279 /* Find kernel symbols that are kind of optional. */ 280 vboxdrvDarwinResolveSymbols(); 269 281 return KMOD_RETURN_SUCCESS; 270 282 } … … 296 308 297 309 /** 310 * Resolves kernel symbols we want (but may do without). 311 */ 312 static void vboxdrvDarwinResolveSymbols(void) 313 { 314 RTDBGKRNLINFO hKrnlInfo; 315 int rc = RTR0DbgKrnlInfoOpen(&hKrnlInfo, 0); 316 if (RT_SUCCESS(rc)) 317 { 318 /* The VMX stuff. */ 319 int rc1 = RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, NULL, "vmx_resume", (void **)&g_pfnVmxResume); 320 int rc2 = RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, NULL, "vmx_suspend", (void **)&g_pfnVmxSuspend); 321 int rc3 = RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, NULL, "vmx_use_count", (void **)&g_pVmxUseCount); 322 if (RT_SUCCESS(rc1) && RT_SUCCESS(rc2) && RT_SUCCESS(rc3)) 323 { 324 LogRel(("VBoxDrv: vmx_resume=%p vmx_suspend=%p vmx_use_count=%p (%d) cr4=%#x\n", 325 g_pfnVmxResume, g_pfnVmxSuspend, g_pVmxUseCount, *g_pVmxUseCount, ASMGetCR4() )); 326 } 327 else 328 { 329 LogRel(("VBoxDrv: failed to resolve vmx stuff: vmx_resume=%Rrc vmx_suspend=%Rrc vmx_use_count=%Rrc", rc1, rc2, rc3)); 330 g_pfnVmxResume = NULL; 331 g_pfnVmxSuspend = NULL; 332 g_pVmxUseCount = NULL; 333 } 334 335 RTR0DbgKrnlInfoRelease(hKrnlInfo); 336 } 337 else 338 LogRel(("VBoxDrv: Failed to open kernel symbols, rc=%Rrc\n", rc)); 339 } 340 341 342 /** 298 343 * Stop the kernel module. 299 344 */ … … 711 756 712 757 /** 713 * Enables or disables VT-x using kernel functions. 714 * 715 * @returns VBox status code. VERR_NOT_SUPPORTED has a special meaning. 716 * @param fEnable Whether to enable or disable. 758 * @copydoc SUPR0EnableVTx 717 759 */ 718 760 int VBOXCALL supdrvOSEnableVTx(bool fEnable) … … 720 762 #ifdef VBOX_WITH_HOST_VMX 721 763 int rc; 722 if (version_major >= 10 /* 10 = 10.6.x = Snow Leopard */) 764 if ( version_major >= 10 /* 10 = 10.6.x = Snow Leopard */ 765 && g_pfnVmxSuspend 766 && g_pfnVmxResume 767 && g_pVmxUseCount) 723 768 { 724 769 if (fEnable) … … 736 781 rc = VERR_UNRESOLVED_ERROR; 737 782 } 783 LogRel(("VBoxDrv: host_vmxon -> vmx_use_count=%d rc=%Rrc\n", *g_pVmxUseCount, rc)); 738 784 } 739 785 else … … 741 787 host_vmxoff(); 742 788 rc = VINF_SUCCESS; 789 LogRel(("VBoxDrv: host_vmxoff -> vmx_use_count=%d\n", *g_pVmxUseCount)); 743 790 } 744 791 } … … 752 799 #else 753 800 return VERR_NOT_SUPPORTED; 801 #endif 802 } 803 804 805 /** 806 * @copydoc SUPR0SuspendVTxOnCpu 807 */ 808 bool VBOXCALL supdrvOSSuspendVTxOnCpu(void) 809 { 810 #ifdef VBOX_WITH_HOST_VMX 811 /* 812 * Consult the VMX usage counter, don't try suspend if not enabled. 813 * 814 * Note! The host_vmxon/off code is still race prone since, but this is 815 * currently the best we can do without always enable VMX when 816 * loading the driver. 817 */ 818 if ( g_pVmxUseCount 819 && *g_pVmxUseCount > 0) 820 { 821 g_pfnVmxSuspend(); 822 return true; 823 } 824 return false; 825 #else 826 return false; 827 #endif 828 } 829 830 831 /** 832 * @copydoc SUPR0ResumeVTxOnCpu 833 */ 834 void VBOXCALL supdrvOSResumeVTxOnCpu(bool fSuspended) 835 { 836 #ifdef VBOX_WITH_HOST_VMX 837 /* 838 * Don't consult the counter here, the state knows better. 839 * We're executing with interrupts disabled and anyone racing us with 840 * disabling VT-x will be waiting in the rendezvous code. 841 */ 842 if ( fSuspended 843 && g_pfnVmxResume) 844 g_pfnVmxResume(); 845 else 846 Assert(!fSuspended); 847 #else 848 Assert(!fSuspended); 754 849 #endif 755 850 }
Note:
See TracChangeset
for help on using the changeset viewer.