SUPDRV.h revision 7aaf943021d3988cf422065af0f66882f75b9dd4
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/* $Revision$ */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * VirtualBox Support Driver - Internal header.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * available from http://www.virtualbox.org. This file is free software;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * General Public License (GPL) as published by the Free Software
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * The contents of this file may alternatively be used under the terms
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * of the Common Development and Distribution License Version 1.0
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * CDDL are applicable instead of those of the GPL.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * You may elect to license modified versions of this file under the
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync * terms and conditions of either the GPL or the CDDL or both.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * additional information or have any questions.
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync/*******************************************************************************
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync* Header Files *
c10a6f0c7041e4d1ee50ad38425aab9d43c55522vboxsync*******************************************************************************/
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# if (_MSC_VER >= 1400) && !defined(VBOX_WITH_PATCHED_DDK)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define _InterlockedExchange _InterlockedExchange_StupidDDKVsCompilerCrap
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define _InterlockedExchangeAdd _InterlockedExchangeAdd_StupidDDKVsCompilerCrap
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define _InterlockedCompareExchange _InterlockedCompareExchange_StupidDDKVsCompilerCrap
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define _interlockedbittestandset _interlockedbittestandset_StupidDDKVsCompilerCrap
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define _interlockedbittestandreset _interlockedbittestandreset_StupidDDKVsCompilerCrap
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define _interlockedbittestandset64 _interlockedbittestandset64_StupidDDKVsCompilerCrap
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define _interlockedbittestandreset64 _interlockedbittestandreset64_StupidDDKVsCompilerCrap
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync int VBOXCALL mymemcmp(const void *, const void *, size_t);
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync# if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync# define KBUILD_STR(s) #s
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/*******************************************************************************
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync* Defined Constants And Macros *
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync*******************************************************************************/
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Hardcoded cookies.
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync/* debug printf */
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync/** Maximum number of bytes we try to lock down in one go.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * This is supposed to have a limit right below 256MB, but this appears
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * to actually be much lower. The values here have been determined experimentally.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define MAX_LOCK_MEM_SIZE (32*1024*1024) /* 32mb */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync# define MAX_LOCK_MEM_SIZE (24*1024*1024) /* 24mb */
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync/* check kernel version */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/* debug printf */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/* debug printf */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/* No log API in OS/2 only COM port. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/* No log API in OS/2 only COM port. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/** @todo other os'es */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync# error "OS interface defines is not done for this OS!"
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/* dprintf */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync#if (defined(DEBUG) && !defined(NO_LOGGING)) || defined(RT_OS_FREEBSD)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync# define dprintf(a) do {} while (0)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/* dprintf2 - extended logging. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync#if defined(RT_OS_DARWIN) || defined(RT_OS_OS2) || defined(RT_OS_FREEBSD)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync# define dprintf2(a) do { } while (0)
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync * Error codes.
0d49a2fbc9857ad8dd29542de7fb37202f1a283fvboxsync/** Invalid parameter. */
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync/** Invalid parameter. */
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync/** Invalid magic or cookie. */
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync/** Invalid loader handle. */
0d49a2fbc9857ad8dd29542de7fb37202f1a283fvboxsync/** Failed to lock the address range. */
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync/** Invalid memory pointer. */
e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5vboxsync/** Failed to patch the IDT. */
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync/** Memory allocation failed. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/** Already loaded. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/** Permission denied. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync/** Version mismatch. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync/*******************************************************************************
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync* Structures and Typedefs *
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync*******************************************************************************/
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync/** Pointer to the device extension. */
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync * An IDT Entry.
cd5df721f068659172f3bf95de8fedeb465f057dvboxsynctypedef struct SUPDRVIDTE
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync /** Low offset word. */
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync /** Segment Selector. */
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync /** Interrupt Stack Table index. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /** Reserved, ignored. */
cd5df721f068659172f3bf95de8fedeb465f057dvboxsync /** Reserved. */
ded83c04697bf14ebe491890cd19cec3c8d94aa1vboxsync /** IDT Type part one (not used for task gate). */
ded83c04697bf14ebe491890cd19cec3c8d94aa1vboxsync /** IDT Type part two. */
510567648d46488f4166e5f69ffffe3eeeeec4d9vboxsync /** Descriptor Privilege level. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync /** Present flag. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync /** High offset word. */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** The upper top part of the address. */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** Reserved dword for qword (aligning the struct), ignored. */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/** The u5Type2 value for an interrupt gate. */
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync * Patch code.
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsynctypedef struct SUPDRVPATCH
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync /** Patch code. */
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync /** Changed IDT entry (for parnoid UnpatchIdt()). */
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync /** Saved IDT entry. */
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync /** Pointer to the IDT.
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * We ASSUME the IDT is not re(al)located after bootup and use this as key
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * for the patches rather than processor number. This prevents some
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * stupid nesting stuff from happening in case of processors sharing the
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync * We're fucked if the processors have different physical mapping for
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * the(se) page(s), but we'll find that out soon enough in VBOX_STRICT mode.
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Pointer to the IDT entry. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync /** Usage counter. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync /** The offset into auCode of the VMMR0Entry fixup. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** The offset into auCode of the stub function. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Pointer to the next patch. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * Usage record for a patch.
18e3d4704ed7b57260b0d4e3ea12c224b3f81840vboxsync /** Next in the chain. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** The patch this usage applies to. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync /** Usage count. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync#endif /* VBOX_WITH_IDT_PATCHING */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync * Memory reference types.
8bc8d66f188d5357155b8340e2d489573be2b607vboxsynctypedef enum
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Unused entry */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Locked memory (r3 mapping only). */
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync /** Continous memory block (r3 and r0 mapping). */
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync /** Low memory block (r3 and r0 mapping). */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Memory block (r3 and r0 mapping). */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Locked memory (r3 mapping only) allocated by the support driver. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Blow the type up to 32-bit and mark the end. */
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync * Structure used for tracking memory a session
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync * references in one way or another.
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsynctypedef struct SUPDRVMEMREF
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** The memory object handle. */
4171ffb38eb8720b2ae9a8d13e95103ab26cfd12vboxsync /** The ring-3 mapping memory object handle. */
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync /** Type of memory. */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Bundle of locked memory ranges.
typedef struct SUPDRVBUNDLE
typedef struct SUPDRVLDRIMAGE
void *pvImage;
typedef struct SUPDRVLDRUSAGE
typedef struct SUPDRVOBJ
void *pvUser1;
void *pvUser2;
typedef struct SUPDRVUSAGE
typedef struct SUPDRVSESSION
#ifdef VBOX_WITH_IDT_PATCHING
#if defined(RT_OS_OS2)
typedef struct SUPDRVDEVEXT
#ifdef VBOX_WITH_IDT_PATCHING
void * volatile pvVMMR0;
DECLR0CALLBACKMEMBER(int, pfnVMMR0EntryEx, (PVM pVM, unsigned uOperation, PSUPVMMR0REQHDR pReq, uint64_t u64Arg));
} SUPDRVDEVEXT;
bool VBOXCALL supdrvOSObjCanAccess(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession, const char *pszObjName, int *prc);
int VBOXCALL supdrvIOCtl(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr);
int VBOXCALL supdrvGipInit(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, RTHCPHYS HCPhys, uint64_t u64NanoTS, unsigned uUpdateHz);