Changeset 57229 in vbox for trunk/src/VBox/HostDrivers/Support
- Timestamp:
- Aug 6, 2015 11:34:04 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 101982
- Location:
- trunk/src/VBox/HostDrivers/Support
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp
r57220 r57229 107 107 #if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) 108 108 # define SUPDRV_CHECK_SMAP_SETUP() uint32_t const fKernelFeatures = SUPR0GetKernelFeatures() 109 # define SUPDRV_CHECK_SMAP_CHECK(a_ BadExpr) \109 # define SUPDRV_CHECK_SMAP_CHECK(a_pDevExt, a_BadExpr) \ 110 110 do { \ 111 111 if (fKernelFeatures & SUPKERNELFEATURES_SMAP) \ 112 112 { \ 113 RTCCUINTREG uEFlags= ASMGetFlags(); \114 if (RT_LIKELY( uEFlags& X86_EFL_AC)) \113 RTCCUINTREG fEfl = ASMGetFlags(); \ 114 if (RT_LIKELY(fEfl & X86_EFL_AC)) \ 115 115 { /* likely */ } \ 116 116 else \ 117 117 { \ 118 SUPR0Printf("%s, line %d: EFLAGS.AC is clear! (%#x)\n", __FUNCTION__, __LINE__, (uint32_t)uEFlags); \118 supdrvBadContext(a_pDevExt, "SUPDrv.cpp", __LINE__, "EFLAGS.AC is 0!"); \ 119 119 a_BadExpr; \ 120 120 } \ … … 122 122 } while (0) 123 123 #else 124 # define SUPDRV_CHECK_SMAP_SETUP() uint32_t const fKernelFeatures = 0125 # define SUPDRV_CHECK_SMAP_CHECK(a_ BadExpr)NOREF(fKernelFeatures)124 # define SUPDRV_CHECK_SMAP_SETUP() uint32_t const fKernelFeatures = 0 125 # define SUPDRV_CHECK_SMAP_CHECK(a_pDevExt, a_BadExpr) NOREF(fKernelFeatures) 126 126 #endif 127 127 … … 189 189 { "SUPIsTscFreqCompatible", (void *)SUPIsTscFreqCompatible }, 190 190 { "SUPIsTscFreqCompatibleEx", (void *)SUPIsTscFreqCompatibleEx }, 191 { "SUPR0BadContext", (void *)SUPR0BadContext }, 191 192 { "SUPR0ComponentDeregisterFactory", (void *)SUPR0ComponentDeregisterFactory }, 192 193 { "SUPR0ComponentQueryFactory", (void *)SUPR0ComponentQueryFactory }, … … 3642 3643 3643 3644 /** 3645 * Reports a bad context, currenctly that means EFLAGS.AC is 0 instead of 1. 3646 * 3647 * @param pSession The session of the caller. 3648 * @param pszFile The source file where the caller detected the bad 3649 * context. 3650 * @param uLine The line number in @a pszFile. 3651 * @param pszExtra Optional additional message to give further hints. 3652 */ 3653 void VBOXCALL supdrvBadContext(PSUPDRVDEVEXT pDevExt, const char *pszFile, uint32_t uLine, const char *pszExtra) 3654 { 3655 uint32_t cCalls; 3656 3657 /* 3658 * Shorten the filename before displaying the message. 3659 */ 3660 for (;;) 3661 { 3662 const char *pszTmp = strchr(pszFile, '/'); 3663 if (!pszTmp) 3664 pszTmp = strchr(pszFile, '\\'); 3665 if (!pszTmp) 3666 break; 3667 pszFile = pszTmp + 1; 3668 } 3669 if (RT_VALID_PTR(pszExtra) && *pszExtra) 3670 SUPR0Printf("vboxdrv: Bad CPU context error at line %u in %s: %s\n", uLine, pszFile, pszExtra); 3671 else 3672 SUPR0Printf("vboxdrv: Bad CPU context error at line %u in %s!\n", uLine, pszFile); 3673 3674 /* 3675 * Record the incident so that we stand a chance of blocking I/O controls 3676 * before panicing the system. 3677 */ 3678 cCalls = ASMAtomicIncU32(&pDevExt->cBadContextCalls); 3679 if (cCalls > UINT32_MAX - _1K) 3680 ASMAtomicWriteU32(&pDevExt->cBadContextCalls, UINT32_MAX - _1K); 3681 } 3682 3683 3684 /** 3685 * Reports a bad context, currenctly that means EFLAGS.AC is 0 instead of 1. 3686 * 3687 * @param pSession The session of the caller. 3688 * @param pszFile The source file where the caller detected the bad 3689 * context. 3690 * @param uLine The line number in @a pszFile. 3691 * @param pszExtra Optional additional message to give further hints. 3692 */ 3693 SUPR0DECL(void) SUPR0BadContext(PSUPDRVSESSION pSession, const char *pszFile, uint32_t uLine, const char *pszExtra) 3694 { 3695 PSUPDRVDEVEXT pDevExt; 3696 3697 AssertReturnVoid(SUP_IS_SESSION_VALID(pSession)); 3698 pDevExt = pSession->pDevExt; 3699 3700 supdrvBadContext(pDevExt, pszFile, uLine, pszExtra); 3701 } 3702 3703 3704 /** 3644 3705 * Gets the paging mode of the current CPU. 3645 3706 * … … 4475 4536 size_t cchName = strlen(pReq->u.In.szName); /* (caller checked < 32). */ 4476 4537 SUPDRV_CHECK_SMAP_SETUP(); 4477 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4538 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4478 4539 LogFlow(("supdrvIOCtl_LdrOpen: szName=%s cbImageWithTabs=%d\n", pReq->u.In.szName, pReq->u.In.cbImageWithTabs)); 4479 4540 … … 4482 4543 */ 4483 4544 supdrvLdrLock(pDevExt); 4484 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4545 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4485 4546 for (pImage = pDevExt->pLdrImages; pImage; pImage = pImage->pNext) 4486 4547 { … … 4497 4558 supdrvLdrAddUsage(pSession, pImage); 4498 4559 supdrvLdrUnlock(pDevExt); 4499 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4560 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4500 4561 return VINF_SUCCESS; 4501 4562 } … … 4526 4587 return /*VERR_NO_MEMORY*/ VERR_INTERNAL_ERROR_2; 4527 4588 } 4528 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4589 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4529 4590 4530 4591 /* … … 4560 4621 pImage->fNative = false; 4561 4622 rc = pImage->pvImageAlloc ? VINF_SUCCESS : VERR_NO_EXEC_MEMORY; 4562 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4623 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4563 4624 } 4564 4625 if (RT_FAILURE(rc)) … … 4585 4646 4586 4647 supdrvLdrUnlock(pDevExt); 4587 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4648 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4588 4649 return VINF_SUCCESS; 4589 4650 } … … 4647 4708 SUPDRV_CHECK_SMAP_SETUP(); 4648 4709 LogFlow(("supdrvIOCtl_LdrLoad: pvImageBase=%p cbImageWithBits=%d\n", pReq->u.In.pvImageBase, pReq->u.In.cbImageWithTabs)); 4649 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4710 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4650 4711 4651 4712 /* … … 4653 4714 */ 4654 4715 supdrvLdrLock(pDevExt); 4655 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4716 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4656 4717 4657 4718 pUsage = pSession->pLdrUsage; … … 4742 4803 if (RT_FAILURE(rc)) 4743 4804 return rc; 4744 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4805 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4745 4806 4746 4807 /* … … 4756 4817 else 4757 4818 rc = /*VERR_NO_MEMORY*/ VERR_INTERNAL_ERROR_3; 4758 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4819 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4759 4820 } 4760 4821 … … 4768 4829 else 4769 4830 rc = /*VERR_NO_MEMORY*/ VERR_INTERNAL_ERROR_4; 4770 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4831 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4771 4832 } 4772 4833 … … 4787 4848 Log(("vboxdrv: Loaded '%s' at %p\n", pImage->szName, pImage->pvImage)); 4788 4849 } 4789 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4850 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4790 4851 } 4791 4852 … … 4821 4882 pDevExt->pLdrInitImage = pImage; 4822 4883 pDevExt->hLdrInitThread = RTThreadNativeSelf(); 4823 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4884 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4824 4885 rc = pImage->pfnModuleInit(pImage); 4825 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4886 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4826 4887 pDevExt->pLdrInitImage = NULL; 4827 4888 pDevExt->hLdrInitThread = NIL_RTNATIVETHREAD; … … 4849 4910 4850 4911 supdrvLdrUnlock(pDevExt); 4851 SUPDRV_CHECK_SMAP_CHECK( RT_NOTHING);4912 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 4852 4913 return rc; 4853 4914 } -
trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h
r57218 r57229 215 215 * - nothing. 216 216 */ 217 #define SUPDRV_IOC_VERSION 0x0023000 2217 #define SUPDRV_IOC_VERSION 0x00230003 218 218 219 219 /** SUP_IOCTL_COOKIE. */ -
trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h
r57224 r57229 625 625 /** @} */ 626 626 627 /** Number of times someone reported bad execution context via SUPR0BadContext. 628 * (This is times EFLAGS.AC is zero when we expected it to be 1.) */ 629 uint32_t volatile cBadContextCalls; 627 630 628 631 /** GIP mutex. … … 952 955 uint32_t VBOXCALL supdrvSessionRetain(PSUPDRVSESSION pSession); 953 956 uint32_t VBOXCALL supdrvSessionRelease(PSUPDRVSESSION pSession); 957 void VBOXCALL supdrvBadContext(PSUPDRVDEVEXT pDevExt, const char *pszFile, uint32_t uLine, const char *pszExtra); 954 958 int VBOXCALL supdrvQueryVTCapsInternal(uint32_t *pfCaps); 955 959 -
trunk/src/VBox/HostDrivers/Support/SUPLib.cpp
r57218 r57229 280 280 CookieReq.u.In.u32ReqVersion = SUPDRV_IOC_VERSION; 281 281 const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x00230000 282 ? 0x0023000 0282 ? 0x00230003 283 283 : SUPDRV_IOC_VERSION & 0xffff0000; 284 284 CookieReq.u.In.u32MinVersion = uMinVersion; -
trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
r57220 r57229 79 79 #endif 80 80 81 /* Temporary debugging. */ 81 /* The following macros are duplicated in the-darwin-kernel.h. */ 82 #define IPRT_DARWIN_SAVE_EFL_AC() RTCCUINTREG const fSavedEfl = ASMGetFlags(); 83 #define IPRT_DARWIN_RESTORE_EFL_AC() ASMSetFlags(fSavedEfl) 84 #define IPRT_DARWIN_RESTORE_EFL_ONLY_AC() ASMChangeFlags(~X86_EFL_AC, fSavedEfl & X86_EFL_AC) 85 86 87 /* Temporary debugging - very temporary... */ 82 88 #define VBOX_PROC_SELFNAME_LEN (20) 83 #define VBOX_RETRIEVE_CUR_PROC_NAME(_name) 84 89 #define VBOX_RETRIEVE_CUR_PROC_NAME(_name) char _name[VBOX_PROC_SELFNAME_LEN]; \ 90 proc_selfname(pszProcName, VBOX_PROC_SELFNAME_LEN) 85 91 86 92 … … 586 592 PSUPDRVSESSION pSession; 587 593 594 #ifdef VBOX_WITH_EFLAGS_AC_SET_IN_VBOXDRV 595 /* 596 * Refuse all I/O control calls if we've ever detected EFLAGS.AC being cleared. 597 * 598 * This isn't a problem, as there is absolutely nothing in the kernel context that 599 * depend on user context triggering cleanups. That would be pretty wild, right? 600 */ 601 if (RT_UNLIKELY(g_DevExt.cBadContextCalls > 0)) 602 { 603 SUPR0Printf("VBoxDrvDarwinIOCtl: EFLAGS.AC=0 detected %u times, refusing all I/O controls!\n", g_DevExt.cBadContextCalls); 604 return EDEVERR; 605 } 606 #endif 607 588 608 /* 589 609 * Find the session. … … 651 671 #if defined(VBOX_STRICT) || defined(VBOX_WITH_EFLAGS_AC_SET_IN_VBOXDRV) 652 672 if (RT_UNLIKELY(!(ASMGetFlags() & X86_EFL_AC))) 653 SUPR0Printf("VBoxDrvDarwinIOCtlSMAP: someone cleared AC handling iCmd=%#lx\n", iCmd);673 supdrvBadContext(&g_DevExt, "SUPDrv-darwin.cpp", __LINE__, "VBoxDrvDarwinIOCtlSMAP"); 654 674 #endif 655 675 ASMSetFlags(fSavedEfl); … … 1435 1455 RTDECL(int) SUPR0Printf(const char *pszFormat, ...) 1436 1456 { 1457 IPRT_DARWIN_SAVE_EFL_AC(); 1437 1458 va_list va; 1438 1459 char szMsg[512]; … … 1444 1465 1445 1466 printf("%s", szMsg); 1467 1468 IPRT_DARWIN_RESTORE_EFL_AC(); 1446 1469 return 0; 1447 1470 }
Note:
See TracChangeset
for help on using the changeset viewer.