SUPDrv.c revision 6bcc5f03452f085dc92e64064762794ebe106346
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* $Revision$ */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * VBoxDrv - The VirtualBox Support Driver - Common code.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Copyright (C) 2006-2007 Sun Microsystems, Inc.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * This file is part of VirtualBox Open Source Edition (OSE), as
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * available from http://www.virtualbox.org. This file is free software;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * you can redistribute it and/or modify it under the terms of the GNU
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse * General Public License (GPL) as published by the Free Software
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse * Foundation, in version 2 as it comes in the "COPYING" file of the
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * The contents of this file may alternatively be used under the terms
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * of the Common Development and Distribution License Version 1.0
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * VirtualBox OSE distribution, in which case the provisions of the
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * CDDL are applicable instead of those of the GPL.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * You may elect to license modified versions of this file under the
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * terms and conditions of either the GPL or the CDDL or both.
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse * Clara, CA 95054 USA or visit http://www.sun.com if you need
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * additional information or have any questions.
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse/*******************************************************************************
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse* Header Files *
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse*******************************************************************************/
d86ef5503dcbc38e87c0e03cd3e1f16458cb6323rse#if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS) || defined(RT_OS_FREEBSD)
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* VBox/x86.h not compatible with the Linux kernel sources */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Logging assignments:
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Log - useful stuff, like failures.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * LogFlow - program flow, except the really noisy bits.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Log2 - Cleanup.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Log3 - Loader flow noise.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Log4 - Call VMMR0 flow noise.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Log5 - Native yet-to-be-defined noise.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Log6 - Native ioctl flow noise.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Logging requires BUILD_TYPE=debug and possibly changes to the logger
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * instanciation in log-vbox.c(pp).
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*******************************************************************************
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse* Defined Constants And Macros *
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse*******************************************************************************/
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* from x86.h - clashes with linux thus this duplication */
d1bb6e2664788e0437acc18e877562c9a796d7cerse/** The frequency by which we recalculate the u32UpdateHz and
7933d4a963def02417113b6798d87a36395053b0rse * u32UpdateIntervalNS GIP members. The value must be a power of 2. */
af5dd1c93d2185f7e37f8783c593b64fd35ea8a6wrowe * Validates a session pointer.
af5dd1c93d2185f7e37f8783c593b64fd35ea8a6wrowe * @returns true/false accordingly.
af5dd1c93d2185f7e37f8783c593b64fd35ea8a6wrowe * @param pSession The session.
af5dd1c93d2185f7e37f8783c593b64fd35ea8a6wrowe/** @def VBOX_SVN_REV
af5dd1c93d2185f7e37f8783c593b64fd35ea8a6wrowe * The makefile should define this if it can. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*******************************************************************************
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse* Internal Functions *
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse*******************************************************************************/
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic DECLCALLBACK(int) supdrvSessionObjHandleRetain(RTHANDLETABLE hHandleTable, void *pvObj, void *pvCtx, void *pvUser);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic DECLCALLBACK(void) supdrvSessionObjHandleDelete(RTHANDLETABLE hHandleTable, uint32_t h, void *pvObj, void *pvCtx, void *pvUser);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic int supdrvMemAdd(PSUPDRVMEMREF pMem, PSUPDRVSESSION pSession);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic int supdrvMemRelease(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr, SUPDRVMEMREFTYPE eType);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic int supdrvIOCtl_LdrOpen(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDROPEN pReq);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic int supdrvIOCtl_LdrLoad(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRLOAD pReq);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic int supdrvIOCtl_LdrFree(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRFREE pReq);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic int supdrvIOCtl_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic int supdrvIDC_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVIDCREQGETSYM pReq);
fe46444c8f32f00d040ebefa94bcd0c05ab15ab9martinstatic int supdrvLdrSetVMMR0EPs(PSUPDRVDEVEXT pDevExt, void *pvVMMR0, void *pvVMMR0EntryInt, void *pvVMMR0EntryFast, void *pvVMMR0EntryEx);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic void supdrvLdrUnsetVMMR0EPs(PSUPDRVDEVEXT pDevExt);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic int supdrvLdrAddUsage(PSUPDRVSESSION pSession, PSUPDRVLDRIMAGE pImage);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic void supdrvLdrFree(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic int supdrvIOCtl_CallServiceModule(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPCALLSERVICE pReq);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic int supdrvIOCtl_LoggerSettings(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLOGGERSETTINGS pReq);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic SUPGIPMODE supdrvGipDeterminTscMode(PSUPDRVDEVEXT pDevExt);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic DECLCALLBACK(void) supdrvGipSyncTimer(PRTTIMER pTimer, void *pvUser, uint64_t iTick);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic DECLCALLBACK(void) supdrvGipAsyncTimer(PRTTIMER pTimer, void *pvUser, uint64_t iTick);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrsestatic DECLCALLBACK(void) supdrvGipMpEvent(RTMPEVENT enmEvent, RTCPUID idCpu, void *pvUser);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) supdrvNtWrapVMMR0EntryEx(PFNRT pfnVMMR0EntryEx, PVM pVM, VMCPUID idCpu, unsigned uOperation, PSUPVMMR0REQHDR pReq, uint64_t u64Arg, PSUPDRVSESSION pSession);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) supdrvNtWrapVMMR0EntryFast(PFNRT pfnVMMR0EntryFast, PVM pVM, VMCPUID idCpu, unsigned uOperation);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) supdrvNtWrapObjDestructor(PFNRT pfnDestruction, void *pvObj, void *pvUser1, void *pvUser2);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void *) supdrvNtWrapQueryFactoryInterface(PFNRT pfnQueryFactoryInterface, struct SUPDRVFACTORY const *pSupDrvFactory, PSUPDRVSESSION pSession, const char *pszInterfaceUuid);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) supdrvNtWrapModuleInit(PFNRT pfnModuleInit);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) supdrvNtWrapModuleTerm(PFNRT pfnModuleTerm);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) supdrvNtWrapServiceReqHandler(PFNRT pfnServiceReqHandler, PSUPDRVSESSION pSession, uint32_t uOperation, uint64_t u64Arg, PSUPR0SERVICEREQHDR pReqHdr);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ComponentRegisterFactory)(PSUPDRVSESSION pSession, PCSUPDRVFACTORY pFactory);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ComponentDeregisterFactory)(PSUPDRVSESSION pSession, PCSUPDRVFACTORY pFactory);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ComponentQueryFactory)(PSUPDRVSESSION pSession, const char *pszName, const char *pszInterfaceUuid, void **ppvFactoryIf);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void *) UNWIND_WRAP(SUPR0ObjRegister)(PSUPDRVSESSION pSession, SUPDRVOBJTYPE enmType, PFNSUPDRVDESTRUCTOR pfnDestructor, void *pvUser1, void *pvUser2);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ObjAddRef)(void *pvObj, PSUPDRVSESSION pSession);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ObjAddRefEx)(void *pvObj, PSUPDRVSESSION pSession, bool fNoPreempt);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ObjRelease)(void *pvObj, PSUPDRVSESSION pSession);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ObjVerifyAccess)(void *pvObj, PSUPDRVSESSION pSession, const char *pszObjName);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0LockMem)(PSUPDRVSESSION pSession, RTR3PTR pvR3, uint32_t cPages, PRTHCPHYS paPages);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0UnlockMem)(PSUPDRVSESSION pSession, RTR3PTR pvR3);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ContAlloc)(PSUPDRVSESSION pSession, uint32_t cPages, PRTR0PTR ppvR0, PRTR3PTR ppvR3, PRTHCPHYS pHCPhys);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0ContFree)(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0LowAlloc)(PSUPDRVSESSION pSession, uint32_t cPages, PRTR0PTR ppvR0, PRTR3PTR ppvR3, PRTHCPHYS paPages);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0LowFree)(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0MemAlloc)(PSUPDRVSESSION pSession, uint32_t cb, PRTR0PTR ppvR0, PRTR3PTR ppvR3);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0MemGetPhys)(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr, PSUPPAGE paPages);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0MemFree)(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0PageAllocEx)(PSUPDRVSESSION pSession, uint32_t cPages, uint32_t fFlags, PRTR3PTR ppvR3, PRTR0PTR ppvR0, PRTHCPHYS paPages);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPR0PageFree)(PSUPDRVSESSION pSession, RTR3PTR pvR3);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse//DECLASM(int) UNWIND_WRAP(SUPR0Printf)(const char *pszFormat, ...);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventCreate)(PSUPDRVSESSION pSession, PSUPSEMEVENT phEvent);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventClose)(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventSignal)(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventWait)(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent, uint32_t cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventWaitNoResume)(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent, uint32_t cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventMultiCreate)(PSUPDRVSESSION pSession, PSUPSEMEVENTMULTI phEventMulti);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventMultiClose)(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventMultiSignal)(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventMultiReset)(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(SUPSemEventMultiWait)(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti, uint32_t cMillies);
0ae8e347b4a4fed718a28eee9ab4d774d1b04c74wroweDECLASM(int) UNWIND_WRAP(SUPSemEventMultiWaitNoResume)(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti, uint32_t cMillies);
a943533fd4d91d114af622731a405407990c4fb1rseDECLASM(SUPPAGINGMODE) UNWIND_WRAP(SUPR0GetPagingMode)(void);
a943533fd4d91d114af622731a405407990c4fb1rseDECLASM(void *) UNWIND_WRAP(RTMemAlloc)(size_t cb) RT_NO_THROW;
a943533fd4d91d114af622731a405407990c4fb1rseDECLASM(void *) UNWIND_WRAP(RTMemAllocZ)(size_t cb) RT_NO_THROW;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) UNWIND_WRAP(RTMemFree)(void *pv) RT_NO_THROW;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void *) UNWIND_WRAP(RTMemDup)(const void *pvSrc, size_t cb) RT_NO_THROW;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void *) UNWIND_WRAP(RTMemDupEx)(const void *pvSrc, size_t cbSrc, size_t cbExtra) RT_NO_THROW;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void *) UNWIND_WRAP(RTMemRealloc)(void *pvOld, size_t cbNew) RT_NO_THROW;
931b4fd1cc9dd3da096c45f4bf7ddcc14e0985c1dougmDECLASM(int) UNWIND_WRAP(RTR0MemObjAllocLow)(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable);
931b4fd1cc9dd3da096c45f4bf7ddcc14e0985c1dougmDECLASM(int) UNWIND_WRAP(RTR0MemObjAllocPage)(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable);
931b4fd1cc9dd3da096c45f4bf7ddcc14e0985c1dougmDECLASM(int) UNWIND_WRAP(RTR0MemObjAllocPhys)(PRTR0MEMOBJ pMemObj, size_t cb, RTHCPHYS PhysHighest);
931b4fd1cc9dd3da096c45f4bf7ddcc14e0985c1dougmDECLASM(int) UNWIND_WRAP(RTR0MemObjAllocPhysNC)(PRTR0MEMOBJ pMemObj, size_t cb, RTHCPHYS PhysHighest);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTR0MemObjAllocCont)(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTR0MemObjEnterPhys)(PRTR0MEMOBJ pMemObj, RTHCPHYS Phys, size_t cb);
e3458263658bd1ef8dc4eb6b6919564a6d4673f6dougmDECLASM(int) UNWIND_WRAP(RTR0MemObjLockUser)(PRTR0MEMOBJ pMemObj, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTR0MemObjMapKernel)(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTR0MemObjMapKernelEx)(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt, size_t offSub, size_t cbSub);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTR0MemObjMapUser)(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, RTR3PTR R3PtrFixed, size_t uAlignment, unsigned fProt, RTR0PROCESS R0Process);
a943533fd4d91d114af622731a405407990c4fb1rseDECLASM(int) UNWIND_WRAP(RTR0MemObjProtect)(RTR0MEMOBJ hMemObj, size_t offsub, size_t cbSub, uint32_t fProt);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*DECLASM(void *) UNWIND_WRAP(RTR0MemObjAddress)(RTR0MEMOBJ MemObj); - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*DECLASM(RTR3PTR) UNWIND_WRAP(RTR0MemObjAddressR3)(RTR0MEMOBJ MemObj); - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*DECLASM(size_t) UNWIND_WRAP(RTR0MemObjSize)(RTR0MEMOBJ MemObj); - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*DECLASM(bool) UNWIND_WRAP(RTR0MemObjIsMapping)(RTR0MEMOBJ MemObj); - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*DECLASM(RTHCPHYS) UNWIND_WRAP(RTR0MemObjGetPagePhysAddr)(RTR0MEMOBJ MemObj, size_t iPage); - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTR0MemObjFree)(RTR0MEMOBJ MemObj, bool fFreeMappings);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTR0MemUserCopyFrom)(void *pvDst, RTR3PTR R3PtrSrc, size_t cb);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTR0MemUserCopyTo)(RTR3PTR R3PtrDst, void const *pvSrc, size_t cb);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTR0MemUserIsValidAddr - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTR0MemKernelIsValidAddr - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTR0MemAreKrnlAndUsrDifferent - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTProcSelf - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTR0ProcHandleSelf - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemFastMutexCreate)(PRTSEMFASTMUTEX pMutexSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemFastMutexDestroy)(RTSEMFASTMUTEX MutexSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemFastMutexRequest)(RTSEMFASTMUTEX MutexSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemFastMutexRelease)(RTSEMFASTMUTEX MutexSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventCreate)(PRTSEMEVENT pEventSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventSignal)(RTSEMEVENT EventSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventWait)(RTSEMEVENT EventSem, unsigned cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventWaitNoResume)(RTSEMEVENT EventSem, unsigned cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventDestroy)(RTSEMEVENT EventSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventMultiCreate)(PRTSEMEVENTMULTI pEventMultiSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventMultiSignal)(RTSEMEVENTMULTI EventMultiSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventMultiReset)(RTSEMEVENTMULTI EventMultiSem);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventMultiWait)(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventMultiWaitNoResume)(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSemEventMultiDestroy)(RTSEMEVENTMULTI EventMultiSem);
a943533fd4d91d114af622731a405407990c4fb1rseDECLASM(int) UNWIND_WRAP(RTSpinlockCreate)(PRTSPINLOCK pSpinlock);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTSpinlockDestroy)(RTSPINLOCK Spinlock);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) UNWIND_WRAP(RTSpinlockAcquire)(RTSPINLOCK Spinlock, PRTSPINLOCKTMP pTmp);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) UNWIND_WRAP(RTSpinlockRelease)(RTSPINLOCK Spinlock, PRTSPINLOCKTMP pTmp);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) UNWIND_WRAP(RTSpinlockAcquireNoInts)(RTSPINLOCK Spinlock, PRTSPINLOCKTMP pTmp);
a943533fd4d91d114af622731a405407990c4fb1rseDECLASM(void) UNWIND_WRAP(RTSpinlockReleaseNoInts)(RTSPINLOCK Spinlock, PRTSPINLOCKTMP pTmp);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTTimeNanoTS - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTTimeMilliTS - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTTimeSystemNanoTS - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTTimeSystemMilliTS - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTThreadNativeSelf - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTThreadSleep)(unsigned cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTThreadSelf - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTThreadCreate)(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUser, size_t cbStack,
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse RTTHREADTYPE enmType, unsigned fFlags, const char *pszName);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(RTNATIVETHREAD) UNWIND_WRAP(RTThreadGetNative)(RTTHREAD Thread);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTThreadWait)(RTTHREAD Thread, unsigned cMillies, int *prc);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTThreadWaitNoResume)(RTTHREAD Thread, unsigned cMillies, int *prc);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(const char *) UNWIND_WRAP(RTThreadGetName)(RTTHREAD Thread);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(const char *) UNWIND_WRAP(RTThreadSelfName)(void);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(RTTHREADTYPE) UNWIND_WRAP(RTThreadGetType)(RTTHREAD Thread);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTThreadUserSignal)(RTTHREAD Thread);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTThreadUserReset)(RTTHREAD Thread);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTThreadUserWait)(RTTHREAD Thread, unsigned cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTThreadUserWaitNoResume)(RTTHREAD Thread, unsigned cMillies);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTThreadPreemptIsEnabled - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTThreadPreemptIsPending - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTThreadPreemptIsPendingTrusty - not necessary */
10bcdea056942e3b05159c76f070022a0aa5506arse/* RTThreadPreemptDisable - not necessary */
10bcdea056942e3b05159c76f070022a0aa5506arseDECLASM(void) UNWIND_WRAP(RTThreadPreemptRestore)(RTTHREADPREEMPTSTATE pState);
10bcdea056942e3b05159c76f070022a0aa5506arse/* RTLogDefaultInstance - a bit of a gamble, but we do not want the overhead! */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTMpCpuId - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTMpCpuIdFromSetIndex - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTMpCpuIdToSetIndex - not necessary */
10bcdea056942e3b05159c76f070022a0aa5506arse/* RTMpIsCpuPossible - not necessary */
10bcdea056942e3b05159c76f070022a0aa5506arse/* RTMpGetCount - not necessary */
10bcdea056942e3b05159c76f070022a0aa5506arse/* RTMpGetMaxCpuId - not necessary */
10bcdea056942e3b05159c76f070022a0aa5506arse/* RTMpGetOnlineCount - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTMpGetOnlineSet - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTMpGetSet - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTMpIsCpuOnline - not necessary */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTMpOnAll)(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTMpOnOthers)(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTMpOnSpecific)(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTLogRelDefaultInstance - not necessary. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(int) UNWIND_WRAP(RTLogSetDefaultInstanceThread)(PRTLOGGER pLogger, uintptr_t uKey);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTLogLogger - can't wrap this buster. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTLogLoggerEx - can't wrap this buster. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) UNWIND_WRAP(RTLogLoggerExV)(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* RTLogPrintf - can't wrap this buster. */ /** @todo provide va_list log wrappers in RuntimeR0. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) UNWIND_WRAP(RTLogPrintfV)(const char *pszFormat, va_list args);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseDECLASM(void) UNWIND_WRAP(AssertMsg1)(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* AssertMsg2 - can't wrap this buster. */
bb0b94431dc9a1591a0a38a6c48925c6d9213c83rse#endif /* RT_WITH_W64_UNWIND_HACK */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/*******************************************************************************
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse* Global Variables *
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse*******************************************************************************/
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Array of the R0 SUP API.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* name function */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* Entries with absolute addresses determined at runtime, fixup
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse code makes ugly ASSUMPTIONS about the order here: */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0AbsIs64bit", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0Abs64bitKernelCS", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0Abs64bitKernelSS", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0Abs64bitKernelDS", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0AbsKernelCS", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0AbsKernelSS", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0AbsKernelDS", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0AbsKernelES", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0AbsKernelFS", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0AbsKernelGS", (void *)0 },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* Normal function pointers: */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ComponentRegisterFactory", (void *)UNWIND_WRAP(SUPR0ComponentRegisterFactory) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ComponentDeregisterFactory", (void *)UNWIND_WRAP(SUPR0ComponentDeregisterFactory) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ComponentQueryFactory", (void *)UNWIND_WRAP(SUPR0ComponentQueryFactory) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ObjRegister", (void *)UNWIND_WRAP(SUPR0ObjRegister) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ObjAddRef", (void *)UNWIND_WRAP(SUPR0ObjAddRef) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ObjAddRefEx", (void *)UNWIND_WRAP(SUPR0ObjAddRefEx) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ObjRelease", (void *)UNWIND_WRAP(SUPR0ObjRelease) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ObjVerifyAccess", (void *)UNWIND_WRAP(SUPR0ObjVerifyAccess) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0UnlockMem", (void *)UNWIND_WRAP(SUPR0UnlockMem) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ContAlloc", (void *)UNWIND_WRAP(SUPR0ContAlloc) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0ContFree", (void *)UNWIND_WRAP(SUPR0ContFree) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0LowAlloc", (void *)UNWIND_WRAP(SUPR0LowAlloc) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0MemAlloc", (void *)UNWIND_WRAP(SUPR0MemAlloc) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0MemGetPhys", (void *)UNWIND_WRAP(SUPR0MemGetPhys) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0PageAllocEx", (void *)UNWIND_WRAP(SUPR0PageAllocEx) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0PageFree", (void *)UNWIND_WRAP(SUPR0PageFree) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPR0Printf", (void *)SUPR0Printf }, /** @todo needs wrapping? */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPSemEventCreate", (void *)UNWIND_WRAP(SUPSemEventCreate) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPSemEventClose", (void *)UNWIND_WRAP(SUPSemEventClose) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPSemEventSignal", (void *)UNWIND_WRAP(SUPSemEventSignal) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPSemEventWait", (void *)UNWIND_WRAP(SUPSemEventWait) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "SUPSemEventWaitNoResume", (void *)UNWIND_WRAP(SUPSemEventWaitNoResume) },
08e685922fbfb1742c65c85a3a1d8688bc826aeedougm { "SUPSemEventMultiCreate", (void *)UNWIND_WRAP(SUPSemEventMultiCreate) },
08e685922fbfb1742c65c85a3a1d8688bc826aeedougm { "SUPSemEventMultiClose", (void *)UNWIND_WRAP(SUPSemEventMultiClose) },
08e685922fbfb1742c65c85a3a1d8688bc826aeedougm { "SUPSemEventMultiSignal", (void *)UNWIND_WRAP(SUPSemEventMultiSignal) },
08e685922fbfb1742c65c85a3a1d8688bc826aeedougm { "SUPSemEventMultiReset", (void *)UNWIND_WRAP(SUPSemEventMultiReset) },
08e685922fbfb1742c65c85a3a1d8688bc826aeedougm { "SUPSemEventMultiWait", (void *)UNWIND_WRAP(SUPSemEventMultiWait) },
08e685922fbfb1742c65c85a3a1d8688bc826aeedougm { "SUPSemEventMultiWaitNoResume", (void *)UNWIND_WRAP(SUPSemEventMultiWaitNoResume) },
08e685922fbfb1742c65c85a3a1d8688bc826aeedougm { "SUPR0GetPagingMode", (void *)UNWIND_WRAP(SUPR0GetPagingMode) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /*{ "RTMemDup", (void *)UNWIND_WRAP(RTMemDup) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTMemDupEx", (void *)UNWIND_WRAP(RTMemDupEx) },*/
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjAllocLow", (void *)UNWIND_WRAP(RTR0MemObjAllocLow) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjAllocPage", (void *)UNWIND_WRAP(RTR0MemObjAllocPage) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjAllocPhys", (void *)UNWIND_WRAP(RTR0MemObjAllocPhys) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjAllocPhysNC", (void *)UNWIND_WRAP(RTR0MemObjAllocPhysNC) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjAllocCont", (void *)UNWIND_WRAP(RTR0MemObjAllocCont) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjEnterPhys", (void *)UNWIND_WRAP(RTR0MemObjEnterPhys) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjLockUser", (void *)UNWIND_WRAP(RTR0MemObjLockUser) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjMapKernel", (void *)UNWIND_WRAP(RTR0MemObjMapKernel) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjMapKernelEx", (void *)UNWIND_WRAP(RTR0MemObjMapKernelEx) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjMapUser", (void *)UNWIND_WRAP(RTR0MemObjMapUser) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjProtect", (void *)UNWIND_WRAP(RTR0MemObjProtect) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjGetPagePhysAddr", (void *)RTR0MemObjGetPagePhysAddr },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemObjFree", (void *)UNWIND_WRAP(RTR0MemObjFree) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemUserCopyFrom", (void *)UNWIND_WRAP(RTR0MemUserCopyFrom) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemUserCopyTo", (void *)UNWIND_WRAP(RTR0MemUserCopyTo) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemUserIsValidAddr", (void *)RTR0MemUserIsValidAddr },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemKernelIsValidAddr", (void *)RTR0MemKernelIsValidAddr },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTR0MemAreKrnlAndUsrDifferent", (void *)RTR0MemAreKrnlAndUsrDifferent },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse/* These don't work yet on linux - use fast mutexes!
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemMutexCreate", (void *)RTSemMutexCreate },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemMutexRequest", (void *)RTSemMutexRequest },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemMutexRelease", (void *)RTSemMutexRelease },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemMutexDestroy", (void *)RTSemMutexDestroy },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemFastMutexCreate", (void *)UNWIND_WRAP(RTSemFastMutexCreate) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemFastMutexDestroy", (void *)UNWIND_WRAP(RTSemFastMutexDestroy) },
2b452335c5dde2c0ebc5f8eaa3f504f5dbbf4357rse { "RTSemFastMutexRequest", (void *)UNWIND_WRAP(RTSemFastMutexRequest) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemFastMutexRelease", (void *)UNWIND_WRAP(RTSemFastMutexRelease) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventCreate", (void *)UNWIND_WRAP(RTSemEventCreate) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventSignal", (void *)UNWIND_WRAP(RTSemEventSignal) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventWait", (void *)UNWIND_WRAP(RTSemEventWait) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventWaitNoResume", (void *)UNWIND_WRAP(RTSemEventWaitNoResume) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventDestroy", (void *)UNWIND_WRAP(RTSemEventDestroy) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventMultiCreate", (void *)UNWIND_WRAP(RTSemEventMultiCreate) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventMultiSignal", (void *)UNWIND_WRAP(RTSemEventMultiSignal) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventMultiReset", (void *)UNWIND_WRAP(RTSemEventMultiReset) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventMultiWait", (void *)UNWIND_WRAP(RTSemEventMultiWait) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventMultiWaitNoResume", (void *)UNWIND_WRAP(RTSemEventMultiWaitNoResume) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSemEventMultiDestroy", (void *)UNWIND_WRAP(RTSemEventMultiDestroy) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSpinlockCreate", (void *)UNWIND_WRAP(RTSpinlockCreate) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSpinlockDestroy", (void *)UNWIND_WRAP(RTSpinlockDestroy) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSpinlockAcquire", (void *)UNWIND_WRAP(RTSpinlockAcquire) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSpinlockRelease", (void *)UNWIND_WRAP(RTSpinlockRelease) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSpinlockAcquireNoInts", (void *)UNWIND_WRAP(RTSpinlockAcquireNoInts) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTSpinlockReleaseNoInts", (void *)UNWIND_WRAP(RTSpinlockReleaseNoInts) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadSleep", (void *)UNWIND_WRAP(RTThreadSleep) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadYield", (void *)UNWIND_WRAP(RTThreadYield) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#if 0 /* Thread APIs, Part 2. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadCreate", (void *)UNWIND_WRAP(RTThreadCreate) }, /** @todo need to wrap the callback */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadGetNative", (void *)UNWIND_WRAP(RTThreadGetNative) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadWaitNoResume", (void *)UNWIND_WRAP(RTThreadWaitNoResume) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadGetName", (void *)UNWIND_WRAP(RTThreadGetName) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadSelfName", (void *)UNWIND_WRAP(RTThreadSelfName) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadGetType", (void *)UNWIND_WRAP(RTThreadGetType) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadUserSignal", (void *)UNWIND_WRAP(RTThreadUserSignal) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadUserReset", (void *)UNWIND_WRAP(RTThreadUserReset) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadUserWait", (void *)UNWIND_WRAP(RTThreadUserWait) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadUserWaitNoResume", (void *)UNWIND_WRAP(RTThreadUserWaitNoResume) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadPreemptIsEnabled", (void *)RTThreadPreemptIsEnabled },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadPreemptIsPending", (void *)RTThreadPreemptIsPending },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadPreemptIsPendingTrusty", (void *)RTThreadPreemptIsPendingTrusty },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadPreemptIsPossible", (void *)RTThreadPreemptIsPossible },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadPreemptDisable", (void *)RTThreadPreemptDisable },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadPreemptRestore", (void *)UNWIND_WRAP(RTThreadPreemptRestore) },
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse { "RTThreadIsInInterrupt", (void *)RTThreadIsInInterrupt },
a943533fd4d91d114af622731a405407990c4fb1rse { "RTLogDefaultInstance", (void *)RTLogDefaultInstance },
a943533fd4d91d114af622731a405407990c4fb1rse { "RTMpCpuIdFromSetIndex", (void *)RTMpCpuIdFromSetIndex },
574f6ff9ee80ef4f772649c5c8319b764a8abe42jerenkrantz { "RTMpIsCpuPossible", (void *)RTMpIsCpuPossible },
6cf71da67fecb3acb6f300daae49463148bfbf2adougm { "RTMpIsCpuWorkPending", (void *)UNWIND_WRAP(RTMpIsCpuWorkPending) },
6cf71da67fecb3acb6f300daae49463148bfbf2adougm { "RTMpOnOthers", (void *)UNWIND_WRAP(RTMpOnOthers) },
6cf71da67fecb3acb6f300daae49463148bfbf2adougm { "RTMpOnSpecific", (void *)UNWIND_WRAP(RTMpOnSpecific) },
931b4fd1cc9dd3da096c45f4bf7ddcc14e0985c1dougm { "RTPowerNotificationRegister", (void *)RTPowerNotificationRegister },
d572c96f3a1c0f6b712bf2522352b929872a607edougm { "RTPowerNotificationDeregister", (void *)RTPowerNotificationDeregister },
6cf71da67fecb3acb6f300daae49463148bfbf2adougm { "RTLogRelDefaultInstance", (void *)RTLogRelDefaultInstance },
34e35f19305a307db17a3e42beba8a7311525907dougm { "RTLogSetDefaultInstanceThread", (void *)UNWIND_WRAP(RTLogSetDefaultInstanceThread) },
34e35f19305a307db17a3e42beba8a7311525907dougm { "RTLogLogger", (void *)RTLogLogger }, /** @todo remove this */
13042558b26e8542e668397c9fd55920a425a187dougm { "RTLogLoggerEx", (void *)RTLogLoggerEx }, /** @todo remove this */
0372f6a6267f1ef4830637d59398b2902738efeddougm { "RTLogLoggerExV", (void *)UNWIND_WRAP(RTLogLoggerExV) },
931b4fd1cc9dd3da096c45f4bf7ddcc14e0985c1dougm { "RTLogPrintf", (void *)RTLogPrintf }, /** @todo remove this */
931b4fd1cc9dd3da096c45f4bf7ddcc14e0985c1dougm { "RTLogPrintfV", (void *)UNWIND_WRAP(RTLogPrintfV) },
0372f6a6267f1ef4830637d59398b2902738efeddougm { "AssertMsg2", (void *)AssertMsg2 }, /** @todo replace this by RTAssertMsg2V */
a19f0327b989a3311d6fc79038c04fe49c3986c4dougm { "RTR0AssertPanicSystem", (void *)RTR0AssertPanicSystem },
a943533fd4d91d114af622731a405407990c4fb1rse#if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS) || defined(RT_OS_FREEBSD)
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Drag in the rest of IRPT since we share it with the
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * rest of the kernel modules on darwin.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* VBoxNetFlt */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* VBoxNetAdp */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* VBoxUSB */
e3458263658bd1ef8dc4eb6b6919564a6d4673f6dougm#endif /* RT_OS_DARWIN || RT_OS_SOLARIS || RT_OS_SOLARIS */
a943533fd4d91d114af622731a405407990c4fb1rse * Initializes the device extentsion structure.
8085732955b2ca788b70d792e92d6baebb10e90fwrowe * @returns IPRT status code.
8085732955b2ca788b70d792e92d6baebb10e90fwrowe * @param pDevExt The device extension to initialize.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Create the release log.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups,
8085732955b2ca788b70d792e92d6baebb10e90fwrowe /** @todo Add native hook for getting logger config parameters and setting
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * them. On linux we should use the module parameter stuff... */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Initialize it.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse rc = RTSemFastMutexCreate(&pDevExt->mtxComponentFactory);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse pDevExt->u32Cookie = BIRD; /** @todo make this random? */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Fixup the absolute symbols.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Because of the table indexing assumptions we'll have a little #ifdef orgy
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * here rather than distributing this to OS specific files. At least for now.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse g_aFunctions[1].pfn = (void *)0x80; /* SUPR0Abs64bitKernelCS - KERNEL64_CS, seg.h */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse g_aFunctions[2].pfn = (void *)0x88; /* SUPR0Abs64bitKernelSS - KERNEL64_SS, seg.h */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse g_aFunctions[3].pfn = (void *)0x88; /* SUPR0Abs64bitKernelDS - KERNEL64_SS, seg.h */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
bb0b94431dc9a1591a0a38a6c48925c6d9213c83rse g_aFunctions[4].pfn = (void *)0x08; /* SUPR0AbsKernelCS - KERNEL_CS, seg.h */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse g_aFunctions[5].pfn = (void *)0x10; /* SUPR0AbsKernelSS - KERNEL_DS, seg.h */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse g_aFunctions[6].pfn = (void *)0x10; /* SUPR0AbsKernelDS - KERNEL_DS, seg.h */
36dbb76eaf57ba9bc273970cc43d838b3e9582ffdougm g_aFunctions[7].pfn = (void *)0x10; /* SUPR0AbsKernelES - KERNEL_DS, seg.h */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[8].pfn = (void *)0x10; /* SUPR0AbsKernelFS - KERNEL_DS, seg.h */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[9].pfn = (void *)0x48; /* SUPR0AbsKernelGS - CPU_DATA_GS, seg.h */
7933d4a963def02417113b6798d87a36395053b0rse# else /* 64-bit darwin: */
7933d4a963def02417113b6798d87a36395053b0rse g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0Abs64bitKernelCS */
7933d4a963def02417113b6798d87a36395053b0rse g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0Abs64bitKernelSS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[3].pfn = (void *)0; /* SUPR0Abs64bitKernelDS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0AbsKernelCS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0AbsKernelSS */
a943533fd4d91d114af622731a405407990c4fb1rse#else /* !RT_OS_DARWIN */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0Abs64bitKernelCS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0Abs64bitKernelSS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[3].pfn = (void *)(uintptr_t)ASMGetDS(); /* SUPR0Abs64bitKernelDS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0AbsKernelCS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0AbsKernelSS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[6].pfn = (void *)(uintptr_t)ASMGetDS(); /* SUPR0AbsKernelDS */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[7].pfn = (void *)(uintptr_t)ASMGetES(); /* SUPR0AbsKernelES */
a943533fd4d91d114af622731a405407990c4fb1rse g_aFunctions[8].pfn = (void *)(uintptr_t)ASMGetFS(); /* SUPR0AbsKernelFS */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse g_aFunctions[9].pfn = (void *)(uintptr_t)ASMGetGS(); /* SUPR0AbsKernelGS */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#endif /* !RT_OS_DARWIN */
c052e3e4fb5e1c58bfd28dc086c06ac24ffba5e9wrowe * Delete the device extension (e.g. cleanup members).
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * @param pDevExt The device extension to delete.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Kill mutexes and spinlocks.
b79b480213d7452db127eec054e52eb2b4fa6153wrowe * Free lists.
b79b480213d7452db127eec054e52eb2b4fa6153wrowe /* objects. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse#if !defined(DEBUG_bird) || !defined(RT_OS_LINUX) /* breaks unloading, temporary, remove me! */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* usage records. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* kill the GIP. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* destroy the loggers. */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Create session.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * @returns IPRT status code.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * @param pDevExt Device extension.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * @param fUser Flag indicating whether this is a user or kernel session.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * @param ppSession Where to store the pointer to the session data.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrseint VBOXCALL supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, PSUPDRVSESSION *ppSession)
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * Allocate memory for the session data.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse PSUPDRVSESSION pSession = *ppSession = (PSUPDRVSESSION)RTMemAllocZ(sizeof(*pSession));
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /* Initialize session data. */
2b452335c5dde2c0ebc5f8eaa3f504f5dbbf4357rse RTHANDLETABLE_FLAGS_LOCKED | RTHANDLETABLE_FLAGS_CONTEXT,
2b452335c5dde2c0ebc5f8eaa3f504f5dbbf4357rse 1 /*uBase*/, 32768 /*cMax*/, supdrvSessionObjHandleRetain, pSession);
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse /*pSession->pLdrUsage = NULL;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse pSession->pVM = NULL;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse pSession->pUsage = NULL;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse pSession->pGip = NULL;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse pSession->fGipReferenced = false;
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse pSession->Bundle.cUsed = 0; */
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse LogFlow(("Created session %p initial cookie=%#x\n", pSession, pSession->u32Cookie));
8085732955b2ca788b70d792e92d6baebb10e90fwrowe * Shared code for cleaning up a session.
cc003103e52ff9d5fe9bed567ef9438613ab4fbfrse * @param pDevExt Device extension.
bb0b94431dc9a1591a0a38a6c48925c6d9213c83rse * @param pSession Session data.
d94fd18ee21dc9b8c1f422144a881e941687d41fdougm * This data will be freed by this routine.
60c1c6006c048e5009ae91fa2ba4cd35e5f78e10rsevoid VBOXCALL supdrvCloseSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
int rc;
AssertMsg(pUsage->cUsage >= 1 && pObj->cUsage >= pUsage->cUsage, ("glob %d; sess %d\n", pObj->cUsage, pUsage->cUsage));
pObj, pObj->enmType, pObj->pvUser1, pObj->pvUser2, pObj->CreatorProcess, RTProcSelf(), pObj->pfnDestructor));
#ifdef RT_WITH_W64_UNWIND_HACK
while (pBundle)
int rc;
Log2(("eType=%d pvR0=%p pvR3=%p cb=%ld\n", pBundle->aMem[i].eType, RTR0MemObjAddress(pBundle->aMem[i].MemObj),
(void *)RTR0MemObjAddressR3(pBundle->aMem[i].MapObjR3), (long)RTR0MemObjSize(pBundle->aMem[i].MemObj)));
while (pCur)
if (pPrev)
while (pUsage)
static DECLCALLBACK(int) supdrvSessionObjHandleRetain(RTHANDLETABLE hHandleTable, void *pvObj, void *pvCtx, void *pvUser)
static DECLCALLBACK(void) supdrvSessionObjHandleDelete(RTHANDLETABLE hHandleTable, uint32_t h, void *pvObj, void *pvCtx, void *pvUser)
NOREF(h);
int VBOXCALL supdrvIOCtlFast(uintptr_t uIOCtl, VMCPUID idCpu, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
switch (uIOCtl)
#ifdef RT_WITH_W64_UNWIND_HACK
supdrvNtWrapVMMR0EntryFast((PFNRT)pDevExt->pfnVMMR0EntryFast, pSession->pVM, idCpu, SUP_VMMR0_DO_RAW_RUN);
#ifdef RT_WITH_W64_UNWIND_HACK
supdrvNtWrapVMMR0EntryFast((PFNRT)pDevExt->pfnVMMR0EntryFast, pSession->pVM, idCpu, SUP_VMMR0_DO_HWACC_RUN);
case SUP_IOCTL_FAST_DO_NOP:
#ifdef RT_WITH_W64_UNWIND_HACK
supdrvNtWrapVMMR0EntryFast((PFNRT)pDevExt->pfnVMMR0EntryFast, pSession->pVM, idCpu, SUP_VMMR0_DO_NOP);
return VERR_INTERNAL_ERROR;
return VINF_SUCCESS;
return VERR_INTERNAL_ERROR;
* list, see http://www.kerneldrivers.org/RHEL5.
int chCur;
int ch;
int VBOXCALL supdrvIOCtl(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr)
return VERR_INVALID_PARAMETER;
return VERR_INVALID_PARAMETER;
OSDBGPRINT(("vboxdrv: bad cookie %#lx / %#lx.\n", (long)pReqHdr->u32Cookie, (long)pReqHdr->u32SessionCookie));
return VERR_INVALID_PARAMETER;
OSDBGPRINT(( #Name ": Invalid input/output sizes. cbIn=%ld expected %ld. cbOut=%ld expected %ld.\n", \
REQ_CHECK_SIZES_EX(SUP_IOCTL_QUERY_FUNCS, SUP_IOCTL_QUERY_FUNCS_SIZE_IN, SUP_IOCTL_QUERY_FUNCS_SIZE_OUT(RT_ELEMENTS(g_aFunctions)));
pReq->Hdr.rc = SUPR0ContAlloc(pSession, pReq->u.In.cPages, &pReq->u.Out.pvR0, &pReq->u.Out.pvR3, &pReq->u.Out.HCPhys);
REQ_CHECK_EXPR(SUP_IOCTL_LDR_OPEN, !supdrvCheckInvalidChar(pReq->u.In.szName, ";:()[]{}/\\|&*%#@!~`\"'"));
REQ_CHECK_SIZES_EX(SUP_IOCTL_LDR_LOAD, SUP_IOCTL_LDR_LOAD_SIZE_IN(pReq->u.In.cbImage), SUP_IOCTL_LDR_LOAD_SIZE_OUT);
uint32_t i;
("SUP_IOCTL_LDR_LOAD: sym #%ld: symb off %#lx (max=%#lx)\n", (long)i, (long)paSyms[i].offSymbol, (long)pReq->u.In.cbImage));
("SUP_IOCTL_LDR_LOAD: sym #%ld: name off %#lx (max=%#lx)\n", (long)i, (long)paSyms[i].offName, (long)pReq->u.In.cbImage));
REQ_CHECK_EXPR_FMT(memchr(&pReq->u.In.achImage[pReq->u.In.offStrTab + paSyms[i].offName], '\0', pReq->u.In.cbStrTab - paSyms[i].offName),
("SUP_IOCTL_LDR_LOAD: sym #%ld: unterminated name! (%#lx / %#lx)\n", (long)i, (long)paSyms[i].offName, (long)pReq->u.In.cbImage));
REQ_CHECK_EXPR(SUP_IOCTL_LDR_GET_SYMBOL, memchr(pReq->u.In.szSymbol, '\0', sizeof(pReq->u.In.szSymbol)));
REQ_CHECK_SIZES_EX(SUP_IOCTL_CALL_VMMR0, SUP_IOCTL_CALL_VMMR0_SIZE_IN(0), SUP_IOCTL_CALL_VMMR0_SIZE_OUT(0));
#ifdef RT_WITH_W64_UNWIND_HACK
pReq->Hdr.rc = supdrvNtWrapVMMR0EntryEx((PFNRT)pDevExt->pfnVMMR0EntryEx, pReq->u.In.pVMR0, pReq->u.In.idCpu, pReq->u.In.uOperation, NULL, pReq->u.In.u64Arg, pSession);
pReq->Hdr.rc = pDevExt->pfnVMMR0EntryEx(pReq->u.In.pVMR0, pReq->u.In.idCpu, pReq->u.In.uOperation, NULL, pReq->u.In.u64Arg, pSession);
("SUP_IOCTL_CALL_VMMR0: cbIn=%#x < %#lx\n", pReq->Hdr.cbIn, SUP_IOCTL_CALL_VMMR0_SIZE(sizeof(SUPVMMR0REQHDR))));
REQ_CHECK_SIZES_EX(SUP_IOCTL_CALL_VMMR0, SUP_IOCTL_CALL_VMMR0_SIZE_IN(pVMMReq->cbReq), SUP_IOCTL_CALL_VMMR0_SIZE_OUT(pVMMReq->cbReq));
#ifdef RT_WITH_W64_UNWIND_HACK
pReq->Hdr.rc = supdrvNtWrapVMMR0EntryEx((PFNRT)pDevExt->pfnVMMR0EntryEx, pReq->u.In.pVMR0, pReq->u.In.idCpu, pReq->u.In.uOperation, pVMMReq, pReq->u.In.u64Arg, pSession);
pReq->Hdr.rc = pDevExt->pfnVMMR0EntryEx(pReq->u.In.pVMR0, pReq->u.In.idCpu, pReq->u.In.uOperation, pVMMReq, pReq->u.In.u64Arg, pSession);
pReq->Hdr.rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf()));
pReq->Hdr.rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf()));
REQ_CHECK_SIZES_EX(SUP_IOCTL_LOW_ALLOC, SUP_IOCTL_LOW_ALLOC_SIZE_IN, SUP_IOCTL_LOW_ALLOC_SIZE_OUT(pReq->u.In.cPages));
pReq->Hdr.rc = SUPR0LowAlloc(pSession, pReq->u.In.cPages, &pReq->u.Out.pvR0, &pReq->u.Out.pvR3, &pReq->u.Out.aPages[0]);
REQ_CHECK_SIZES_EX(SUP_IOCTL_PAGE_ALLOC_EX, SUP_IOCTL_PAGE_ALLOC_EX_SIZE_IN, SUP_IOCTL_PAGE_ALLOC_EX_SIZE_OUT(pReq->u.In.cPages));
("SUP_IOCTL_PAGE_ALLOC_EX: fReserved0=%d fReserved1=%d\n", pReq->u.In.fReserved0, pReq->u.In.fReserved1));
REQ_CHECK_EXPR_FMT(!pReq->u.In.fFlags, ("SUP_IOCTL_PAGE_MAP_KERNEL: fFlags=%#x! MBZ\n", pReq->u.In.fFlags));
REQ_CHECK_EXPR_FMT(!(pReq->u.In.offSub & PAGE_OFFSET_MASK), ("SUP_IOCTL_PAGE_MAP_KERNEL: offSub=%#x\n", pReq->u.In.offSub));
REQ_CHECK_EXPR_FMT(!(pReq->u.In.fProt & ~(RTMEM_PROT_READ | RTMEM_PROT_WRITE | RTMEM_PROT_EXEC | RTMEM_PROT_NONE)),
REQ_CHECK_EXPR_FMT(!(pReq->u.In.offSub & PAGE_OFFSET_MASK), ("SUP_IOCTL_PAGE_PROTECT: offSub=%#x\n", pReq->u.In.offSub));
pReq->Hdr.rc = SUPR0PageProtect(pSession, pReq->u.In.pvR3, pReq->u.In.pvR0, pReq->u.In.offSub, pReq->u.In.cbSub, pReq->u.In.fProt);
REQ_CHECK_SIZES_EX(SUP_IOCTL_CALL_SERVICE, SUP_IOCTL_CALL_SERVICE_SIZE_IN(0), SUP_IOCTL_CALL_SERVICE_SIZE_OUT(0));
("SUP_IOCTL_CALL_SERVICE: cbIn=%#x < %#lx\n", pReq->Hdr.cbIn, SUP_IOCTL_CALL_SERVICE_SIZE(sizeof(SUPR0SERVICEREQHDR))));
REQ_CHECK_SIZES_EX(SUP_IOCTL_CALL_SERVICE, SUP_IOCTL_CALL_SERVICE_SIZE_IN(pSrvReq->cbReq), SUP_IOCTL_CALL_SERVICE_SIZE_OUT(pSrvReq->cbReq));
REQ_CHECK_SIZES_EX(SUP_IOCTL_SEM_CREATE, SUP_IOCTL_SEM_CREATE_SIZE_IN, SUP_IOCTL_SEM_CREATE_SIZE_OUT);
case SUP_SEM_TYPE_EVENT:
case SUP_SEM_TYPE_EVENT_MULTI:
case SUP_SEM_TYPE_EVENT:
case SUPSEMOP_WAIT:
case SUPSEMOP_SIGNAL:
case SUPSEMOP_CLOSE:
case SUPSEMOP_RESET:
case SUP_SEM_TYPE_EVENT_MULTI:
case SUPSEMOP_WAIT:
case SUPSEMOP_SIGNAL:
case SUPSEMOP_CLOSE:
case SUPSEMOP_RESET:
return SUPDRV_ERR_GENERAL_FAILURE;
int VBOXCALL supdrvIDC(uintptr_t uReq, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVIDCREQHDR pReqHdr)
return VERR_INVALID_PARAMETER;
switch (uReq)
case SUPDRV_IDC_REQ_CONNECT:
|| (pReq->u.In.uMinVersion & UINT32_C(0xffff0000)) != (pReq->u.In.uReqVersion & UINT32_C(0xffff0000)))
return VINF_SUCCESS;
#ifdef RT_OS_WINDOWS
return VINF_SUCCESS;
return VINF_SUCCESS;
#ifdef RT_OS_WINDOWS
return VINF_SUCCESS;
return VINF_SUCCESS;
return VINF_SUCCESS;
return VERR_NOT_SUPPORTED;
* @param pfnDestructor The destructore function which will be called when the reference count reaches 0.
SUPR0DECL(void *) SUPR0ObjRegister(PSUPDRVSESSION pSession, SUPDRVOBJTYPE enmType, PFNSUPDRVDESTRUCTOR pfnDestructor, void *pvUser1, void *pvUser2)
if (!pObj)
return NULL;
if (pUsage)
if (!pUsage)
return NULL;
/* Log2(("SUPR0ObjRegister: pUsage=%p:{.pObj=%p, .pNext=%p}\n", pUsage, pUsage->pObj, pUsage->pNext)); */
return pObj;
("Invalid pvObj=%p magic=%#x (expected %#x or %#x)\n", pvObj, pObj->u32Magic, SUPDRVOBJ_MAGIC, SUPDRVOBJ_MAGIC_DEAD),
return VERR_WRONG_ORDER;
if (pUsagePre)
else if (!fNoBlocking)
if (!pUsagePre)
return VERR_NO_MEMORY;
return VERR_WRONG_ORDER;
if (pUsage)
else if (pUsagePre)
/*Log(("SUPR0AddRef: pUsagePre=%p:{.pObj=%p, .pNext=%p}\n", pUsagePre, pUsagePre->pObj, pUsagePre->pNext));*/
if (pUsagePre)
return rc;
/*Log2(("SUPR0ObjRelease: pUsage=%p:{.pObj=%p, .pNext=%p}\n", pUsage, pUsage->pObj, pUsage->pNext));*/
AssertMsg(pUsage->cUsage >= 1 && pObj->cUsage >= pUsage->cUsage, ("glob %d; sess %d\n", pObj->cUsage, pUsage->cUsage));
if (pUsagePrev)
pObj, pObj->enmType, pObj->pvUser1, pObj->pvUser2, pObj->CreatorProcess, RTProcSelf(), pObj->pfnDestructor));
#ifdef RT_WITH_W64_UNWIND_HACK
return rc;
int rc;
return rc;
return VINF_SUCCESS;
return VERR_PERMISSION_DENIED;
SUPR0DECL(int) SUPR0LockMem(PSUPDRVSESSION pSession, RTR3PTR pvR3, uint32_t cPages, PRTHCPHYS paPages)
int rc;
LogFlow(("SUPR0LockMem: pSession=%p pvR3=%p cPages=%d paPages=%p\n", pSession, (void *)pvR3, cPages, paPages));
|| !pvR3)
return VERR_INVALID_PARAMETER;
AssertMsg(RTR0MemObjAddressR3(Mem.MemObj) == pvR3, ("%p == %p\n", RTR0MemObjAddressR3(Mem.MemObj), pvR3));
while (iPage-- > 0)
return rc;
SUPR0DECL(int) SUPR0ContAlloc(PSUPDRVSESSION pSession, uint32_t cPages, PRTR0PTR ppvR0, PRTR3PTR ppvR3, PRTHCPHYS pHCPhys)
int rc;
LogFlow(("SUPR0ContAlloc: pSession=%p cPages=%d ppvR0=%p ppvR3=%p pHCPhys=%p\n", pSession, cPages, ppvR0, ppvR3, pHCPhys));
return VERR_INVALID_PARAMETER;
return VERR_PAGE_COUNT_OUT_OF_RANGE;
int rc2;
if (!rc)
return rc;
SUPR0DECL(int) SUPR0LowAlloc(PSUPDRVSESSION pSession, uint32_t cPages, PRTR0PTR ppvR0, PRTR3PTR ppvR3, PRTHCPHYS paPages)
unsigned iPage;
int rc;
LogFlow(("SUPR0LowAlloc: pSession=%p cPages=%d ppvR3=%p ppvR0=%p paPages=%p\n", pSession, cPages, ppvR3, ppvR0, paPages));
return VERR_INVALID_PARAMETER;
return VERR_PAGE_COUNT_OUT_OF_RANGE;
int rc2;
if (!rc)
return rc;
int rc;
return VERR_INVALID_PARAMETER;
int rc2;
if (!rc)
return VINF_SUCCESS;
return rc;
SUPR0DECL(int) SUPR0MemGetPhys(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr, PSUPPAGE paPages) /** @todo switch this bugger to RTHCPHYS */
return VINF_SUCCESS;
return VERR_INVALID_PARAMETER;
SUPR0DECL(int) SUPR0PageAllocEx(PSUPDRVSESSION pSession, uint32_t cPages, uint32_t fFlags, PRTR3PTR ppvR3, PRTR0PTR ppvR0, PRTHCPHYS paPages)
int rc;
* Validate input. The allowed allocation size must be at least equal to the maximum guest VRAM size.
Log(("SUPR0PageAlloc: Illegal request cb=%u; must be greater than 0 and smaller than 128MB.\n", cPages));
return VERR_PAGE_COUNT_OUT_OF_RANGE;
if (ppvR0)
int rc2;
if (ppvR3)
if (!rc)
if (ppvR3)
if (ppvR0)
if (paPages)
while (iPage-- > 0)
return VINF_SUCCESS;
return rc;
SUPR0DECL(int) SUPR0PageMapKernel(PSUPDRVSESSION pSession, RTR3PTR pvR3, uint32_t offSub, uint32_t cbSub,
int rc;
LogFlow(("SUPR0PageMapKernel: pSession=%p pvR3=%p offSub=%#x cbSub=%#x\n", pSession, pvR3, offSub, cbSub));
* Validate input. The allowed allocation size must be at least equal to the maximum guest VRAM size.
return rc;
SUPR0DECL(int) SUPR0PageProtect(PSUPDRVSESSION pSession, RTR3PTR pvR3, RTR0PTR pvR0, uint32_t offSub, uint32_t cbSub, uint32_t fProt)
int rc;
LogFlow(("SUPR0PageProtect: pSession=%p pvR3=%p pvR0=%p offSub=%#x cbSub=%#x fProt-%#x\n", pSession, pvR3, pvR0, offSub, cbSub, fProt));
* Validate input. The allowed allocation size must be at least equal to the maximum guest VRAM size.
AssertReturn(!(fProt & ~(RTMEM_PROT_READ | RTMEM_PROT_WRITE | RTMEM_PROT_EXEC | RTMEM_PROT_NONE)), VERR_INVALID_PARAMETER);
return rc;
if (ppGipR3)
ASMAtomicXchgU32(&pGip->aCPUs[i].u32TransactionId, pGip->aCPUs[i].u32TransactionId & ~(GIP_UPDATEHZ_RECALC_FREQ * 2 - 1));
if (pHCPhysGip)
if (ppGipR3)
#ifdef DEBUG_DARWIN_GIP
OSDBGPRINT(("SUPR0GipMap: returns %d *pHCPhysGip=%lx pGip=%p\n", rc, (unsigned long)HCPhys, (void *)pGip));
LogFlow(( "SUPR0GipMap: returns %d *pHCPhysGip=%lx pGip=%p\n", rc, (unsigned long)HCPhys, (void *)pGip));
return rc;
#ifdef DEBUG_DARWIN_GIP
return rc;
const char *psz;
int rc;
if (pNewReg)
if (!pCur)
if (pPrev)
return rc;
int rc;
if (pCur)
if (!pPrev)
return rc;
SUPR0DECL(int) SUPR0ComponentQueryFactory(PSUPDRVSESSION pSession, const char *pszName, const char *pszInterfaceUuid, void **ppvFactoryIf)
const char *pszEnd;
int rc;
while (pCur)
#ifdef RT_WITH_W64_UNWIND_HACK
void *pvFactory = supdrvNtWrapQueryFactoryInterface((PFNRT)pCur->pFactory->pfnQueryFactoryInterface, pCur->pFactory, pSession, pszInterfaceUuid);
void *pvFactory = pCur->pFactory->pfnQueryFactoryInterface(pCur->pFactory, pSession, pszInterfaceUuid);
if (pvFactory)
return rc;
int rc;
void *pvObj = SUPR0ObjRegister(pSession, SUPDRVOBJTYPE_SEM_EVENT, supR0SemEventDestructor, hEventReal, NULL);
if (pvObj)
return VINF_SUCCESS;
return rc;
return VINF_SUCCESS;
return VERR_INVALID_HANDLE;
if (!pObj)
return VERR_INVALID_HANDLE;
int rc;
return VERR_INVALID_HANDLE;
pObj = (PSUPDRVOBJ)RTHandleTableLookupWithCtx(pSession->hHandleTable, h32, SUPDRV_HANDLE_CTX_EVENT);
if (!pObj)
return VERR_INVALID_HANDLE;
return rc;
int rc;
return VERR_INVALID_HANDLE;
pObj = (PSUPDRVOBJ)RTHandleTableLookupWithCtx(pSession->hHandleTable, h32, SUPDRV_HANDLE_CTX_EVENT);
if (!pObj)
return VERR_INVALID_HANDLE;
return rc;
SUPDECL(int) SUPSemEventWaitNoResume(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent, uint32_t cMillies)
int rc;
return VERR_INVALID_HANDLE;
pObj = (PSUPDRVOBJ)RTHandleTableLookupWithCtx(pSession->hHandleTable, h32, SUPDRV_HANDLE_CTX_EVENT);
if (!pObj)
return VERR_INVALID_HANDLE;
return rc;
int rc;
void *pvObj = SUPR0ObjRegister(pSession, SUPDRVOBJTYPE_SEM_EVENT_MULTI, supR0SemEventMultiDestructor, hEventMultReal, NULL);
if (pvObj)
return VINF_SUCCESS;
return rc;
return VINF_SUCCESS;
return VERR_INVALID_HANDLE;
pObj = (PSUPDRVOBJ)RTHandleTableFreeWithCtx(pSession->hHandleTable, h32, SUPDRV_HANDLE_CTX_EVENT_MULTI);
if (!pObj)
return VERR_INVALID_HANDLE;
int rc;
return VERR_INVALID_HANDLE;
pObj = (PSUPDRVOBJ)RTHandleTableLookupWithCtx(pSession->hHandleTable, h32, SUPDRV_HANDLE_CTX_EVENT_MULTI);
if (!pObj)
return VERR_INVALID_HANDLE;
return rc;
int rc;
return VERR_INVALID_HANDLE;
pObj = (PSUPDRVOBJ)RTHandleTableLookupWithCtx(pSession->hHandleTable, h32, SUPDRV_HANDLE_CTX_EVENT_MULTI);
if (!pObj)
return VERR_INVALID_HANDLE;
return rc;
SUPDECL(int) SUPSemEventMultiWait(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti, uint32_t cMillies)
int rc;
return VERR_INVALID_HANDLE;
pObj = (PSUPDRVOBJ)RTHandleTableLookupWithCtx(pSession->hHandleTable, h32, SUPDRV_HANDLE_CTX_EVENT_MULTI);
if (!pObj)
return VERR_INVALID_HANDLE;
return rc;
SUPDECL(int) SUPSemEventMultiWaitNoResume(PSUPDRVSESSION pSession, SUPSEMEVENTMULTI hEventMulti, uint32_t cMillies)
int rc;
return VERR_INVALID_HANDLE;
pObj = (PSUPDRVOBJ)RTHandleTableLookupWithCtx(pSession->hHandleTable, h32, SUPDRV_HANDLE_CTX_EVENT_MULTI);
if (!pObj)
return VERR_INVALID_HANDLE;
return rc;
return VINF_SUCCESS;
if (!pBundle)
return VERR_NO_MEMORY;
return VINF_SUCCESS;
if (!uPtr)
return VERR_INVALID_PARAMETER;
return VINF_SUCCESS;
return VERR_INVALID_PARAMETER;
unsigned cb;
void *pv;
return VINF_SUCCESS;
if (!pv)
return VERR_NO_MEMORY;
return VINF_SUCCESS;
int rc;
LogFlow(("supdrvIOCtl_LdrLoad: pvImageBase=%p cbImage=%d\n", pReq->u.In.pvImageBase, pReq->u.In.cbImage));
if (!pUsage)
return VERR_INVALID_HANDLE;
Log(("SUP_IOCTL_LDR_LOAD: image size mismatch!! %d(prep) != %d(load)\n", pImage->cbImage, pReq->u.In.cbImage));
return VERR_INVALID_HANDLE;
return SUPDRV_ERR_ALREADY_LOADED;
case SUPLDRLOADEP_NOTHING:
case SUPLDRLOADEP_VMMR0:
return VERR_INVALID_PARAMETER;
if ( (uintptr_t)pReq->u.In.EP.VMMR0.pvVMMR0EntryInt - (uintptr_t)pImage->pvImage >= pReq->u.In.cbImage
|| (uintptr_t)pReq->u.In.EP.VMMR0.pvVMMR0EntryFast - (uintptr_t)pImage->pvImage >= pReq->u.In.cbImage
|| (uintptr_t)pReq->u.In.EP.VMMR0.pvVMMR0EntryEx - (uintptr_t)pImage->pvImage >= pReq->u.In.cbImage)
Log(("Out of range (%p LB %#x): pvVMMR0EntryInt=%p, pvVMMR0EntryFast=%p or pvVMMR0EntryEx=%p is NULL!\n",
return VERR_INVALID_PARAMETER;
case SUPLDRLOADEP_SERVICE:
return VERR_INVALID_PARAMETER;
if ((uintptr_t)pReq->u.In.EP.Service.pfnServiceReq - (uintptr_t)pImage->pvImage >= pReq->u.In.cbImage)
Log(("Out of range (%p LB %#x): pfnServiceReq=%p, pvVMMR0EntryFast=%p or pvVMMR0EntryEx=%p is NULL!\n",
return VERR_INVALID_PARAMETER;
return VERR_INVALID_PARAMETER;
return VERR_INVALID_PARAMETER;
return VERR_INVALID_PARAMETER;
return VERR_INVALID_PARAMETER;
case SUPLDRLOADEP_NOTHING:
case SUPLDRLOADEP_VMMR0:
rc = supdrvLdrSetVMMR0EPs(pDevExt, pReq->u.In.EP.VMMR0.pvVMMR0, pReq->u.In.EP.VMMR0.pvVMMR0EntryInt,
case SUPLDRLOADEP_SERVICE:
#ifdef RT_WITH_W64_UNWIND_HACK
if (rc)
return rc;
int rc;
if (!pUsage)
return VERR_INVALID_HANDLE;
if (RT_UNLIKELY((uintptr_t)pGenUsage->pObj->pfnDestructor - (uintptr_t)pImage->pvImage < pImage->cbImage))
if (pUsagePrev)
return rc;
static int supdrvIOCtl_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq)
uint32_t i;
const char *pchStrings;
Log3(("supdrvIOCtl_LdrGetSymbol: pvImageBase=%p szSymbol=\"%s\"\n", pReq->u.In.pvImageBase, pReq->u.In.szSymbol));
if (!pUsage)
return VERR_INVALID_HANDLE;
return VERR_ALREADY_LOADED;
return rc;
static int supdrvIDC_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVIDCREQGETSYM pReq)
char const *pszEnd;
uint32_t i;
if (pszModule)
Log3(("supdrvIDC_LdrGetSymbol: pszModule=%p:{%s} pszSymbol=%p:{%s}\n", pszModule, pszModule, pszSymbol, pszSymbol));
if ( !pszModule
return rc;
static int supdrvLdrSetVMMR0EPs(PSUPDRVDEVEXT pDevExt, void *pvVMMR0, void *pvVMMR0EntryInt, void *pvVMMR0EntryFast, void *pvVMMR0EntryEx)
return rc;
while (pUsage)
return VINF_SUCCESS;
return VINF_SUCCESS;
if (pImagePrev)
unsigned cObjs = 0;
cObjs++;
if (cObjs)
#ifdef RT_WITH_W64_UNWIND_HACK
static int supdrvIOCtl_CallServiceModule(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPCALLSERVICE pReq)
int rc;
if (pfnServiceReqHandler)
#ifdef RT_WITH_W64_UNWIND_HACK
rc = supdrvNtWrapServiceReqHandler((PFNRT)pfnServiceReqHandler, pSession, pReq->u.In.uOperation, pReq->u.In.u64Arg, NULL);
#ifdef RT_WITH_W64_UNWIND_HACK
rc = pfnServiceReqHandler(pSession, pReq->u.In.uOperation, pReq->u.In.u64Arg, (PSUPR0SERVICEREQHDR)&pReq->abReqPkt[0]);
rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf()));
rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf()));
return rc;
return VERR_NOT_IMPLEMENTED;
static int supdrvIOCtl_LoggerSettings(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLOGGERSETTINGS pReq)
int rc;
return VERR_INVALID_PARAMETER;
return VERR_ACCESS_DENIED;
return VERR_INTERNAL_ERROR;
return VERR_INTERNAL_ERROR;
if (pLogger)
if (pLogger)
NULL);
return rc;
case X86_CR4_PGE:
case X86_CR4_PAE:
return enmMode;
#ifdef RT_OS_DARWIN
return VERR_NOT_SUPPORTED;
int rc;
return rc;
#if 0 /** @todo Disabled this as we didn't used to do it before and causes unnecessary stress on laptops.
rc = RTTimerCreateEx(&pDevExt->pGipTimer, u32Interval, RTTIMER_FLAGS_CPU_ALL, supdrvGipAsyncTimer, pDevExt);
return VINF_SUCCESS;
OSDBGPRINT(("supdrvGipCreate: failed create GIP timer at %ld ns interval. rc=%d\n", (long)u32Interval, rc));
return rc;
int rc;
#ifdef DEBUG_DARWIN_GIP
bool fIgnored;
for (i = 0; i < RTCPUSET_MAX_CPUS; i++)
int VBOXCALL supdrvGipInit(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, RTHCPHYS HCPhys, uint64_t u64NanoTS, unsigned uUpdateHz)
#ifdef DEBUG_DARWIN_GIP
OSDBGPRINT(("supdrvGipInit: pGip=%p HCPhys=%lx u64NanoTS=%llu uUpdateHz=%d\n", pGip, (long)HCPhys, u64NanoTS, uUpdateHz));
LogFlow(("supdrvGipInit: pGip=%p HCPhys=%lx u64NanoTS=%llu uUpdateHz=%d\n", pGip, (long)HCPhys, u64NanoTS, uUpdateHz));
return VINF_SUCCESS;
static DECLCALLBACK(void) supdrvDetermineAsyncTscWorker(RTCPUID idCpu, void *pvUser1, void *pvUser2)
int iCpu;
bool fAsync = false;
while (cLoops-- > 0)
fAsync = true;
return fAsync;
return SUPGIPMODE_ASYNC_TSC;
return SUPGIPMODE_ASYNC_TSC;
return SUPGIPMODE_ASYNC_TSC;
return SUPGIPMODE_SYNC_TSC;
unsigned iTSCHistoryHead;