VirtualBox

source: vbox/trunk/include/VBox/sup.h@ 4878

Last change on this file since 4878 was 4811, checked in by vboxsync, 17 years ago

Split VMMR0Entry into VMMR0EntryInt, VMMR0EntryFast and VMMr0EntryEx. This will prevent the SUPCallVMMR0Ex path from causing harm and messing up the paths that has to be optimized.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 21.9 KB
Line 
1/** @file
2 * SUP - Support Library.
3 */
4
5/*
6 * Copyright (C) 2006-2007 innotek GmbH
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 */
16
17#ifndef ___VBox_sup_h
18#define ___VBox_sup_h
19
20#include <VBox/cdefs.h>
21#include <VBox/types.h>
22#include <iprt/assert.h>
23#include <iprt/asm.h>
24
25__BEGIN_DECLS
26
27/** @defgroup grp_sup The Support Library API
28 * @{
29 */
30
31/**
32 * Physical page descriptor.
33 */
34#pragma pack(4) /* space is more important. */
35typedef struct SUPPAGE
36{
37 /** Physical memory address. */
38 RTHCPHYS Phys;
39 /** Reserved entry for internal use by the caller. */
40 RTHCUINTPTR uReserved;
41} SUPPAGE;
42#pragma pack()
43/** Pointer to a page descriptor. */
44typedef SUPPAGE *PSUPPAGE;
45/** Pointer to a const page descriptor. */
46typedef const SUPPAGE *PCSUPPAGE;
47
48/**
49 * The paging mode.
50 */
51typedef enum SUPPAGINGMODE
52{
53 /** The usual invalid entry.
54 * This is returned by SUPGetPagingMode() */
55 SUPPAGINGMODE_INVALID = 0,
56 /** Normal 32-bit paging, no global pages */
57 SUPPAGINGMODE_32_BIT,
58 /** Normal 32-bit paging with global pages. */
59 SUPPAGINGMODE_32_BIT_GLOBAL,
60 /** PAE mode, no global pages, no NX. */
61 SUPPAGINGMODE_PAE,
62 /** PAE mode with global pages. */
63 SUPPAGINGMODE_PAE_GLOBAL,
64 /** PAE mode with NX, no global pages. */
65 SUPPAGINGMODE_PAE_NX,
66 /** PAE mode with global pages and NX. */
67 SUPPAGINGMODE_PAE_GLOBAL_NX,
68 /** AMD64 mode, no global pages. */
69 SUPPAGINGMODE_AMD64,
70 /** AMD64 mode with global pages, no NX. */
71 SUPPAGINGMODE_AMD64_GLOBAL,
72 /** AMD64 mode with NX, no global pages. */
73 SUPPAGINGMODE_AMD64_NX,
74 /** AMD64 mode with global pages and NX. */
75 SUPPAGINGMODE_AMD64_GLOBAL_NX
76} SUPPAGINGMODE;
77
78
79#pragma pack(1) /* paranoia */
80
81/**
82 * Per CPU data.
83 * This is only used when
84 */
85typedef struct SUPGIPCPU
86{
87 /** Update transaction number.
88 * This number is incremented at the start and end of each update. It follows
89 * thusly that odd numbers indicates update in progress, while even numbers
90 * indicate stable data. Use this to make sure that the data items you fetch
91 * are consistent. */
92 volatile uint32_t u32TransactionId;
93 /** The interval in TSC ticks between two NanoTS updates.
94 * This is the average interval over the last 2, 4 or 8 updates + a little slack.
95 * The slack makes the time go a tiny tiny bit slower and extends the interval enough
96 * to avoid ending up with too many 1ns increments. */
97 volatile uint32_t u32UpdateIntervalTSC;
98 /** Current nanosecond timestamp. */
99 volatile uint64_t u64NanoTS;
100 /** The TSC at the time of u64NanoTS. */
101 volatile uint64_t u64TSC;
102 /** Current CPU Frequency. */
103 volatile uint64_t u64CpuHz;
104 /** Number of errors during updating.
105 * Typical errors are under/overflows. */
106 volatile uint32_t cErrors;
107 /** Index of the head item in au32TSCHistory. */
108 volatile uint32_t iTSCHistoryHead;
109 /** Array of recent TSC interval deltas.
110 * The most recent item is at index iTSCHistoryHead.
111 * This history is used to calculate u32UpdateIntervalTSC.
112 */
113 volatile uint32_t au32TSCHistory[8];
114 /** Reserved for future per processor data. */
115 volatile uint32_t au32Reserved[6];
116} SUPGIPCPU;
117AssertCompileSize(SUPGIPCPU, 96);
118/*AssertCompileMemberAlignment(SUPGIPCPU, u64TSC, 8); -fixme */
119
120/** Pointer to per cpu data.
121 * @remark there is no const version of this typedef, see g_pSUPGlobalInfoPage for details. */
122typedef SUPGIPCPU *PSUPGIPCPU;
123
124/**
125 * Global Information Page.
126 *
127 * This page contains useful information and can be mapped into any
128 * process or VM. It can be accessed thru the g_pSUPGlobalInfoPage
129 * pointer when a session is open.
130 */
131typedef struct SUPGLOBALINFOPAGE
132{
133 /** Magic (SUPGLOBALINFOPAGE_MAGIC). */
134 uint32_t u32Magic;
135 /** The GIP version. */
136 uint32_t u32Version;
137
138 /** The GIP update mode, see SUPGIPMODE. */
139 uint32_t u32Mode;
140 /** Reserved / padding. */
141 uint32_t u32Padding0;
142 /** The update frequency of the of the NanoTS. */
143 volatile uint32_t u32UpdateHz;
144 /** The update interval in nanoseconds. (10^9 / u32UpdateHz) */
145 volatile uint32_t u32UpdateIntervalNS;
146 /** The timestamp of the last time we update the update frequency. */
147 volatile uint64_t u64NanoTSLastUpdateHz;
148
149 /** Padding / reserved space for future data. */
150 uint32_t au32Padding1[56];
151
152 /** Array of per-cpu data.
153 * If u32Mode == SUPGIPMODE_SYNC_TSC then only the first entry is used.
154 * If u32Mode == SUPGIPMODE_ASYNC_TSC then the CPU ACPI ID is used as an
155 * index into the array. */
156 SUPGIPCPU aCPUs[32];
157} SUPGLOBALINFOPAGE;
158AssertCompile(sizeof(SUPGLOBALINFOPAGE) <= 0x1000);
159/* AssertCompileMemberAlignment(SUPGLOBALINFOPAGE, aCPU, 32); - fixme */
160
161/** Pointer to the global info page.
162 * @remark there is no const version of this typedef, see g_pSUPGlobalInfoPage for details. */
163typedef SUPGLOBALINFOPAGE *PSUPGLOBALINFOPAGE;
164
165#pragma pack() /* end of paranoia */
166
167/** The value of the SUPGLOBALINFOPAGE::u32Magic field. (Soryo Fuyumi) */
168#define SUPGLOBALINFOPAGE_MAGIC 0x19590106
169/** The GIP version.
170 * Upper 16 bits is the major version. Major version is only changed with
171 * incompatible changes in the GIP. */
172#define SUPGLOBALINFOPAGE_VERSION 0x00020000
173
174/**
175 * SUPGLOBALINFOPAGE::u32Mode values.
176 */
177typedef enum SUPGIPMODE
178{
179 /** The usual invalid null entry. */
180 SUPGIPMODE_INVALID = 0,
181 /** The TSC of the cores and cpus in the system is in sync. */
182 SUPGIPMODE_SYNC_TSC,
183 /** Each core has it's own TSC. */
184 SUPGIPMODE_ASYNC_TSC,
185 /** The usual 32-bit hack. */
186 SUPGIPMODE_32BIT_HACK = 0x7fffffff
187} SUPGIPMODE;
188
189/** Pointer to the Global Information Page.
190 *
191 * This pointer is valid as long as SUPLib has a open session. Anyone using
192 * the page must treat this pointer as higly volatile and not trust it beyond
193 * one transaction.
194 *
195 * @remark The GIP page is read-only to everyone but the support driver and
196 * is actually mapped read only everywhere but in ring-0. However
197 * it is not marked 'const' as this might confuse compilers into
198 * thinking that values doesn't change even if members are marked
199 * as volatile. Thus, there is no PCSUPGLOBALINFOPAGE type.
200 */
201#if defined(IN_SUP_R0) || defined(IN_SUP_R3) || defined(IN_SUP_GC)
202extern DECLEXPORT(PSUPGLOBALINFOPAGE) g_pSUPGlobalInfoPage;
203#elif defined(IN_RING0)
204extern DECLIMPORT(SUPGLOBALINFOPAGE) g_SUPGlobalInfoPage;
205# if defined(__GNUC__) && !defined(RT_OS_DARWIN) && defined(RT_ARCH_AMD64)
206/** Workaround for ELF+GCC problem on 64-bit hosts.
207 * (GCC emits a mov with a R_X86_64_32 reloc, we need R_X86_64_64.) */
208DECLINLINE(PSUPGLOBALINFOPAGE) SUPGetGIP(void)
209{
210 PSUPGLOBALINFOPAGE pGIP;
211 __asm__ __volatile__ ("movabs $g_SUPGlobalInfoPage,%0\n\t"
212 : "=a" (pGIP));
213 return pGIP;
214}
215# define g_pSUPGlobalInfoPage (SUPGetGIP())
216# else
217# define g_pSUPGlobalInfoPage (&g_SUPGlobalInfoPage)
218# endif
219#else
220extern DECLIMPORT(PSUPGLOBALINFOPAGE) g_pSUPGlobalInfoPage;
221#endif
222
223
224/**
225 * Gets the TSC frequency of the calling CPU.
226 *
227 * @returns TSC frequency.
228 * @param pGip The GIP pointer.
229 */
230DECLINLINE(uint64_t) SUPGetCpuHzFromGIP(PSUPGLOBALINFOPAGE pGip)
231{
232 unsigned iCpu;
233
234 if (RT_UNLIKELY(!pGip || pGip->u32Magic != SUPGLOBALINFOPAGE_MAGIC))
235 return ~(uint64_t)0;
236
237 if (pGip->u32Mode != SUPGIPMODE_ASYNC_TSC)
238 iCpu = 0;
239 else
240 {
241 iCpu = ASMGetApicId();
242 if (RT_UNLIKELY(iCpu >= RT_ELEMENTS(pGip->aCPUs)))
243 return ~(uint64_t)0;
244 }
245
246 return pGip->aCPUs[iCpu].u64CpuHz;
247}
248
249
250/**
251 * Request for generic VMMR0Entry calls.
252 */
253typedef struct SUPVMMR0REQHDR
254{
255 /** The magic. (SUPVMMR0REQHDR_MAGIC) */
256 uint32_t u32Magic;
257 /** The size of the request. */
258 uint32_t cbReq;
259} SUPVMMR0REQHDR;
260/** Pointer to a ring-0 request header. */
261typedef SUPVMMR0REQHDR *PSUPVMMR0REQHDR;
262/** the SUPVMMR0REQHDR::u32Magic value (Ethan Iverson - The Bad Plus). */
263#define SUPVMMR0REQHDR_MAGIC UINT32_C(0x19730211)
264
265
266/** For the fast ioctl path.
267 * @{
268 */
269/** @see VMMR0_DO_RAW_RUN. */
270#define SUP_VMMR0_DO_RAW_RUN 0
271/** @see VMMR0_DO_HWACC_RUN. */
272#define SUP_VMMR0_DO_HWACC_RUN 1
273/** @see VMMR0_DO_NOP */
274#define SUP_VMMR0_DO_NOP 2
275/** @} */
276
277
278
279#ifdef IN_RING3
280
281/** @defgroup grp_sup_r3 SUP Host Context Ring 3 API
282 * @ingroup grp_sup
283 * @{
284 */
285
286/**
287 * Installs the support library.
288 *
289 * @returns VBox status code.
290 */
291SUPR3DECL(int) SUPInstall(void);
292
293/**
294 * Uninstalls the support library.
295 *
296 * @returns VBox status code.
297 */
298SUPR3DECL(int) SUPUninstall(void);
299
300/**
301 * Initializes the support library.
302 * Each succesful call to SUPInit() must be countered by a
303 * call to SUPTerm(false).
304 *
305 * @returns VBox status code.
306 * @param ppSession Where to store the session handle. Defaults to NULL.
307 * @param cbReserve The number of bytes of contiguous memory that should be reserved by
308 * the runtime / support library.
309 * Set this to 0 if no reservation is required. (default)
310 * Set this to ~0 if the maximum amount supported by the VM is to be
311 * attempted reserved, or the maximum available.
312 */
313#ifdef __cplusplus
314SUPR3DECL(int) SUPInit(PSUPDRVSESSION *ppSession = NULL, size_t cbReserve = 0);
315#else
316SUPR3DECL(int) SUPInit(PSUPDRVSESSION *ppSession, size_t cbReserve);
317#endif
318
319/**
320 * Terminates the support library.
321 *
322 * @returns VBox status code.
323 * @param fForced Forced termination. This means to ignore the
324 * init call count and just terminated.
325 */
326#ifdef __cplusplus
327SUPR3DECL(int) SUPTerm(bool fForced = false);
328#else
329SUPR3DECL(int) SUPTerm(int fForced);
330#endif
331
332/**
333 * Sets the ring-0 VM handle for use with fast IOCtls.
334 *
335 * @returns VBox status code.
336 * @param pVMR0 The ring-0 VM handle.
337 * NIL_RTR0PTR can be used to unset the handle when the
338 * VM is about to be destroyed.
339 */
340SUPR3DECL(int) SUPSetVMForFastIOCtl(PVMR0 pVMR0);
341
342/**
343 * Calls the HC R0 VMM entry point.
344 * See VMMR0Entry() for more details.
345 *
346 * @returns error code specific to uFunction.
347 * @param pVMR0 Pointer to the Ring-0 (Host Context) mapping of the VM structure.
348 * @param uOperation Operation to execute.
349 * @param pvArg Argument.
350 */
351SUPR3DECL(int) SUPCallVMMR0(PVMR0 pVMR0, unsigned uOperation, void *pvArg);
352
353/**
354 * Variant of SUPCallVMMR0, except that this takes the fast ioclt path
355 * regardsless of compile-time defaults.
356 *
357 * @returns VBox status code.
358 * @param pVMR0 The ring-0 VM handle.
359 * @param uOperation The operation; only the SUP_VMMR0_DO_* ones are valid.
360 */
361SUPR3DECL(int) SUPCallVMMR0Fast(PVMR0 pVMR0, unsigned uOperation);
362
363/**
364 * Calls the HC R0 VMM entry point, in a safer but slower manner than SUPCallVMMR0.
365 * When entering using this call the R0 components can call into the host kernel
366 * (i.e. use the SUPR0 and RT APIs).
367 *
368 * See VMMR0Entry() for more details.
369 *
370 * @returns error code specific to uFunction.
371 * @param pVMR0 Pointer to the Ring-0 (Host Context) mapping of the VM structure.
372 * @param uOperation Operation to execute.
373 * @param u64Arg Constant argument.
374 * @param pReqHdr Pointer to a request header. Optional.
375 * This will be copied in and out of kernel space. There currently is a size
376 * limit on this, just below 4KB.
377 */
378SUPR3DECL(int) SUPCallVMMR0Ex(PVMR0 pVMR0, unsigned uOperation, uint64_t u64Arg, PSUPVMMR0REQHDR pReqHdr);
379
380/**
381 * Queries the paging mode of the host OS.
382 *
383 * @returns The paging mode.
384 */
385SUPR3DECL(SUPPAGINGMODE) SUPGetPagingMode(void);
386
387/**
388 * Allocate zero-filled pages.
389 *
390 * Use this to allocate a number of pages rather than using RTMem*() and mess with
391 * alignment. The returned address is of course page aligned. Call SUPPageFree()
392 * to free the pages once done with them.
393 *
394 * @returns VBox status.
395 * @param cPages Number of pages to allocate.
396 * @param ppvPages Where to store the base pointer to the allocated pages.
397 */
398SUPR3DECL(int) SUPPageAlloc(size_t cPages, void **ppvPages);
399
400/**
401 * Frees pages allocated with SUPPageAlloc().
402 *
403 * @returns VBox status.
404 * @param pvPages Pointer returned by SUPPageAlloc().
405 * @param cPages Number of pages that was allocated.
406 */
407SUPR3DECL(int) SUPPageFree(void *pvPages, size_t cPages);
408
409/**
410 * Allocate zero-filled locked pages.
411 *
412 * Use this to allocate a number of pages rather than using RTMem*() and mess with
413 * alignment. The returned address is of course page aligned. Call SUPPageFreeLocked()
414 * to free the pages once done with them.
415 *
416 * @returns VBox status.
417 * @param cPages Number of pages to allocate.
418 * @param ppvPages Where to store the base pointer to the allocated pages.
419 */
420SUPR3DECL(int) SUPPageAllocLocked(size_t cPages, void **ppvPages);
421
422/**
423 * Allocate zero-filled locked pages.
424 *
425 * Use this to allocate a number of pages rather than using RTMem*() and mess with
426 * alignment. The returned address is of course page aligned. Call SUPPageFreeLocked()
427 * to free the pages once done with them.
428 *
429 * @returns VBox status code.
430 * @param cPages Number of pages to allocate.
431 * @param ppvPages Where to store the base pointer to the allocated pages.
432 * @param paPages Where to store the physical page addresses returned.
433 * On entry this will point to an array of with cbMemory >> PAGE_SHIFT entries.
434 * NULL is allowed.
435 */
436SUPR3DECL(int) SUPPageAllocLockedEx(size_t cPages, void **ppvPages, PSUPPAGE paPages);
437
438/**
439 * Frees locked pages allocated with SUPPageAllocLocked().
440 *
441 * @returns VBox status.
442 * @param pvPages Pointer returned by SUPPageAlloc().
443 * @param cPages Number of pages that was allocated.
444 */
445SUPR3DECL(int) SUPPageFreeLocked(void *pvPages, size_t cPages);
446
447/**
448 * Locks down the physical memory backing a virtual memory
449 * range in the current process.
450 *
451 * @returns VBox status code.
452 * @param pvStart Start of virtual memory range.
453 * Must be page aligned.
454 * @param cPages Number of pages.
455 * @param paPages Where to store the physical page addresses returned.
456 * On entry this will point to an array of with cbMemory >> PAGE_SHIFT entries.
457 */
458SUPR3DECL(int) SUPPageLock(void *pvStart, size_t cPages, PSUPPAGE paPages);
459
460/**
461 * Releases locked down pages.
462 *
463 * @returns VBox status code.
464 * @param pvStart Start of virtual memory range previously locked
465 * down by SUPPageLock().
466 */
467SUPR3DECL(int) SUPPageUnlock(void *pvStart);
468
469/**
470 * Allocated memory with page aligned memory with a contiguous and locked physical
471 * memory backing below 4GB.
472 *
473 * @returns Pointer to the allocated memory (virtual address).
474 * *pHCPhys is set to the physical address of the memory.
475 * The returned memory must be freed using SUPContFree().
476 * @returns NULL on failure.
477 * @param cPages Number of pages to allocate.
478 * @param pHCPhys Where to store the physical address of the memory block.
479 */
480SUPR3DECL(void *) SUPContAlloc(size_t cPages, PRTHCPHYS pHCPhys);
481
482/**
483 * Allocated memory with page aligned memory with a contiguous and locked physical
484 * memory backing below 4GB.
485 *
486 * @returns Pointer to the allocated memory (virtual address).
487 * *pHCPhys is set to the physical address of the memory.
488 * If ppvR0 isn't NULL, *ppvR0 is set to the ring-0 mapping.
489 * The returned memory must be freed using SUPContFree().
490 * @returns NULL on failure.
491 * @param cPages Number of pages to allocate.
492 * @param pR0Ptr Where to store the ring-0 mapping of the allocation. (optional)
493 * @param pHCPhys Where to store the physical address of the memory block.
494 *
495 * @remark This 2nd version of this API exists because we're not able to map the
496 * ring-3 mapping executable on WIN64. This is a serious problem in regard to
497 * the world switchers.
498 */
499SUPR3DECL(void *) SUPContAlloc2(size_t cPages, PRTR0PTR pR0Ptr, PRTHCPHYS pHCPhys);
500
501/**
502 * Frees memory allocated with SUPContAlloc().
503 *
504 * @returns VBox status code.
505 * @param pv Pointer to the memory block which should be freed.
506 * @param cPages Number of pages to be freed.
507 */
508SUPR3DECL(int) SUPContFree(void *pv, size_t cPages);
509
510/**
511 * Allocated non contiguous physical memory below 4GB.
512 *
513 * @returns VBox status code.
514 * @returns NULL on failure.
515 * @param cPages Number of pages to allocate.
516 * @param ppvPages Where to store the pointer to the allocated memory.
517 * The pointer stored here on success must be passed to SUPLowFree when
518 * the memory should be released.
519 * @param ppvPagesR0 Where to store the ring-0 pointer to the allocated memory. optional.
520 * @param paPages Where to store the physical addresses of the individual pages.
521 */
522SUPR3DECL(int) SUPLowAlloc(size_t cPages, void **ppvPages, PRTR0PTR ppvPagesR0, PSUPPAGE paPages);
523
524/**
525 * Frees memory allocated with SUPLowAlloc().
526 *
527 * @returns VBox status code.
528 * @param pv Pointer to the memory block which should be freed.
529 * @param cPages Number of pages that was allocated.
530 */
531SUPR3DECL(int) SUPLowFree(void *pv, size_t cPages);
532
533/**
534 * Load a module into R0 HC.
535 *
536 * @returns VBox status code.
537 * @param pszFilename The path to the image file.
538 * @param pszModule The module name. Max 32 bytes.
539 */
540SUPR3DECL(int) SUPLoadModule(const char *pszFilename, const char *pszModule, void **ppvImageBase);
541
542/**
543 * Frees a R0 HC module.
544 *
545 * @returns VBox status code.
546 * @param pszModule The module to free.
547 * @remark This will not actually 'free' the module, there are of course usage counting.
548 */
549SUPR3DECL(int) SUPFreeModule(void *pvImageBase);
550
551/**
552 * Get the address of a symbol in a ring-0 module.
553 *
554 * @returns VBox status code.
555 * @param pszModule The module name.
556 * @param pszSymbol Symbol name. If it's value is less than 64k it's treated like a
557 * ordinal value rather than a string pointer.
558 * @param ppvValue Where to store the symbol value.
559 */
560SUPR3DECL(int) SUPGetSymbolR0(void *pvImageBase, const char *pszSymbol, void **ppvValue);
561
562/**
563 * Load R0 HC VMM code.
564 *
565 * @returns VBox status code.
566 * @deprecated Use SUPLoadModule(pszFilename, "VMMR0.r0", &pvImageBase)
567 */
568SUPR3DECL(int) SUPLoadVMM(const char *pszFilename);
569
570/**
571 * Unloads R0 HC VMM code.
572 *
573 * @returns VBox status code.
574 * @deprecated Use SUPFreeModule().
575 */
576SUPR3DECL(int) SUPUnloadVMM(void);
577
578/**
579 * Get the physical address of the GIP.
580 *
581 * @returns VBox status code.
582 * @param pHCPhys Where to store the physical address of the GIP.
583 */
584SUPR3DECL(int) SUPGipGetPhys(PRTHCPHYS pHCPhys);
585
586/** @} */
587#endif /* IN_RING3 */
588
589
590#ifdef IN_RING0
591/** @defgroup grp_sup_r0 SUP Host Context Ring 0 API
592 * @ingroup grp_sup
593 * @{
594 */
595
596/**
597 * Security objectype.
598 */
599typedef enum SUPDRVOBJTYPE
600{
601 /** The usual invalid object. */
602 SUPDRVOBJTYPE_INVALID = 0,
603 /** Internal network. */
604 SUPDRVOBJTYPE_INTERNAL_NETWORK,
605 /** Internal network interface. */
606 SUPDRVOBJTYPE_INTERNAL_NETWORK_INTERFACE,
607 /** The first invalid object type in this end. */
608 SUPDRVOBJTYPE_END,
609 /** The usual 32-bit type size hack. */
610 SUPDRVOBJTYPE_32_BIT_HACK = 0x7ffffff
611} SUPDRVOBJTYPE;
612
613/**
614 * Object destructor callback.
615 * This is called for reference counted objectes when the count reaches 0.
616 *
617 * @param pvObj The object pointer.
618 * @param pvUser1 The first user argument.
619 * @param pvUser2 The second user argument.
620 */
621typedef DECLCALLBACK(void) FNSUPDRVDESTRUCTOR(void *pvObj, void *pvUser1, void *pvUser2);
622/** Pointer to a FNSUPDRVDESTRUCTOR(). */
623typedef FNSUPDRVDESTRUCTOR *PFNSUPDRVDESTRUCTOR;
624
625SUPR0DECL(void *) SUPR0ObjRegister(PSUPDRVSESSION pSession, SUPDRVOBJTYPE enmType, PFNSUPDRVDESTRUCTOR pfnDestructor, void *pvUser1, void *pvUser2);
626SUPR0DECL(int) SUPR0ObjAddRef(void *pvObj, PSUPDRVSESSION pSession);
627SUPR0DECL(int) SUPR0ObjRelease(void *pvObj, PSUPDRVSESSION pSession);
628SUPR0DECL(int) SUPR0ObjVerifyAccess(void *pvObj, PSUPDRVSESSION pSession, const char *pszObjName);
629
630SUPR0DECL(int) SUPR0LockMem(PSUPDRVSESSION pSession, RTR3PTR pvR3, uint32_t cPages, PRTHCPHYS paPages);
631SUPR0DECL(int) SUPR0UnlockMem(PSUPDRVSESSION pSession, RTR3PTR pvR3);
632SUPR0DECL(int) SUPR0ContAlloc(PSUPDRVSESSION pSession, uint32_t cPages, PRTR0PTR ppvR0, PRTR3PTR ppvR3, PRTHCPHYS pHCPhys);
633SUPR0DECL(int) SUPR0ContFree(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr);
634SUPR0DECL(int) SUPR0LowAlloc(PSUPDRVSESSION pSession, uint32_t cPages, PRTR0PTR ppvR0, PRTR3PTR ppvR3, PRTHCPHYS paPages);
635SUPR0DECL(int) SUPR0LowFree(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr);
636SUPR0DECL(int) SUPR0MemAlloc(PSUPDRVSESSION pSession, uint32_t cb, PRTR0PTR ppvR0, PRTR3PTR ppvR3);
637SUPR0DECL(int) SUPR0MemGetPhys(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr, PSUPPAGE paPages);
638SUPR0DECL(int) SUPR0MemFree(PSUPDRVSESSION pSession, RTHCUINTPTR uPtr);
639SUPR0DECL(int) SUPR0PageAlloc(PSUPDRVSESSION pSession, uint32_t cPages, PRTR3PTR ppvR3, PRTHCPHYS paPages);
640SUPR0DECL(int) SUPR0PageFree(PSUPDRVSESSION pSession, RTR3PTR pvR3);
641SUPR0DECL(int) SUPR0GipMap(PSUPDRVSESSION pSession, PRTR3PTR ppGipR3, PRTHCPHYS pHCPhysGip);
642SUPR0DECL(int) SUPR0GipUnmap(PSUPDRVSESSION pSession);
643SUPR0DECL(int) SUPR0Printf(const char *pszFormat, ...);
644
645/** @} */
646#endif
647
648/** @} */
649
650__END_DECLS
651
652#endif
653
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette