Changeset 40777 in vbox
- Timestamp:
- Apr 5, 2012 3:18:37 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 9 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/sup.h
r40769 r40777 1527 1527 1528 1528 SUPR0DECL(int) SUPR0TracerRegisterImpl(void *hMod, PSUPDRVSESSION pSession, PCSUPDRVTRACERREG pReg, PCSUPDRVTRACERHLP *ppHlp); 1529 SUPR0DECL(int) SUPR0TracerDeregisterImpl( PSUPDRVSESSION pSession);1529 SUPR0DECL(int) SUPR0TracerDeregisterImpl(void *hMod, PSUPDRVSESSION pSession); 1530 1530 SUPR0DECL(int) SUPR0TracerRegisterDrv(PSUPDRVSESSION pSession, struct VTGOBJHDR *pVtgHdr, const char *pszName); 1531 1531 SUPR0DECL(void) SUPR0TracerDeregisterDrv(PSUPDRVSESSION pSession); -
trunk/src/VBox/HostDrivers/Support/Makefile.kmk
r40759 r40777 319 319 VBoxDrv_INST.darwin = $(INST_VBOXDRV)Contents/MacOS/ 320 320 VBoxDrv_DEFS := IN_RT_R0 IN_SUP_R0 SUPDRV_WITH_RELEASE_LOGGER VBOX_SVN_REV=$(VBOX_SVN_REV) 321 ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER322 VBoxDrv_DEFS += VBOX_WITH_SUPDRV_GENERIC_TRACER323 endif324 321 ifdef VBOX_WITH_DTRACE_R0DRV 325 322 VBoxDrv_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R0DRV … … 350 347 SUPDrv.c \ 351 348 SUPDrvSem.c \ 349 SUPDrvTracer.cpp \ 352 350 SUPDrv.d 353 if def VBOX_WITH_SUPDRV_GENERIC_TRACER351 ifn1of ($(KBUILD_TARGET), linux freebsd) 354 352 VBoxDrv_SOURCES += \ 355 SUPDrv-tracer.cpp353 SUPDrvTracerA.asm 356 354 endif 357 355 ifdef VBOX_WITH_DTRACE_R0DRV -
trunk/src/VBox/HostDrivers/Support/SUPDrv-dtrace.cpp
r40763 r40777 1 #error FIXME 1 2 /* $Id$ */ 2 3 /** @file -
trunk/src/VBox/HostDrivers/Support/SUPDrv.c
r40770 r40777 1 /* $ Revision$ */1 /* $Id$ */ 2 2 /** @file 3 3 * VBoxDrv - The VirtualBox Support Driver - Common code. … … 469 469 if (RT_SUCCESS(rc)) 470 470 { 471 #ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER472 471 rc = supdrvTracerInit(pDevExt); 473 #elif defined(VBOX_WITH_DTRACE_R0DRV)474 rc = supdrvVtgInit(pDevExt, &g_aFunctions[10]);475 472 if (RT_SUCCESS(rc)) 476 #endif477 473 { 478 474 pDevExt->pLdrInitImage = NULL; … … 536 532 } 537 533 538 #if defined(VBOX_WITH_SUPDRV_GENERIC_TRACER) || defined(VBOX_WITH_DTRACE_R0DRV)539 534 supdrvGipDestroy(pDevExt); 540 #endif541 535 } 542 536 … … 636 630 pDevExt->spinGip = NIL_RTSPINLOCK; 637 631 638 #ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER639 632 supdrvTracerTerm(pDevExt); 640 #elif defined(VBOX_WITH_DTRACE_R0DRV)641 supdrvVtgTerm(pDevExt);642 #endif643 633 644 634 #ifdef SUPDRV_WITH_RELEASE_LOGGER … … 829 819 Log2(("release objects - done\n")); 830 820 831 #ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER832 821 /* 833 822 * Do tracer cleanups related to this session. … … 836 825 supdrvTracerCleanupSession(pDevExt, pSession); 837 826 Log2(("release tracer stuff - end\n")); 838 #endif839 827 840 828 /* … … 3688 3676 3689 3677 3690 #if (!defined(VBOX_WITH_SUPDRV_GENERIC_TRACER) && !defined(VBOX_WITH_DTRACE_R0DRV)) \3691 || defined(RT_OS_SOLARIS)3692 /**3693 * Stub function.3694 */3695 SUPR0DECL(void) SUPR0TracerFireProbe(uint32_t idProbe, uintptr_t uArg0, uintptr_t uArg1, uintptr_t uArg2,3696 uintptr_t uArg3, uintptr_t uArg4)3697 {3698 NOREF(idProbe); NOREF(uArg0); NOREF(uArg1); NOREF(uArg2); NOREF(uArg3); NOREF(uArg4);3699 }3700 #endif3701 3702 #if !defined(VBOX_WITH_SUPDRV_GENERIC_TRACER) && !defined(VBOX_WITH_DTRACE_R0DRV)3703 /**3704 * Stub function.3705 */3706 SUPR0DECL(int) SUPR0TracerRegisterModule(void *hMod, struct VTGOBJHDR *pVtgHdr)3707 {3708 NOREF(hMod); NOREF(pVtgHdr);3709 return VINF_SUCCESS;3710 }3711 #endif3712 3713 3714 3678 /** 3715 3679 * Adds a memory object to the session. … … 4174 4138 { 4175 4139 /* Inform the tracing component in case ModuleInit registered TPs. */ 4176 #ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER4177 4140 supdrvTracerModuleUnloading(pDevExt, pImage); 4178 #elif defined(VBOX_WITH_DTRACE_R0DRV)4179 supdrvVtgModuleUnloading(pDevExt, pImage);4180 #endif4181 4141 4182 4142 pImage->uState = SUP_IOCTL_LDR_OPEN; … … 4625 4585 4626 4586 /* Inform the tracing component. */ 4627 #ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER4628 4587 supdrvTracerModuleUnloading(pDevExt, pImage); 4629 #elif defined(VBOX_WITH_DTRACE_R0DRV)4630 supdrvVtgModuleUnloading(pDevExt, pImage);4631 #endif4632 4588 4633 4589 /* do native unload if appropriate. */ -
trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h
r40769 r40777 436 436 * This is NIL_RTR0PROCESS for kernel sessions and valid for user ones. */ 437 437 RTR0PROCESS R0Process; 438 #ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER439 438 /** Per session tracer specfic data. */ 440 439 uintptr_t uTracerData; 441 #endif442 440 #ifndef SUPDRV_AGNOSTIC 443 441 # if defined(RT_OS_DARWIN) … … 543 541 PSUPDRVFACTORYREG pComponentFactoryHead; 544 542 545 #ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER546 543 /** Lock protecting The tracer members. */ 547 544 RTSEMFASTMUTEX mtxTracer; … … 561 558 bool fTracerUnloading; 562 559 563 #elif defined(VBOX_WITH_DTRACE_R0DRV)564 /** Lock protecting The DTrace members. */565 RTSEMFASTMUTEX mtxDTrace;566 /** List of DTrace providers (SUPDRVDTPROVIDER). */567 RTLISTANCHOR DtProviderList;568 /** List of zombie DTrace providers (SUPDRVDTPROVIDER). */569 RTLISTANCHOR DtProviderZombieList;570 #endif571 572 560 /* 573 561 * Note! The non-agnostic bits must be a the very end of the structure! … … 659 647 void VBOXCALL supdrvCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession); 660 648 661 #ifdef VBOX_WITH_DTRACE_R0DRV662 int VBOXCALL supdrvVtgInit(PSUPDRVDEVEXT pDevExt, PSUPFUNC pVtgFireProbe);663 void VBOXCALL supdrvVtgTerm(PSUPDRVDEVEXT pDevExt);664 void VBOXCALL supdrvVtgModuleUnloading(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage);665 #endif666 667 #ifdef VBOX_WITH_SUPDRV_GENERIC_TRACER668 649 int VBOXCALL supdrvTracerInit(PSUPDRVDEVEXT pDevExt); 669 650 void VBOXCALL supdrvTracerTerm(PSUPDRVDEVEXT pDevExt); 670 651 void VBOXCALL supdrvTracerModuleUnloading(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage); 671 652 void VBOXCALL supdrvTracerCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession); 672 #endif 653 extern PFNRT g_pfnSupdrvProbeFireKernel; 654 DECLASM(void) supdrvTracerProbeFireStub(void); 673 655 674 656 -
trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp
r40765 r40777 1 1 /* $Id$ */ 2 2 /** @file 3 * VBoxDrv - The VirtualBox Support Driver - GenericTracer Interface.3 * VBoxDrv - The VirtualBox Support Driver - Tracer Interface. 4 4 */ 5 5 … … 91 91 * Global Variables * 92 92 *******************************************************************************/ 93 /** The address of the current probe fire routine for kernel mode. */ 94 PFNRT g_pfnSupdrvProbeFireKernel = supdrvTracerProbeFireStub; 93 95 94 96 … … 366 368 rc = VINF_SUCCESS; 367 369 else 368 rc = pDevExt->pTracerOps->pfn DeregisterProvider(pDevExt->pTracerOps, &pProv->Core);370 rc = pDevExt->pTracerOps->pfnProviderDeregister(pDevExt->pTracerOps, &pProv->Core); 369 371 if (RT_SUCCESS(rc)) 370 372 { … … 392 394 RTListForEachSafe(&pDevExt->TracerProviderZombieList, pProv, pProvNext, SUPDRVTPPROVIDER, ListEntry) 393 395 { 394 int rc = pDevExt->pTracerOps->pfn DeregisterZombieProvider(pDevExt->pTracerOps, &pProv->Core);396 int rc = pDevExt->pTracerOps->pfnProviderDeregisterZombie(pDevExt->pTracerOps, &pProv->Core); 395 397 if (RT_SUCCESS(rc)) 396 398 { … … 443 445 444 446 if (pDevExt->pTracerOps) 445 rc = pDevExt->pTracerOps->pfn DeregisterZombieProvider(pDevExt->pTracerOps, &pProv->Core);447 rc = pDevExt->pTracerOps->pfnProviderDeregisterZombie(pDevExt->pTracerOps, &pProv->Core); 446 448 else 447 449 rc = VINF_SUCCESS; … … 551 553 { 552 554 if (pDevExt->pTracerOps) 553 rc = pDevExt->pTracerOps->pfn RegisterProvider(pDevExt->pTracerOps, &pProv->Core);555 rc = pDevExt->pTracerOps->pfnProviderRegister(pDevExt->pTracerOps, &pProv->Core); 554 556 else 555 557 { … … 751 753 } 752 754 753 AssertPtrReturn(pReg->pfnRegisterProvider, VERR_INVALID_POINTER); 754 AssertPtrReturn(pReg->pfnDeregisterProvider, VERR_INVALID_POINTER); 755 AssertPtrReturn(pReg->pfnDeregisterZombieProvider, VERR_INVALID_POINTER); 755 AssertPtrReturn(pReg->pfnProbeFireKernel, VERR_INVALID_POINTER); 756 AssertPtrReturn(pReg->pfnProbeFireUser, VERR_INVALID_POINTER); 757 AssertPtrReturn(pReg->pfnTracerOpen, VERR_INVALID_POINTER); 758 AssertPtrReturn(pReg->pfnTracerIoCtl, VERR_INVALID_POINTER); 759 AssertPtrReturn(pReg->pfnTracerClose, VERR_INVALID_POINTER); 760 AssertPtrReturn(pReg->pfnProviderRegister, VERR_INVALID_POINTER); 761 AssertPtrReturn(pReg->pfnProviderDeregister, VERR_INVALID_POINTER); 762 AssertPtrReturn(pReg->pfnProviderDeregisterZombie, VERR_INVALID_POINTER); 756 763 757 764 /* … … 781 788 782 789 /** 783 * Deregister a tracer implementation associated with a ring-0 session. 790 * Common tracer implementation deregistration code. 791 * 792 * The caller sets fTracerUnloading prior to calling this function. 793 * 794 * @param pDevExt The device extension structure. 795 */ 796 static void supdrvTracerCommonDeregisterImpl(PSUPDRVDEVEXT pDevExt) 797 { 798 supdrvTracerRemoveAllProviders(pDevExt); 799 800 RTSemFastMutexRequest(pDevExt->mtxTracer); 801 pDevExt->pTracerImage = NULL; 802 pDevExt->pTracerSession = NULL; 803 pDevExt->pTracerOps = NULL; 804 pDevExt->fTracerUnloading = false; 805 RTSemFastMutexRelease(pDevExt->mtxTracer); 806 } 807 808 809 /** 810 * Deregister a tracer implementation. 811 * 812 * This should be called from the ModuleTerm code or from a ring-0 session. 784 813 * 785 814 * @returns VBox status code. 815 * @param hMod The module handle. 786 816 * @param pSession Ring-0 session handle. 787 817 */ 788 SUPR0DECL(int) SUPR0TracerDeregisterImpl(PSUPDRVSESSION pSession) 789 { 818 SUPR0DECL(int) SUPR0TracerDeregisterImpl(void *hMod, PSUPDRVSESSION pSession) 819 { 820 PSUPDRVLDRIMAGE pImage = (PSUPDRVLDRIMAGE)hMod; 790 821 PSUPDRVDEVEXT pDevExt; 791 822 int rc; … … 794 825 * Validate input and context. 795 826 */ 796 AssertReturn(SUP_IS_SESSION_VALID(pSession), VERR_INVALID_PARAMETER); 797 AssertReturn(pSession->R0Process == NIL_RTR0PROCESS, VERR_INVALID_PARAMETER); 798 pDevExt = pSession->pDevExt; 827 if (pImage) 828 { 829 AssertPtrReturn(pImage, VERR_INVALID_POINTER); 830 AssertReturn(pSession == NULL, VERR_INVALID_PARAMETER); 831 pDevExt = pImage->pDevExt; 832 } 833 else 834 { 835 AssertReturn(SUP_IS_SESSION_VALID(pSession), VERR_INVALID_PARAMETER); 836 AssertReturn(pSession->R0Process == NIL_RTR0PROCESS, VERR_INVALID_PARAMETER); 837 pDevExt = pSession->pDevExt; 838 } 799 839 AssertPtrReturn(pDevExt, VERR_INVALID_POINTER); 800 840 … … 805 845 if (RT_SUCCESS(rc)) 806 846 { 807 if (pDevExt->pTracerSession == pSession) 847 if ( pImage 848 ? pDevExt->pTracerImage == pImage 849 : pDevExt->pTracerSession == pSession) 808 850 { 809 851 pDevExt->fTracerUnloading = true; 810 852 RTSemFastMutexRelease(pDevExt->mtxTracer); 811 812 supdrvTracerRemoveAllProviders(pDevExt); 813 814 RTSemFastMutexRequest(pDevExt->mtxTracer); 815 pDevExt->pTracerImage = NULL; 816 pDevExt->pTracerSession = NULL; 817 pDevExt->pTracerOps = NULL; 818 pDevExt->fTracerUnloading = false; 853 supdrvTracerCommonDeregisterImpl(pDevExt); 819 854 } 820 855 else 856 { 821 857 rc = VERR_SUPDRV_TRACER_NOT_REGISTERED; 822 RTSemFastMutexRelease(pDevExt->mtxTracer); 858 RTSemFastMutexRelease(pDevExt->mtxTracer); 859 } 823 860 } 824 861 825 862 return rc; 826 863 } 864 865 866 /* 867 * The probe function is a bit more fun since we need tail jump optimizating. 868 * 869 * Since we cannot ship yasm sources for linux and freebsd, owing to the cursed 870 * rebuilding of the kernel module from scratch at install time, we have to 871 * deploy some ugly gcc inline assembly here. 872 */ 873 #if defined(__GNUC__) && (defined(RT_OS_FREEBSD) || defined(RT_OS_LINUX)) 874 # if 0 /* Need to check this out on linux (on mac now) */ 875 /*DECLASM(void) supdrvTracerProbeFireStub(void);*/ 876 __asm__ __volatile__("\ 877 .pushsection .text \ 878 \ 879 .p2align 2,,3 \ 880 .type supdrvTracerProbeFireStub,@function \ 881 .global supdrvTracerProbeFireStub \ 882 supdrvTracerProbeFireStub: \ 883 ret \ 884 supdrvTracerProbeFireStub_End: \ 885 .size supdrvTracerProbeFireStub_End - supdrvTracerProbeFireStub \ 886 \ 887 .p2align 2,,3 \ 888 .global SUPR0TracerFireProbe \ 889 SUPR0TracerFireProbe: \ 890 "); 891 # if defined(RT_ARCH_AMD64) 892 __asm__ __volatile__(" \ 893 mov g_pfnSupdrvProbeFireKernel(%rip), %rax \ 894 jmp *%rax \ 895 "); 896 # elif defined(RT_ARCH_X86) 897 __asm__ __volatile__(" \ 898 mov g_pfnSupdrvProbeFireKernel, %eax \ 899 jmp *%eax \ 900 "); 901 # else 902 # error "Which arch is this?" 903 #endif 904 __asm__ __volatile__(" \ 905 SUPR0TracerFireProbe_End: \ 906 .size SUPR0TracerFireProbe_End - SUPR0TracerFireProbe \ 907 .popsection \ 908 "); 909 910 # else 911 SUPR0DECL(void) SUPR0TracerFireProbe(uint32_t idProbe, uintptr_t uArg0, uintptr_t uArg1, uintptr_t uArg2, 912 uintptr_t uArg3, uintptr_t uArg4) 913 { 914 return; 915 } 916 # endif 917 #endif 827 918 828 919 … … 847 938 pDevExt->fTracerUnloading = true; 848 939 RTSemFastMutexRelease(pDevExt->mtxTracer); 849 850 supdrvTracerRemoveAllProviders(pDevExt); 851 852 RTSemFastMutexRequest(pDevExt->mtxTracer); 853 pDevExt->pTracerImage = NULL; 854 pDevExt->pTracerSession = NULL; 855 pDevExt->pTracerOps = NULL; 856 pDevExt->fTracerUnloading = false; 857 RTSemFastMutexRelease(pDevExt->mtxTracer); 940 supdrvTracerCommonDeregisterImpl(pDevExt); 858 941 } 859 942 else … … 894 977 if (pSession->R0Process == NIL_RTR0PROCESS) 895 978 { 896 SUPDRVTPPROVIDER *p NextProv;979 SUPDRVTPPROVIDER *pProvNext; 897 980 SUPDRVTPPROVIDER *pProv; 898 981 … … 908 991 RTSemFastMutexRelease(pDevExt->mtxTracer); 909 992 910 (void)SUPR0TracerDeregister (pSession);993 (void)SUPR0TracerDeregisterImpl(NULL, pSession); 911 994 } 912 995 … … 919 1002 if ( pSession->uTracerData 920 1003 && pDevExt->pTracerOps) 921 p Session->pTracerOps->pfnCloseTrace(pSession->pTracerOps, pSession, pSession->uTracerData);1004 pDevExt->pTracerOps->pfnTracerClose(pDevExt->pTracerOps, pSession, pSession->uTracerData); 922 1005 pSession->uTracerData = 0; 923 1006 RTSemFastMutexRelease(pDevExt->mtxTracer); … … 946 1029 RTListInit(&pDevExt->TracerProviderZombieList); 947 1030 1031 #ifdef VBOX_WITH_DTRACE_R0DRV 948 1032 rc = supdrvTracerRegisterVtgObj(pDevExt, &g_VTGObjHeader, _1M, NULL /*pImage*/, NULL /*pSession*/, "vboxdrv"); 949 1033 if (RT_SUCCESS(rc)) 1034 #endif 950 1035 return rc; 951 1036 RTSemFastMutexDestroy(pDevExt->mtxTracer); -
trunk/src/VBox/HostDrivers/Support/freebsd/Makefile
r37233 r40777 39 39 SUPDrv.c \ 40 40 SUPDrvSem.c \ 41 SUPDrvSemTracer.c \ 41 42 42 43 # Include needed interface headers so they are created during build -
trunk/src/VBox/HostDrivers/Support/freebsd/files_vboxdrv
r37955 r40777 79 79 ${PATH_ROOT}/include/VBox/version.h=>include/VBox/version.h \ 80 80 ${PATH_ROOT}/include/VBox/SUPDrvMangling.h=>include/VBox/SUPDrvMangling.h \ 81 ${PATH_ROOT}/include/VBox/VBoxTpG.h=>include/VBox/VBoxTpG.h \ 81 82 ${PATH_ROOT}/include/VBox/vmm/hwacc_vmx.h=>include/VBox/vmm/hwacc_vmx.h \ 82 83 ${PATH_ROOT}/include/VBox/vmm/hwacc_svm.h=>include/VBox/vmm/hwacc_svm.h \ … … 84 85 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrv.c=>SUPDrv.c \ 85 86 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvSem.c=>SUPDrvSem.c \ 87 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp=>SUPDrvTracer.c \ 86 88 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvIDC.h=>SUPDrvIDC.h \ 87 89 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvIOC.h=>SUPDrvIOC.h \ -
trunk/src/VBox/HostDrivers/Support/linux/Makefile
r39400 r40777 74 74 SUPDrv.o \ 75 75 SUPDrvSem.o \ 76 SUPDrvTracer.o \ 76 77 r0drv/alloc-r0drv.o \ 77 78 r0drv/initterm-r0drv.o \ -
trunk/src/VBox/HostDrivers/Support/linux/files_vboxdrv
r37955 r40777 73 73 ${PATH_ROOT}/include/VBox/types.h=>include/VBox/types.h \ 74 74 ${PATH_ROOT}/include/VBox/SUPDrvMangling.h=>include/VBox/SUPDrvMangling.h \ 75 ${PATH_ROOT}/include/VBox/VBoxTpG.h=>include/VBox/VBoxTpG.h \ 75 76 ${PATH_ROOT}/include/VBox/vmm/hwacc_vmx.h=>include/VBox/vmm/hwacc_vmx.h \ 76 77 ${PATH_ROOT}/include/VBox/vmm/hwacc_svm.h=>include/VBox/vmm/hwacc_svm.h \ … … 78 79 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrv.c=>SUPDrv.c \ 79 80 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvSem.c=>SUPDrvSem.c \ 81 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp=>SUPDrvTracer.c \ 80 82 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvIDC.h=>SUPDrvIDC.h \ 81 83 ${PATH_ROOT}/src/VBox/HostDrivers/Support/SUPDrvIOC.h=>SUPDrvIOC.h \
Note:
See TracChangeset
for help on using the changeset viewer.