VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h@ 10377

Last change on this file since 10377 was 10377, checked in by vboxsync, 16 years ago

Implemented the IDC methods. Moved the setting of the R0Process and Process SUPDRVSESSION members to SUPDrv.c, and made SUPDrv.c provide default initialization of the Uid and Gid members.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 27.8 KB
Line 
1/* $Revision: 10377 $ */
2/** @file
3 * VirtualBox Support Driver - IOCtl definitions.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 *
26 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 */
30
31#ifndef ___SUPDrvIOC_h___
32#define ___SUPDrvIOC_h___
33
34/*
35 * Basic types.
36 */
37#include <iprt/stdint.h>
38
39/*
40 * IOCtl numbers.
41 * We're using the Win32 type of numbers here, thus the macros below.
42 * The SUP_IOCTL_FLAG macro is used to separate requests from 32-bit
43 * and 64-bit processes.
44 */
45#ifdef RT_ARCH_AMD64
46# define SUP_IOCTL_FLAG 128
47#elif defined(RT_ARCH_X86)
48# define SUP_IOCTL_FLAG 0
49#else
50# error "dunno which arch this is!"
51#endif
52
53#ifdef RT_OS_WINDOWS
54# ifndef CTL_CODE
55# include <Windows.h>
56# endif
57 /* Automatic buffering, size not encoded. */
58# define SUP_CTL_CODE_SIZE(Function, Size) CTL_CODE(FILE_DEVICE_UNKNOWN, (Function) | SUP_IOCTL_FLAG, METHOD_BUFFERED, FILE_WRITE_ACCESS)
59# define SUP_CTL_CODE_BIG(Function) CTL_CODE(FILE_DEVICE_UNKNOWN, (Function) | SUP_IOCTL_FLAG, METHOD_BUFFERED, FILE_WRITE_ACCESS)
60# define SUP_CTL_CODE_FAST(Function) CTL_CODE(FILE_DEVICE_UNKNOWN, (Function) | SUP_IOCTL_FLAG, METHOD_NEITHER, FILE_WRITE_ACCESS)
61# define SUP_CTL_CODE_NO_SIZE(uIOCtl) (uIOCtl)
62
63#elif defined(RT_OS_SOLARIS)
64 /* No automatic buffering, size limited to 255 bytes. */
65# include <sys/ioccom.h>
66# define SUP_CTL_CODE_SIZE(Function, Size) _IOWRN('V', (Function) | SUP_IOCTL_FLAG, sizeof(SUPREQHDR))
67# define SUP_CTL_CODE_BIG(Function) _IOWRN('V', (Function) | SUP_IOCTL_FLAG, sizeof(SUPREQHDR))
68# define SUP_CTL_CODE_FAST(Function) _IO( 'V', (Function) | SUP_IOCTL_FLAG)
69# define SUP_CTL_CODE_NO_SIZE(uIOCtl) (uIOCtl)
70
71#elif defined(RT_OS_OS2)
72 /* No automatic buffering, size not encoded. */
73# define SUP_CTL_CATEGORY 0xc0
74# define SUP_CTL_CODE_SIZE(Function, Size) ((unsigned char)(Function))
75# define SUP_CTL_CODE_BIG(Function) ((unsigned char)(Function))
76# define SUP_CTL_CATEGORY_FAST 0xc1
77# define SUP_CTL_CODE_FAST(Function) ((unsigned char)(Function))
78# define SUP_CTL_CODE_NO_SIZE(uIOCtl) (uIOCtl)
79
80#elif defined(RT_OS_LINUX)
81 /* No automatic buffering, size limited to 16KB. */
82# include <linux/ioctl.h>
83# define SUP_CTL_CODE_SIZE(Function, Size) _IOC(_IOC_READ | _IOC_WRITE, 'V', (Function) | SUP_IOCTL_FLAG, (Size))
84# define SUP_CTL_CODE_BIG(Function) _IO('V', (Function) | SUP_IOCTL_FLAG)
85# define SUP_CTL_CODE_FAST(Function) _IO('V', (Function) | SUP_IOCTL_FLAG)
86# define SUP_CTL_CODE_NO_SIZE(uIOCtl) ((uIOCtl) & ~IOCSIZE_MASK)
87
88#elif defined(RT_OS_L4)
89 /* Implemented in suplib, no worries. */
90# define SUP_CTL_CODE_SIZE(Function, Size) (Function)
91# define SUP_CTL_CODE_BIG(Function) (Function)
92# define SUP_CTL_CODE_FAST(Function) (Function)
93# define SUP_CTL_CODE_NO_SIZE(uIOCtl) (uIOCtl)
94
95#else /* BSD Like */
96 /* Automatic buffering, size limited to 4KB on *BSD and 8KB on Darwin - commands the limit, 4KB. */
97# include <sys/ioccom.h>
98# define SUP_CTL_CODE_SIZE(Function, Size) _IOC(IOC_INOUT, 'V', (Function) | SUP_IOCTL_FLAG, (Size))
99# define SUP_CTL_CODE_BIG(Function) _IO('V', (Function) | SUP_IOCTL_FLAG)
100# define SUP_CTL_CODE_FAST(Function) _IO('V', (Function) | SUP_IOCTL_FLAG)
101# define SUP_CTL_CODE_NO_SIZE(uIOCtl) ( (uIOCtl) & ~_IOC(0,0,0,IOCPARM_MASK) )
102#endif
103
104/** Fast path IOCtl: VMMR0_DO_RAW_RUN */
105#define SUP_IOCTL_FAST_DO_RAW_RUN SUP_CTL_CODE_FAST(64)
106/** Fast path IOCtl: VMMR0_DO_HWACC_RUN */
107#define SUP_IOCTL_FAST_DO_HWACC_RUN SUP_CTL_CODE_FAST(65)
108/** Just a NOP call for profiling the latency of a fast ioctl call to VMMR0. */
109#define SUP_IOCTL_FAST_DO_NOP SUP_CTL_CODE_FAST(66)
110
111
112
113/*******************************************************************************
114* Structures and Typedefs *
115*******************************************************************************/
116#ifdef RT_ARCH_AMD64
117# pragma pack(8) /* paranoia. */
118#else
119# pragma pack(4) /* paranoia. */
120#endif
121
122
123/**
124 * Common In/Out header.
125 */
126typedef struct SUPREQHDR
127{
128 /** Cookie. */
129 uint32_t u32Cookie;
130 /** Session cookie. */
131 uint32_t u32SessionCookie;
132 /** The size of the input. */
133 uint32_t cbIn;
134 /** The size of the output. */
135 uint32_t cbOut;
136 /** Flags. See SUPREQHDR_FLAGS_* for details and values. */
137 uint32_t fFlags;
138 /** The VBox status code of the operation, out direction only. */
139 int32_t rc;
140} SUPREQHDR;
141/** Pointer to a IOC header. */
142typedef SUPREQHDR *PSUPREQHDR;
143
144/** @name SUPREQHDR::fFlags values
145 * @{ */
146/** Masks out the magic value. */
147#define SUPREQHDR_FLAGS_MAGIC_MASK UINT32_C(0xff0000ff)
148/** The generic mask. */
149#define SUPREQHDR_FLAGS_GEN_MASK UINT32_C(0x0000ff00)
150/** The request specific mask. */
151#define SUPREQHDR_FLAGS_REQ_MASK UINT32_C(0x00ff0000)
152
153/** There is extra input that needs copying on some platforms. */
154#define SUPREQHDR_FLAGS_EXTRA_IN UINT32_C(0x00000100)
155/** There is extra output that needs copying on some platforms. */
156#define SUPREQHDR_FLAGS_EXTRA_OUT UINT32_C(0x00000200)
157
158/** The magic value. */
159#define SUPREQHDR_FLAGS_MAGIC UINT32_C(0x42000042)
160/** The default value. Use this when no special stuff is requested. */
161#define SUPREQHDR_FLAGS_DEFAULT SUPREQHDR_FLAGS_MAGIC
162/** @} */
163
164
165/** @name SUP_IOCTL_COOKIE
166 * @{
167 */
168/** Negotiate cookie. */
169#define SUP_IOCTL_COOKIE SUP_CTL_CODE_SIZE(1, SUP_IOCTL_COOKIE_SIZE)
170/** The request size. */
171#define SUP_IOCTL_COOKIE_SIZE sizeof(SUPCOOKIE)
172/** The SUPREQHDR::cbIn value. */
173#define SUP_IOCTL_COOKIE_SIZE_IN sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPCOOKIE, u.In)
174/** The SUPREQHDR::cbOut value. */
175#define SUP_IOCTL_COOKIE_SIZE_OUT sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPCOOKIE, u.Out)
176/** SUPCOOKIE_IN magic word. */
177#define SUPCOOKIE_MAGIC "The Magic Word!"
178/** The initial cookie. */
179#define SUPCOOKIE_INITIAL_COOKIE 0x69726f74 /* 'tori' */
180
181/** Current interface version.
182 * The upper 16-bit is the major version, the the lower the minor version.
183 * When incompatible changes are made, the upper major number has to be changed. */
184#define SUPDRVIOC_VERSION 0x00070003
185
186/** SUP_IOCTL_COOKIE. */
187typedef struct SUPCOOKIE
188{
189 /** The header.
190 * u32Cookie must be set to SUPCOOKIE_INITIAL_COOKIE.
191 * u32SessionCookie should be set to some random value. */
192 SUPREQHDR Hdr;
193 union
194 {
195 struct
196 {
197 /** Magic word. */
198 char szMagic[16];
199 /** The requested interface version number. */
200 uint32_t u32ReqVersion;
201 /** The minimum interface version number. */
202 uint32_t u32MinVersion;
203 } In;
204 struct
205 {
206 /** Cookie. */
207 uint32_t u32Cookie;
208 /** Session cookie. */
209 uint32_t u32SessionCookie;
210 /** Interface version for this session. */
211 uint32_t u32SessionVersion;
212 /** The actual interface version in the driver. */
213 uint32_t u32DriverVersion;
214 /** Number of functions available for the SUP_IOCTL_QUERY_FUNCS request. */
215 uint32_t cFunctions;
216 /** Session handle. */
217 R0PTRTYPE(PSUPDRVSESSION) pSession;
218 } Out;
219 } u;
220} SUPCOOKIE, *PSUPCOOKIE;
221/** @} */
222
223
224/** @name SUP_IOCTL_QUERY_FUNCS
225 * Query SUPR0 functions.
226 * @{
227 */
228#define SUP_IOCTL_QUERY_FUNCS(cFuncs) SUP_CTL_CODE_SIZE(2, SUP_IOCTL_QUERY_FUNCS_SIZE(cFuncs))
229#define SUP_IOCTL_QUERY_FUNCS_SIZE(cFuncs) RT_OFFSETOF(SUPQUERYFUNCS, u.Out.aFunctions[(cFuncs)])
230#define SUP_IOCTL_QUERY_FUNCS_SIZE_IN sizeof(SUPREQHDR)
231#define SUP_IOCTL_QUERY_FUNCS_SIZE_OUT(cFuncs) SUP_IOCTL_QUERY_FUNCS_SIZE(cFuncs)
232
233/** A function. */
234typedef struct SUPFUNC
235{
236 /** Name - mangled. */
237 char szName[32];
238 /** Address. */
239 RTR0PTR pfn;
240} SUPFUNC, *PSUPFUNC;
241
242typedef struct SUPQUERYFUNCS
243{
244 /** The header. */
245 SUPREQHDR Hdr;
246 union
247 {
248 struct
249 {
250 /** Number of functions returned. */
251 uint32_t cFunctions;
252 /** Array of functions. */
253 SUPFUNC aFunctions[1];
254 } Out;
255 } u;
256} SUPQUERYFUNCS, *PSUPQUERYFUNCS;
257/** @} */
258
259
260/** @name SUP_IOCTL_IDT_INSTALL
261 * Install IDT patch for calling processor.
262 * @{
263 */
264#define SUP_IOCTL_IDT_INSTALL SUP_CTL_CODE_SIZE(3, SUP_IOCTL_IDT_INSTALL_SIZE)
265#define SUP_IOCTL_IDT_INSTALL_SIZE sizeof(SUPIDTINSTALL)
266#define SUP_IOCTL_IDT_INSTALL_SIZE_IN sizeof(SUPREQHDR)
267#define SUP_IOCTL_IDT_INSTALL_SIZE_OUT sizeof(SUPIDTINSTALL)
268typedef struct SUPIDTINSTALL
269{
270 /** The header. */
271 SUPREQHDR Hdr;
272 union
273 {
274 struct
275 {
276 /** The IDT entry number. */
277 uint8_t u8Idt;
278 } Out;
279 } u;
280} SUPIDTINSTALL, *PSUPIDTINSTALL;
281/** @} */
282
283
284/** @name SUP_IOCTL_IDT_REMOVE
285 * Remove IDT patch for calling processor.
286 * @{
287 */
288#define SUP_IOCTL_IDT_REMOVE SUP_CTL_CODE_SIZE(4, SUP_IOCTL_IDT_REMOVE_SIZE)
289#define SUP_IOCTL_IDT_REMOVE_SIZE sizeof(SUPIDTREMOVE)
290#define SUP_IOCTL_IDT_REMOVE_SIZE_IN sizeof(SUPIDTREMOVE)
291#define SUP_IOCTL_IDT_REMOVE_SIZE_OUT sizeof(SUPIDTREMOVE)
292typedef struct SUPIDTREMOVE
293{
294 /** The header. */
295 SUPREQHDR Hdr;
296} SUPIDTREMOVE, *PSUPIDTREMOVE;
297/** @}*/
298
299
300/** @name SUP_IOCTL_LDR_OPEN
301 * Open an image.
302 * @{
303 */
304#define SUP_IOCTL_LDR_OPEN SUP_CTL_CODE_SIZE(5, SUP_IOCTL_LDR_OPEN_SIZE)
305#define SUP_IOCTL_LDR_OPEN_SIZE sizeof(SUPLDROPEN)
306#define SUP_IOCTL_LDR_OPEN_SIZE_IN sizeof(SUPLDROPEN)
307#define SUP_IOCTL_LDR_OPEN_SIZE_OUT (sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPLDROPEN, u.Out))
308typedef struct SUPLDROPEN
309{
310 /** The header. */
311 SUPREQHDR Hdr;
312 union
313 {
314 struct
315 {
316 /** Size of the image we'll be loading. */
317 uint32_t cbImage;
318 /** Image name.
319 * This is the NAME of the image, not the file name. It is used
320 * to share code with other processes. (Max len is 32 chars!) */
321 char szName[32];
322 } In;
323 struct
324 {
325 /** The base address of the image. */
326 RTR0PTR pvImageBase;
327 /** Indicate whether or not the image requires loading. */
328 bool fNeedsLoading;
329 } Out;
330 } u;
331} SUPLDROPEN, *PSUPLDROPEN;
332/** @} */
333
334
335/** @name SUP_IOCTL_LDR_LOAD
336 * Upload the image bits.
337 * @{
338 */
339#define SUP_IOCTL_LDR_LOAD SUP_CTL_CODE_BIG(6)
340#define SUP_IOCTL_LDR_LOAD_SIZE(cbImage) RT_OFFSETOF(SUPLDRLOAD, u.In.achImage[cbImage])
341#define SUP_IOCTL_LDR_LOAD_SIZE_IN(cbImage) RT_OFFSETOF(SUPLDRLOAD, u.In.achImage[cbImage])
342#define SUP_IOCTL_LDR_LOAD_SIZE_OUT sizeof(SUPREQHDR)
343
344/**
345 * Module initialization callback function.
346 * This is called once after the module has been loaded.
347 *
348 * @returns 0 on success.
349 * @returns Appropriate error code on failure.
350 */
351typedef DECLCALLBACK(int) FNR0MODULEINIT(void);
352/** Pointer to a FNR0MODULEINIT(). */
353typedef R0PTRTYPE(FNR0MODULEINIT *) PFNR0MODULEINIT;
354
355/**
356 * Module termination callback function.
357 * This is called once right before the module is being unloaded.
358 */
359typedef DECLCALLBACK(void) FNR0MODULETERM(void);
360/** Pointer to a FNR0MODULETERM(). */
361typedef R0PTRTYPE(FNR0MODULETERM *) PFNR0MODULETERM;
362
363/**
364 * Symbol table entry.
365 */
366typedef struct SUPLDRSYM
367{
368 /** Offset into of the string table. */
369 uint32_t offName;
370 /** Offset of the symbol relative to the image load address. */
371 uint32_t offSymbol;
372} SUPLDRSYM;
373/** Pointer to a symbol table entry. */
374typedef SUPLDRSYM *PSUPLDRSYM;
375/** Pointer to a const symbol table entry. */
376typedef SUPLDRSYM const *PCSUPLDRSYM;
377
378/**
379 * SUPLDRLOAD::u::In::EP type.
380 */
381typedef enum SUPLDRLOADEP
382{
383 SUPLDRLOADEP_NOTHING = 0,
384 SUPLDRLOADEP_VMMR0,
385 SUPLDRLOADEP_32BIT_HACK = 0x7fffffff
386} SUPLDRLOADEP;
387
388typedef struct SUPLDRLOAD
389{
390 /** The header. */
391 SUPREQHDR Hdr;
392 union
393 {
394 struct
395 {
396 /** The address of module initialization function. Similar to _DLL_InitTerm(hmod, 0). */
397 PFNR0MODULEINIT pfnModuleInit;
398 /** The address of module termination function. Similar to _DLL_InitTerm(hmod, 1). */
399 PFNR0MODULETERM pfnModuleTerm;
400 /** Special entry points. */
401 union
402 {
403 struct
404 {
405 /** The module handle (i.e. address). */
406 RTR0PTR pvVMMR0;
407 /** Address of VMMR0EntryInt function. */
408 RTR0PTR pvVMMR0EntryInt;
409 /** Address of VMMR0EntryFast function. */
410 RTR0PTR pvVMMR0EntryFast;
411 /** Address of VMMR0EntryEx function. */
412 RTR0PTR pvVMMR0EntryEx;
413 } VMMR0;
414 } EP;
415 /** Address. */
416 RTR0PTR pvImageBase;
417 /** Entry point type. */
418 SUPLDRLOADEP eEPType;
419 /** The offset of the symbol table. */
420 uint32_t offSymbols;
421 /** The number of entries in the symbol table. */
422 uint32_t cSymbols;
423 /** The offset of the string table. */
424 uint32_t offStrTab;
425 /** Size of the string table. */
426 uint32_t cbStrTab;
427 /** Size of image (including string and symbol tables). */
428 uint32_t cbImage;
429 /** The image data. */
430 char achImage[1];
431 } In;
432 } u;
433} SUPLDRLOAD, *PSUPLDRLOAD;
434/** @} */
435
436
437/** @name SUP_IOCTL_LDR_FREE
438 * Free an image.
439 * @{
440 */
441#define SUP_IOCTL_LDR_FREE SUP_CTL_CODE_SIZE(7, SUP_IOCTL_LDR_FREE_SIZE)
442#define SUP_IOCTL_LDR_FREE_SIZE sizeof(SUPLDRFREE)
443#define SUP_IOCTL_LDR_FREE_SIZE_IN sizeof(SUPLDRFREE)
444#define SUP_IOCTL_LDR_FREE_SIZE_OUT sizeof(SUPREQHDR)
445typedef struct SUPLDRFREE
446{
447 /** The header. */
448 SUPREQHDR Hdr;
449 union
450 {
451 struct
452 {
453 /** Address. */
454 RTR0PTR pvImageBase;
455 } In;
456 } u;
457} SUPLDRFREE, *PSUPLDRFREE;
458/** @} */
459
460
461/** @name SUP_IOCTL_LDR_GET_SYMBOL
462 * Get address of a symbol within an image.
463 * @{
464 */
465#define SUP_IOCTL_LDR_GET_SYMBOL SUP_CTL_CODE_SIZE(8, SUP_IOCTL_LDR_GET_SYMBOL_SIZE)
466#define SUP_IOCTL_LDR_GET_SYMBOL_SIZE sizeof(SUPLDRGETSYMBOL)
467#define SUP_IOCTL_LDR_GET_SYMBOL_SIZE_IN sizeof(SUPLDRGETSYMBOL)
468#define SUP_IOCTL_LDR_GET_SYMBOL_SIZE_OUT (sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPLDRGETSYMBOL, u.Out))
469typedef struct SUPLDRGETSYMBOL
470{
471 /** The header. */
472 SUPREQHDR Hdr;
473 union
474 {
475 struct
476 {
477 /** Address. */
478 RTR0PTR pvImageBase;
479 /** The symbol name. */
480 char szSymbol[64];
481 } In;
482 struct
483 {
484 /** The symbol address. */
485 RTR0PTR pvSymbol;
486 } Out;
487 } u;
488} SUPLDRGETSYMBOL, *PSUPLDRGETSYMBOL;
489/** @} */
490
491
492/** @name SUP_IOCTL_CALL_VMMR0
493 * Call the R0 VMM Entry point.
494 *
495 * @todo Might have to convert this to a big request...
496 * @{
497 */
498#define SUP_IOCTL_CALL_VMMR0(cbReq) SUP_CTL_CODE_SIZE(9, SUP_IOCTL_CALL_VMMR0_SIZE(cbReq))
499#define SUP_IOCTL_CALL_VMMR0_SIZE(cbReq) RT_OFFSETOF(SUPCALLVMMR0, abReqPkt[cbReq])
500#define SUP_IOCTL_CALL_VMMR0_SIZE_IN(cbReq) SUP_IOCTL_CALL_VMMR0_SIZE(cbReq)
501#define SUP_IOCTL_CALL_VMMR0_SIZE_OUT(cbReq) SUP_IOCTL_CALL_VMMR0_SIZE(cbReq)
502typedef struct SUPCALLVMMR0
503{
504 /** The header. */
505 SUPREQHDR Hdr;
506 union
507 {
508 struct
509 {
510 /** The VM handle. */
511 PVMR0 pVMR0;
512 /** Which operation to execute. */
513 uint32_t uOperation;
514#if R0_ARCH_BITS == 64
515 /** Alignment. */
516 uint32_t u32Reserved;
517#endif
518 /** Argument to use when no request packet is supplied. */
519 uint64_t u64Arg;
520 } In;
521 } u;
522 /** The VMMR0Entry request packet. */
523 uint8_t abReqPkt[1];
524} SUPCALLVMMR0, *PSUPCALLVMMR0;
525/** @} */
526
527
528/** @name SUP_IOCTL_LOW_ALLOC
529 * Allocate memory below 4GB (physically).
530 * @{
531 */
532#define SUP_IOCTL_LOW_ALLOC SUP_CTL_CODE_BIG(10)
533#define SUP_IOCTL_LOW_ALLOC_SIZE(cPages) ((uint32_t)RT_OFFSETOF(SUPLOWALLOC, u.Out.aPages[cPages]))
534#define SUP_IOCTL_LOW_ALLOC_SIZE_IN (sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPLOWALLOC, u.In))
535#define SUP_IOCTL_LOW_ALLOC_SIZE_OUT(cPages) SUP_IOCTL_LOW_ALLOC_SIZE(cPages)
536typedef struct SUPLOWALLOC
537{
538 /** The header. */
539 SUPREQHDR Hdr;
540 union
541 {
542 struct
543 {
544 /** Number of pages to allocate. */
545 uint32_t cPages;
546 } In;
547 struct
548 {
549 /** The ring-3 address of the allocated memory. */
550 RTR3PTR pvR3;
551 /** The ring-0 address of the allocated memory. */
552 RTR0PTR pvR0;
553 /** Array of pages. */
554 RTHCPHYS aPages[1];
555 } Out;
556 } u;
557} SUPLOWALLOC, *PSUPLOWALLOC;
558/** @} */
559
560
561/** @name SUP_IOCTL_LOW_FREE
562 * Free low memory.
563 * @{
564 */
565#define SUP_IOCTL_LOW_FREE SUP_CTL_CODE_SIZE(11, SUP_IOCTL_LOW_FREE_SIZE)
566#define SUP_IOCTL_LOW_FREE_SIZE sizeof(SUPLOWFREE)
567#define SUP_IOCTL_LOW_FREE_SIZE_IN sizeof(SUPLOWFREE)
568#define SUP_IOCTL_LOW_FREE_SIZE_OUT sizeof(SUPREQHDR)
569typedef struct SUPLOWFREE
570{
571 /** The header. */
572 SUPREQHDR Hdr;
573 union
574 {
575 struct
576 {
577 /** The ring-3 address of the memory to free. */
578 RTR3PTR pvR3;
579 } In;
580 } u;
581} SUPLOWFREE, *PSUPLOWFREE;
582/** @} */
583
584
585/** @name SUP_IOCTL_PAGE_ALLOC
586 * Allocate memory and map into the user process.
587 * The memory is of course locked.
588 * @{
589 */
590#define SUP_IOCTL_PAGE_ALLOC SUP_CTL_CODE_BIG(12)
591#define SUP_IOCTL_PAGE_ALLOC_SIZE(cPages) RT_OFFSETOF(SUPPAGEALLOC, u.Out.aPages[cPages])
592#define SUP_IOCTL_PAGE_ALLOC_SIZE_IN (sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPPAGEALLOC, u.In))
593#define SUP_IOCTL_PAGE_ALLOC_SIZE_OUT(cPages) SUP_IOCTL_PAGE_ALLOC_SIZE(cPages)
594typedef struct SUPPAGEALLOC
595{
596 /** The header. */
597 SUPREQHDR Hdr;
598 union
599 {
600 struct
601 {
602 /** Number of pages to allocate */
603 uint32_t cPages;
604 } In;
605 struct
606 {
607 /** Returned ring-3 address. */
608 RTR3PTR pvR3;
609 /** The physical addresses of the allocated pages. */
610 RTHCPHYS aPages[1];
611 } Out;
612 } u;
613} SUPPAGEALLOC, *PSUPPAGEALLOC;
614/** @} */
615
616
617/** @name SUP_IOCTL_PAGE_FREE
618 * Free memory allocated with SUP_IOCTL_PAGE_ALLOC.
619 * @{
620 */
621#define SUP_IOCTL_PAGE_FREE SUP_CTL_CODE_SIZE(13, SUP_IOCTL_PAGE_FREE_SIZE_IN)
622#define SUP_IOCTL_PAGE_FREE_SIZE sizeof(SUPPAGEFREE)
623#define SUP_IOCTL_PAGE_FREE_SIZE_IN sizeof(SUPPAGEFREE)
624#define SUP_IOCTL_PAGE_FREE_SIZE_OUT sizeof(SUPREQHDR)
625typedef struct SUPPAGEFREE
626{
627 /** The header. */
628 SUPREQHDR Hdr;
629 union
630 {
631 struct
632 {
633 /** Address of memory range to free. */
634 RTR3PTR pvR3;
635 } In;
636 } u;
637} SUPPAGEFREE, *PSUPPAGEFREE;
638/** @} */
639
640
641/** @name SUP_IOCTL_PAGE_LOCK
642 * Pin down physical pages.
643 * @{
644 */
645#define SUP_IOCTL_PAGE_LOCK SUP_CTL_CODE_BIG(14)
646#define SUP_IOCTL_PAGE_LOCK_SIZE(cPages) (RT_MAX((size_t)SUP_IOCTL_PAGE_LOCK_SIZE_IN, (size_t)SUP_IOCTL_PAGE_LOCK_SIZE_OUT(cPages)))
647#define SUP_IOCTL_PAGE_LOCK_SIZE_IN (sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPPAGELOCK, u.In))
648#define SUP_IOCTL_PAGE_LOCK_SIZE_OUT(cPages) RT_OFFSETOF(SUPPAGELOCK, u.Out.aPages[cPages])
649typedef struct SUPPAGELOCK
650{
651 /** The header. */
652 SUPREQHDR Hdr;
653 union
654 {
655 struct
656 {
657 /** Start of page range. Must be PAGE aligned. */
658 RTR3PTR pvR3;
659 /** The range size given as a page count. */
660 uint32_t cPages;
661 } In;
662
663 struct
664 {
665 /** Array of pages. */
666 RTHCPHYS aPages[1];
667 } Out;
668 } u;
669} SUPPAGELOCK, *PSUPPAGELOCK;
670/** @} */
671
672
673/** @name SUP_IOCTL_PAGE_UNLOCK
674 * Unpin physical pages.
675 * @{ */
676#define SUP_IOCTL_PAGE_UNLOCK SUP_CTL_CODE_SIZE(15, SUP_IOCTL_PAGE_UNLOCK_SIZE)
677#define SUP_IOCTL_PAGE_UNLOCK_SIZE sizeof(SUPPAGEUNLOCK)
678#define SUP_IOCTL_PAGE_UNLOCK_SIZE_IN sizeof(SUPPAGEUNLOCK)
679#define SUP_IOCTL_PAGE_UNLOCK_SIZE_OUT sizeof(SUPREQHDR)
680typedef struct SUPPAGEUNLOCK
681{
682 /** The header. */
683 SUPREQHDR Hdr;
684 union
685 {
686 struct
687 {
688 /** Start of page range of a range previuosly pinned. */
689 RTR3PTR pvR3;
690 } In;
691 } u;
692} SUPPAGEUNLOCK, *PSUPPAGEUNLOCK;
693/** @} */
694
695
696/** @name SUP_IOCTL_CONT_ALLOC
697 * Allocate contious memory.
698 * @{
699 */
700#define SUP_IOCTL_CONT_ALLOC SUP_CTL_CODE_SIZE(16, SUP_IOCTL_CONT_ALLOC_SIZE)
701#define SUP_IOCTL_CONT_ALLOC_SIZE sizeof(SUPCONTALLOC)
702#define SUP_IOCTL_CONT_ALLOC_SIZE_IN (sizeof(SUPREQHDR) + RT_SIZEOFMEMB(SUPCONTALLOC, u.In))
703#define SUP_IOCTL_CONT_ALLOC_SIZE_OUT sizeof(SUPCONTALLOC)
704typedef struct SUPCONTALLOC
705{
706 /** The header. */
707 SUPREQHDR Hdr;
708 union
709 {
710 struct
711 {
712 /** The allocation size given as a page count. */
713 uint32_t cPages;
714 } In;
715
716 struct
717 {
718 /** The address of the ring-0 mapping of the allocated memory. */
719 RTR0PTR pvR0;
720 /** The address of the ring-3 mapping of the allocated memory. */
721 RTR3PTR pvR3;
722 /** The physical address of the allocation. */
723 RTHCPHYS HCPhys;
724 } Out;
725 } u;
726} SUPCONTALLOC, *PSUPCONTALLOC;
727/** @} */
728
729
730/** @name SUP_IOCTL_CONT_FREE Input.
731 * @{
732 */
733/** Free contious memory. */
734#define SUP_IOCTL_CONT_FREE SUP_CTL_CODE_SIZE(17, SUP_IOCTL_CONT_FREE_SIZE)
735#define SUP_IOCTL_CONT_FREE_SIZE sizeof(SUPCONTFREE)
736#define SUP_IOCTL_CONT_FREE_SIZE_IN sizeof(SUPCONTFREE)
737#define SUP_IOCTL_CONT_FREE_SIZE_OUT sizeof(SUPREQHDR)
738typedef struct SUPCONTFREE
739{
740 /** The header. */
741 SUPREQHDR Hdr;
742 union
743 {
744 struct
745 {
746 /** The ring-3 address of the memory to free. */
747 RTR3PTR pvR3;
748 } In;
749 } u;
750} SUPCONTFREE, *PSUPCONTFREE;
751/** @} */
752
753
754/** @name SUP_IOCTL_GET_PAGING_MODE
755 * Get the host paging mode.
756 * @{
757 */
758#define SUP_IOCTL_GET_PAGING_MODE SUP_CTL_CODE_SIZE(18, SUP_IOCTL_GET_PAGING_MODE_SIZE)
759#define SUP_IOCTL_GET_PAGING_MODE_SIZE sizeof(SUPGETPAGINGMODE)
760#define SUP_IOCTL_GET_PAGING_MODE_SIZE_IN sizeof(SUPREQHDR)
761#define SUP_IOCTL_GET_PAGING_MODE_SIZE_OUT sizeof(SUPGETPAGINGMODE)
762typedef struct SUPGETPAGINGMODE
763{
764 /** The header. */
765 SUPREQHDR Hdr;
766 union
767 {
768 struct
769 {
770 /** The paging mode. */
771 SUPPAGINGMODE enmMode;
772 } Out;
773 } u;
774} SUPGETPAGINGMODE, *PSUPGETPAGINGMODE;
775/** @} */
776
777
778/** @name SUP_IOCTL_SET_VM_FOR_FAST
779 * Set the VM handle for doing fast call ioctl calls.
780 * @{
781 */
782#define SUP_IOCTL_SET_VM_FOR_FAST SUP_CTL_CODE_SIZE(19, SUP_IOCTL_SET_VM_FOR_FAST_SIZE)
783#define SUP_IOCTL_SET_VM_FOR_FAST_SIZE sizeof(SUPSETVMFORFAST)
784#define SUP_IOCTL_SET_VM_FOR_FAST_SIZE_IN sizeof(SUPSETVMFORFAST)
785#define SUP_IOCTL_SET_VM_FOR_FAST_SIZE_OUT sizeof(SUPREQHDR)
786typedef struct SUPSETVMFORFAST
787{
788 /** The header. */
789 SUPREQHDR Hdr;
790 union
791 {
792 struct
793 {
794 /** The ring-0 VM handle (pointer). */
795 PVMR0 pVMR0;
796 } In;
797 } u;
798} SUPSETVMFORFAST, *PSUPSETVMFORFAST;
799/** @} */
800
801
802/** @name SUP_IOCTL_GIP_MAP
803 * Map the GIP into user space.
804 * @{
805 */
806#define SUP_IOCTL_GIP_MAP SUP_CTL_CODE_SIZE(20, SUP_IOCTL_GIP_MAP_SIZE)
807#define SUP_IOCTL_GIP_MAP_SIZE sizeof(SUPGIPMAP)
808#define SUP_IOCTL_GIP_MAP_SIZE_IN sizeof(SUPREQHDR)
809#define SUP_IOCTL_GIP_MAP_SIZE_OUT sizeof(SUPGIPMAP)
810typedef struct SUPGIPMAP
811{
812 /** The header. */
813 SUPREQHDR Hdr;
814 union
815 {
816 struct
817 {
818 /** The physical address of the GIP. */
819 RTHCPHYS HCPhysGip;
820 /** Pointer to the read-only usermode GIP mapping for this session. */
821 R3PTRTYPE(PSUPGLOBALINFOPAGE) pGipR3;
822 /** Pointer to the supervisor mode GIP mapping. */
823 R0PTRTYPE(PSUPGLOBALINFOPAGE) pGipR0;
824 } Out;
825 } u;
826} SUPGIPMAP, *PSUPGIPMAP;
827/** @} */
828
829
830/** @name SUP_IOCTL_GIP_UNMAP
831 * Unmap the GIP.
832 * @{
833 */
834#define SUP_IOCTL_GIP_UNMAP SUP_CTL_CODE_SIZE(21, SUP_IOCTL_GIP_UNMAP_SIZE)
835#define SUP_IOCTL_GIP_UNMAP_SIZE sizeof(SUPGIPUNMAP)
836#define SUP_IOCTL_GIP_UNMAP_SIZE_IN sizeof(SUPGIPUNMAP)
837#define SUP_IOCTL_GIP_UNMAP_SIZE_OUT sizeof(SUPGIPUNMAP)
838typedef struct SUPGIPUNMAP
839{
840 /** The header. */
841 SUPREQHDR Hdr;
842} SUPGIPUNMAP, *PSUPGIPUNMAP;
843/** @} */
844
845
846#pragma pack() /* paranoia */
847
848#endif
849
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