VirtualBox

source: vbox/trunk/include/VBox/vmm/pdmifs.h@ 78976

Last change on this file since 78976 was 77451, checked in by vboxsync, 6 years ago

Devices/Graphics, pdm, Main: add out-of-range to host-side pointer reporting.
bugref:9376: Complete hardware cursor implementation in VMSVGA
The front-end can now send an out-of-range pointer event to say that the
pointer is outside of all guest windows. This can be useful when the cursor
is being drawn in software, as in this case it makes sense to hide it
altogether. The event is not yet passed down to the guest. Out-of-range,
like the already existing invalid data event (-1, -1) is passed as special
pointer co-ordinate values to avoid breaking API interfaces if this is
back-ported. A future change, not to be back-ported, will change the API to
get rid of the special values and do this cleanly.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 95.2 KB
Line 
1/** @file
2 * PDM - Pluggable Device Manager, Interfaces.
3 */
4
5/*
6 * Copyright (C) 2006-2019 Oracle Corporation
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 (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef VBOX_INCLUDED_vmm_pdmifs_h
27#define VBOX_INCLUDED_vmm_pdmifs_h
28#ifndef RT_WITHOUT_PRAGMA_ONCE
29# pragma once
30#endif
31
32#include <iprt/sg.h>
33#include <VBox/types.h>
34
35
36RT_C_DECLS_BEGIN
37
38/** @defgroup grp_pdm_interfaces The PDM Interface Definitions
39 * @ingroup grp_pdm
40 *
41 * For historical reasons (the PDMINTERFACE enum) a lot of interface was stuffed
42 * together in this group instead, dragging stuff into global space that didn't
43 * need to be there and making this file huge (>2500 lines). Since we're using
44 * UUIDs as interface identifiers (IIDs) now, no only generic PDM interface will
45 * be added to this file. Component specific interface should be defined in the
46 * header file of that component.
47 *
48 * Interfaces consists of a method table (typedef'ed struct) and an interface
49 * ID. The typename of the method table should have an 'I' in it, be all
50 * capitals and according to the rules, no underscores. The interface ID is a
51 * \#define constructed by appending '_IID' to the typename. The IID value is a
52 * UUID string on the form "a2299c0d-b709-4551-aa5a-73f59ffbed74". If you stick
53 * to these rules, you can make use of the PDMIBASE_QUERY_INTERFACE and
54 * PDMIBASE_RETURN_INTERFACE when querying interface and implementing
55 * PDMIBASE::pfnQueryInterface respectively.
56 *
57 * In most interface descriptions the orientation of the interface is given as
58 * 'down' or 'up'. This refers to a model with the device on the top and the
59 * drivers stacked below it. Sometimes there is mention of 'main' or 'external'
60 * which normally means the same, i.e. the Main or VBoxBFE API. Picture the
61 * orientation of 'main' as horizontal.
62 *
63 * @{
64 */
65
66
67/** @name PDMIBASE
68 * @{
69 */
70
71/**
72 * PDM Base Interface.
73 *
74 * Everyone implements this.
75 */
76typedef struct PDMIBASE
77{
78 /**
79 * Queries an interface to the driver.
80 *
81 * @returns Pointer to interface.
82 * @returns NULL if the interface was not supported by the driver.
83 * @param pInterface Pointer to this interface structure.
84 * @param pszIID The interface ID, a UUID string.
85 * @thread Any thread.
86 */
87 DECLR3CALLBACKMEMBER(void *, pfnQueryInterface,(struct PDMIBASE *pInterface, const char *pszIID));
88} PDMIBASE;
89/** PDMIBASE interface ID. */
90#define PDMIBASE_IID "a2299c0d-b709-4551-aa5a-73f59ffbed74"
91
92/**
93 * Helper macro for querying an interface from PDMIBASE.
94 *
95 * @returns Correctly typed PDMIBASE::pfnQueryInterface return value.
96 *
97 * @param pIBase Pointer to the base interface.
98 * @param InterfaceType The interface type name. The interface ID is
99 * derived from this by appending _IID.
100 */
101#define PDMIBASE_QUERY_INTERFACE(pIBase, InterfaceType) \
102 ( (InterfaceType *)(pIBase)->pfnQueryInterface(pIBase, InterfaceType##_IID ) )
103
104/**
105 * Helper macro for implementing PDMIBASE::pfnQueryInterface.
106 *
107 * Return @a pInterface if @a pszIID matches the @a InterfaceType. This will
108 * perform basic type checking.
109 *
110 * @param pszIID The ID of the interface that is being queried.
111 * @param InterfaceType The interface type name. The interface ID is
112 * derived from this by appending _IID.
113 * @param pInterface The interface address expression.
114 */
115#define PDMIBASE_RETURN_INTERFACE(pszIID, InterfaceType, pInterface) \
116 do { \
117 if (RTUuidCompare2Strs((pszIID), InterfaceType##_IID) == 0) \
118 { \
119 P##InterfaceType pReturnInterfaceTypeCheck = (pInterface); \
120 return pReturnInterfaceTypeCheck; \
121 } \
122 } while (0)
123
124/** @} */
125
126
127/** @name PDMIBASERC
128 * @{
129 */
130
131/**
132 * PDM Base Interface for querying ring-mode context interfaces in
133 * ring-3.
134 *
135 * This is mandatory for drivers present in raw-mode context.
136 */
137typedef struct PDMIBASERC
138{
139 /**
140 * Queries an ring-mode context interface to the driver.
141 *
142 * @returns Pointer to interface.
143 * @returns NULL if the interface was not supported by the driver.
144 * @param pInterface Pointer to this interface structure.
145 * @param pszIID The interface ID, a UUID string.
146 * @thread Any thread.
147 */
148 DECLR3CALLBACKMEMBER(RTRCPTR, pfnQueryInterface,(struct PDMIBASERC *pInterface, const char *pszIID));
149} PDMIBASERC;
150/** Pointer to a PDM Base Interface for query ring-mode context interfaces. */
151typedef PDMIBASERC *PPDMIBASERC;
152/** PDMIBASERC interface ID. */
153#define PDMIBASERC_IID "f6a6c649-6cb3-493f-9737-4653f221aeca"
154
155/**
156 * Helper macro for querying an interface from PDMIBASERC.
157 *
158 * @returns PDMIBASERC::pfnQueryInterface return value.
159 *
160 * @param pIBaseRC Pointer to the base raw-mode context interface. Can
161 * be NULL.
162 * @param InterfaceType The interface type base name, no trailing RC. The
163 * interface ID is derived from this by appending _IID.
164 *
165 * @remarks Unlike PDMIBASE_QUERY_INTERFACE, this macro is not able to do any
166 * implicit type checking for you.
167 */
168#define PDMIBASERC_QUERY_INTERFACE(pIBaseRC, InterfaceType) \
169 ( (P##InterfaceType##RC)((pIBaseRC) ? (pIBaseRC)->pfnQueryInterface(pIBaseRC, InterfaceType##_IID) : NIL_RTRCPTR) )
170
171/**
172 * Helper macro for implementing PDMIBASERC::pfnQueryInterface.
173 *
174 * Return @a pInterface if @a pszIID matches the @a InterfaceType. This will
175 * perform basic type checking.
176 *
177 * @param pIns Pointer to the instance data.
178 * @param pszIID The ID of the interface that is being queried.
179 * @param InterfaceType The interface type base name, no trailing RC. The
180 * interface ID is derived from this by appending _IID.
181 * @param pInterface The interface address expression. This must resolve
182 * to some address within the instance data.
183 * @remarks Don't use with PDMIBASE.
184 */
185#define PDMIBASERC_RETURN_INTERFACE(pIns, pszIID, InterfaceType, pInterface) \
186 do { \
187 Assert((uintptr_t)pInterface - PDMINS_2_DATA(pIns, uintptr_t) < _4M); \
188 if (RTUuidCompare2Strs((pszIID), InterfaceType##_IID) == 0) \
189 { \
190 InterfaceType##RC *pReturnInterfaceTypeCheck = (pInterface); \
191 return (uintptr_t)pReturnInterfaceTypeCheck \
192 - PDMINS_2_DATA(pIns, uintptr_t) \
193 + PDMINS_2_DATA_RCPTR(pIns); \
194 } \
195 } while (0)
196
197/** @} */
198
199
200/** @name PDMIBASER0
201 * @{
202 */
203
204/**
205 * PDM Base Interface for querying ring-0 interfaces in ring-3.
206 *
207 * This is mandatory for drivers present in ring-0 context.
208 */
209typedef struct PDMIBASER0
210{
211 /**
212 * Queries an ring-0 interface to the driver.
213 *
214 * @returns Pointer to interface.
215 * @returns NULL if the interface was not supported by the driver.
216 * @param pInterface Pointer to this interface structure.
217 * @param pszIID The interface ID, a UUID string.
218 * @thread Any thread.
219 */
220 DECLR3CALLBACKMEMBER(RTR0PTR, pfnQueryInterface,(struct PDMIBASER0 *pInterface, const char *pszIID));
221} PDMIBASER0;
222/** Pointer to a PDM Base Interface for query ring-0 context interfaces. */
223typedef PDMIBASER0 *PPDMIBASER0;
224/** PDMIBASER0 interface ID. */
225#define PDMIBASER0_IID "9c9b99b8-7f53-4f59-a3c2-5bc9659c7944"
226
227/**
228 * Helper macro for querying an interface from PDMIBASER0.
229 *
230 * @returns PDMIBASER0::pfnQueryInterface return value.
231 *
232 * @param pIBaseR0 Pointer to the base ring-0 interface. Can be NULL.
233 * @param InterfaceType The interface type base name, no trailing R0. The
234 * interface ID is derived from this by appending _IID.
235 *
236 * @remarks Unlike PDMIBASE_QUERY_INTERFACE, this macro is not able to do any
237 * implicit type checking for you.
238 */
239#define PDMIBASER0_QUERY_INTERFACE(pIBaseR0, InterfaceType) \
240 ( (P##InterfaceType##R0)((pIBaseR0) ? (pIBaseR0)->pfnQueryInterface(pIBaseR0, InterfaceType##_IID) : NIL_RTR0PTR) )
241
242/**
243 * Helper macro for implementing PDMIBASER0::pfnQueryInterface.
244 *
245 * Return @a pInterface if @a pszIID matches the @a InterfaceType. This will
246 * perform basic type checking.
247 *
248 * @param pIns Pointer to the instance data.
249 * @param pszIID The ID of the interface that is being queried.
250 * @param InterfaceType The interface type base name, no trailing R0. The
251 * interface ID is derived from this by appending _IID.
252 * @param pInterface The interface address expression. This must resolve
253 * to some address within the instance data.
254 * @remarks Don't use with PDMIBASE.
255 */
256#define PDMIBASER0_RETURN_INTERFACE(pIns, pszIID, InterfaceType, pInterface) \
257 do { \
258 Assert((uintptr_t)pInterface - PDMINS_2_DATA(pIns, uintptr_t) < _4M); \
259 if (RTUuidCompare2Strs((pszIID), InterfaceType##_IID) == 0) \
260 { \
261 InterfaceType##R0 *pReturnInterfaceTypeCheck = (pInterface); \
262 return (uintptr_t)pReturnInterfaceTypeCheck \
263 - PDMINS_2_DATA(pIns, uintptr_t) \
264 + PDMINS_2_DATA_R0PTR(pIns); \
265 } \
266 } while (0)
267
268/** @} */
269
270
271/**
272 * Dummy interface.
273 *
274 * This is used to typedef other dummy interfaces. The purpose of a dummy
275 * interface is to validate the logical function of a driver/device and
276 * full a natural interface pair.
277 */
278typedef struct PDMIDUMMY
279{
280 RTHCPTR pvDummy;
281} PDMIDUMMY;
282
283
284/** Pointer to a mouse port interface. */
285typedef struct PDMIMOUSEPORT *PPDMIMOUSEPORT;
286/**
287 * Mouse port interface (down).
288 * Pair with PDMIMOUSECONNECTOR.
289 */
290typedef struct PDMIMOUSEPORT
291{
292 /**
293 * Puts a mouse event.
294 *
295 * This is called by the source of mouse events. The event will be passed up
296 * until the topmost driver, which then calls the registered event handler.
297 *
298 * @returns VBox status code. Return VERR_TRY_AGAIN if you cannot process the
299 * event now and want it to be repeated at a later point.
300 *
301 * @param pInterface Pointer to this interface structure.
302 * @param dx The X delta.
303 * @param dy The Y delta.
304 * @param dz The Z delta.
305 * @param dw The W (horizontal scroll button) delta.
306 * @param fButtons The button states, see the PDMIMOUSEPORT_BUTTON_* \#defines.
307 */
308 DECLR3CALLBACKMEMBER(int, pfnPutEvent,(PPDMIMOUSEPORT pInterface,
309 int32_t dx, int32_t dy, int32_t dz,
310 int32_t dw, uint32_t fButtons));
311 /**
312 * Puts an absolute mouse event.
313 *
314 * This is called by the source of mouse events. The event will be passed up
315 * until the topmost driver, which then calls the registered event handler.
316 *
317 * @returns VBox status code. Return VERR_TRY_AGAIN if you cannot process the
318 * event now and want it to be repeated at a later point.
319 *
320 * @param pInterface Pointer to this interface structure.
321 * @param x The X value, in the range 0 to 0xffff.
322 * @param y The Y value, in the range 0 to 0xffff.
323 * @param dz The Z delta.
324 * @param dw The W (horizontal scroll button) delta.
325 * @param fButtons The button states, see the PDMIMOUSEPORT_BUTTON_* \#defines.
326 */
327 DECLR3CALLBACKMEMBER(int, pfnPutEventAbs,(PPDMIMOUSEPORT pInterface,
328 uint32_t x, uint32_t y,
329 int32_t dz, int32_t dw,
330 uint32_t fButtons));
331 /**
332 * Puts a multi-touch event.
333 *
334 * @returns VBox status code. Return VERR_TRY_AGAIN if you cannot process the
335 * event now and want it to be repeated at a later point.
336 *
337 * @param pInterface Pointer to this interface structure.
338 * @param cContacts How many touch contacts in this event.
339 * @param pau64Contacts Pointer to array of packed contact information.
340 * Each 64bit element contains:
341 * Bits 0..15: X coordinate in pixels (signed).
342 * Bits 16..31: Y coordinate in pixels (signed).
343 * Bits 32..39: contact identifier.
344 * Bit 40: "in contact" flag, which indicates that
345 * there is a contact with the touch surface.
346 * Bit 41: "in range" flag, the contact is close enough
347 * to the touch surface.
348 * All other bits are reserved for future use and must be set to 0.
349 * @param u32ScanTime Timestamp of this event in milliseconds. Only relative
350 * time between event is important.
351 */
352 DECLR3CALLBACKMEMBER(int, pfnPutEventMultiTouch,(PPDMIMOUSEPORT pInterface,
353 uint8_t cContacts,
354 const uint64_t *pau64Contacts,
355 uint32_t u32ScanTime));
356} PDMIMOUSEPORT;
357/** PDMIMOUSEPORT interface ID. */
358#define PDMIMOUSEPORT_IID "359364f0-9fa3-4490-a6b4-7ed771901c93"
359
360/** Mouse button defines for PDMIMOUSEPORT::pfnPutEvent.
361 * @{ */
362#define PDMIMOUSEPORT_BUTTON_LEFT RT_BIT(0)
363#define PDMIMOUSEPORT_BUTTON_RIGHT RT_BIT(1)
364#define PDMIMOUSEPORT_BUTTON_MIDDLE RT_BIT(2)
365#define PDMIMOUSEPORT_BUTTON_X1 RT_BIT(3)
366#define PDMIMOUSEPORT_BUTTON_X2 RT_BIT(4)
367/** @} */
368
369
370/** Pointer to a mouse connector interface. */
371typedef struct PDMIMOUSECONNECTOR *PPDMIMOUSECONNECTOR;
372/**
373 * Mouse connector interface (up).
374 * Pair with PDMIMOUSEPORT.
375 */
376typedef struct PDMIMOUSECONNECTOR
377{
378 /**
379 * Notifies the the downstream driver of changes to the reporting modes
380 * supported by the driver
381 *
382 * @param pInterface Pointer to this interface structure.
383 * @param fRelative Whether relative mode is currently supported.
384 * @param fAbsolute Whether absolute mode is currently supported.
385 * @param fMultiTouch Whether multi-touch mode is currently supported.
386 */
387 DECLR3CALLBACKMEMBER(void, pfnReportModes,(PPDMIMOUSECONNECTOR pInterface, bool fRelative, bool fAbsolute, bool fMultiTouch));
388
389 /**
390 * Flushes the mouse queue if it contains pending events.
391 *
392 * @param pInterface Pointer to this interface structure.
393 */
394 DECLR3CALLBACKMEMBER(void, pfnFlushQueue,(PPDMIMOUSECONNECTOR pInterface));
395
396} PDMIMOUSECONNECTOR;
397/** PDMIMOUSECONNECTOR interface ID. */
398#define PDMIMOUSECONNECTOR_IID "ce64d7bd-fa8f-41d1-a6fb-d102a2d6bffe"
399
400
401/** Pointer to a keyboard port interface. */
402typedef struct PDMIKEYBOARDPORT *PPDMIKEYBOARDPORT;
403/**
404 * Keyboard port interface (down).
405 * Pair with PDMIKEYBOARDCONNECTOR.
406 */
407typedef struct PDMIKEYBOARDPORT
408{
409 /**
410 * Puts a scan code based keyboard event.
411 *
412 * This is called by the source of keyboard events. The event will be passed up
413 * until the topmost driver, which then calls the registered event handler.
414 *
415 * @returns VBox status code. Return VERR_TRY_AGAIN if you cannot process the
416 * event now and want it to be repeated at a later point.
417 *
418 * @param pInterface Pointer to this interface structure.
419 * @param u8ScanCode The scan code to queue.
420 */
421 DECLR3CALLBACKMEMBER(int, pfnPutEventScan,(PPDMIKEYBOARDPORT pInterface, uint8_t u8KeyCode));
422
423 /**
424 * Puts a USB HID usage ID based keyboard event.
425 *
426 * This is called by the source of keyboard events. The event will be passed up
427 * until the topmost driver, which then calls the registered event handler.
428 *
429 * @returns VBox status code. Return VERR_TRY_AGAIN if you cannot process the
430 * event now and want it to be repeated at a later point.
431 *
432 * @param pInterface Pointer to this interface structure.
433 * @param u32UsageID The HID usage code event to queue.
434 */
435 DECLR3CALLBACKMEMBER(int, pfnPutEventHid,(PPDMIKEYBOARDPORT pInterface, uint32_t u32UsageID));
436} PDMIKEYBOARDPORT;
437/** PDMIKEYBOARDPORT interface ID. */
438#define PDMIKEYBOARDPORT_IID "2a0844f0-410b-40ab-a6ed-6575f3aa3e29"
439
440
441/**
442 * Keyboard LEDs.
443 */
444typedef enum PDMKEYBLEDS
445{
446 /** No leds. */
447 PDMKEYBLEDS_NONE = 0x0000,
448 /** Num Lock */
449 PDMKEYBLEDS_NUMLOCK = 0x0001,
450 /** Caps Lock */
451 PDMKEYBLEDS_CAPSLOCK = 0x0002,
452 /** Scroll Lock */
453 PDMKEYBLEDS_SCROLLLOCK = 0x0004
454} PDMKEYBLEDS;
455
456/** Pointer to keyboard connector interface. */
457typedef struct PDMIKEYBOARDCONNECTOR *PPDMIKEYBOARDCONNECTOR;
458/**
459 * Keyboard connector interface (up).
460 * Pair with PDMIKEYBOARDPORT
461 */
462typedef struct PDMIKEYBOARDCONNECTOR
463{
464 /**
465 * Notifies the the downstream driver about an LED change initiated by the guest.
466 *
467 * @param pInterface Pointer to this interface structure.
468 * @param enmLeds The new led mask.
469 */
470 DECLR3CALLBACKMEMBER(void, pfnLedStatusChange,(PPDMIKEYBOARDCONNECTOR pInterface, PDMKEYBLEDS enmLeds));
471
472 /**
473 * Notifies the the downstream driver of changes in driver state.
474 *
475 * @param pInterface Pointer to this interface structure.
476 * @param fActive Whether interface wishes to get "focus".
477 */
478 DECLR3CALLBACKMEMBER(void, pfnSetActive,(PPDMIKEYBOARDCONNECTOR pInterface, bool fActive));
479
480 /**
481 * Flushes the keyboard queue if it contains pending events.
482 *
483 * @param pInterface Pointer to this interface structure.
484 */
485 DECLR3CALLBACKMEMBER(void, pfnFlushQueue,(PPDMIKEYBOARDCONNECTOR pInterface));
486
487} PDMIKEYBOARDCONNECTOR;
488/** PDMIKEYBOARDCONNECTOR interface ID. */
489#define PDMIKEYBOARDCONNECTOR_IID "db3f7bd5-953e-436f-9f8e-077905a92d82"
490
491
492
493/** Pointer to a display port interface. */
494typedef struct PDMIDISPLAYPORT *PPDMIDISPLAYPORT;
495/**
496 * Display port interface (down).
497 * Pair with PDMIDISPLAYCONNECTOR.
498 */
499typedef struct PDMIDISPLAYPORT
500{
501 /**
502 * Update the display with any changed regions.
503 *
504 * Flushes any display changes to the memory pointed to by the
505 * PDMIDISPLAYCONNECTOR interface and calles PDMIDISPLAYCONNECTOR::pfnUpdateRect()
506 * while doing so.
507 *
508 * @returns VBox status code.
509 * @param pInterface Pointer to this interface.
510 * @thread The emulation thread.
511 */
512 DECLR3CALLBACKMEMBER(int, pfnUpdateDisplay,(PPDMIDISPLAYPORT pInterface));
513
514 /**
515 * Update the entire display.
516 *
517 * Flushes the entire display content to the memory pointed to by the
518 * PDMIDISPLAYCONNECTOR interface and calles PDMIDISPLAYCONNECTOR::pfnUpdateRect().
519 *
520 * @returns VBox status code.
521 * @param pInterface Pointer to this interface.
522 * @param fFailOnResize Fail is a resize is pending.
523 * @thread The emulation thread.
524 */
525 DECLR3CALLBACKMEMBER(int, pfnUpdateDisplayAll,(PPDMIDISPLAYPORT pInterface, bool fFailOnResize));
526
527 /**
528 * Return the current guest resolution and color depth in bits per pixel (bpp).
529 *
530 * As the graphics card is able to provide display updates with the bpp
531 * requested by the host, this method can be used to query the actual
532 * guest color depth.
533 *
534 * @returns VBox status code.
535 * @param pInterface Pointer to this interface.
536 * @param pcBits Where to store the current guest color depth.
537 * @param pcx Where to store the horizontal resolution.
538 * @param pcy Where to store the vertical resolution.
539 * @thread Any thread.
540 */
541 DECLR3CALLBACKMEMBER(int, pfnQueryVideoMode,(PPDMIDISPLAYPORT pInterface, uint32_t *pcBits, uint32_t *pcx, uint32_t *pcy));
542
543 /**
544 * Sets the refresh rate and restart the timer.
545 * The rate is defined as the minimum interval between the return of
546 * one PDMIDISPLAYPORT::pfnRefresh() call to the next one.
547 *
548 * The interval timer will be restarted by this call. So at VM startup
549 * this function must be called to start the refresh cycle. The refresh
550 * rate is not saved, but have to be when resuming a loaded VM state.
551 *
552 * @returns VBox status code.
553 * @param pInterface Pointer to this interface.
554 * @param cMilliesInterval Number of millis between two refreshes.
555 * @thread Any thread.
556 */
557 DECLR3CALLBACKMEMBER(int, pfnSetRefreshRate,(PPDMIDISPLAYPORT pInterface, uint32_t cMilliesInterval));
558
559 /**
560 * Create a 32-bbp screenshot of the display.
561 *
562 * This will allocate and return a 32-bbp bitmap. Size of the bitmap scanline in bytes is 4*width.
563 *
564 * The allocated bitmap buffer must be freed with pfnFreeScreenshot.
565 *
566 * @param pInterface Pointer to this interface.
567 * @param ppbData Where to store the pointer to the allocated
568 * buffer.
569 * @param pcbData Where to store the actual size of the bitmap.
570 * @param pcx Where to store the width of the bitmap.
571 * @param pcy Where to store the height of the bitmap.
572 * @thread The emulation thread.
573 */
574 DECLR3CALLBACKMEMBER(int, pfnTakeScreenshot,(PPDMIDISPLAYPORT pInterface, uint8_t **ppbData, size_t *pcbData, uint32_t *pcx, uint32_t *pcy));
575
576 /**
577 * Free screenshot buffer.
578 *
579 * This will free the memory buffer allocated by pfnTakeScreenshot.
580 *
581 * @param pInterface Pointer to this interface.
582 * @param pbData Pointer to the buffer returned by
583 * pfnTakeScreenshot.
584 * @thread Any.
585 */
586 DECLR3CALLBACKMEMBER(void, pfnFreeScreenshot,(PPDMIDISPLAYPORT pInterface, uint8_t *pbData));
587
588 /**
589 * Copy bitmap to the display.
590 *
591 * This will convert and copy a 32-bbp bitmap (with dword aligned scanline length) to
592 * the memory pointed to by the PDMIDISPLAYCONNECTOR interface.
593 *
594 * @param pInterface Pointer to this interface.
595 * @param pvData Pointer to the bitmap bits.
596 * @param x The upper left corner x coordinate of the destination rectangle.
597 * @param y The upper left corner y coordinate of the destination rectangle.
598 * @param cx The width of the source and destination rectangles.
599 * @param cy The height of the source and destination rectangles.
600 * @thread The emulation thread.
601 * @remark This is just a convenience for using the bitmap conversions of the
602 * graphics device.
603 */
604 DECLR3CALLBACKMEMBER(int, pfnDisplayBlt,(PPDMIDISPLAYPORT pInterface, const void *pvData, uint32_t x, uint32_t y, uint32_t cx, uint32_t cy));
605
606 /**
607 * Render a rectangle from guest VRAM to Framebuffer.
608 *
609 * @param pInterface Pointer to this interface.
610 * @param x The upper left corner x coordinate of the rectangle to be updated.
611 * @param y The upper left corner y coordinate of the rectangle to be updated.
612 * @param cx The width of the rectangle to be updated.
613 * @param cy The height of the rectangle to be updated.
614 * @thread The emulation thread.
615 */
616 DECLR3CALLBACKMEMBER(void, pfnUpdateDisplayRect,(PPDMIDISPLAYPORT pInterface, int32_t x, int32_t y, uint32_t cx, uint32_t cy));
617
618 /**
619 * Inform the VGA device whether the Display is directly using the guest VRAM and there is no need
620 * to render the VRAM to the framebuffer memory.
621 *
622 * @param pInterface Pointer to this interface.
623 * @param fRender Whether the VRAM content must be rendered to the framebuffer.
624 * @thread The emulation thread.
625 */
626 DECLR3CALLBACKMEMBER(void, pfnSetRenderVRAM,(PPDMIDISPLAYPORT pInterface, bool fRender));
627
628 /**
629 * Render a bitmap rectangle from source to target buffer.
630 *
631 * @param pInterface Pointer to this interface.
632 * @param cx The width of the rectangle to be copied.
633 * @param cy The height of the rectangle to be copied.
634 * @param pbSrc Source frame buffer 0,0.
635 * @param xSrc The upper left corner x coordinate of the source rectangle.
636 * @param ySrc The upper left corner y coordinate of the source rectangle.
637 * @param cxSrc The width of the source frame buffer.
638 * @param cySrc The height of the source frame buffer.
639 * @param cbSrcLine The line length of the source frame buffer.
640 * @param cSrcBitsPerPixel The pixel depth of the source.
641 * @param pbDst Destination frame buffer 0,0.
642 * @param xDst The upper left corner x coordinate of the destination rectangle.
643 * @param yDst The upper left corner y coordinate of the destination rectangle.
644 * @param cxDst The width of the destination frame buffer.
645 * @param cyDst The height of the destination frame buffer.
646 * @param cbDstLine The line length of the destination frame buffer.
647 * @param cDstBitsPerPixel The pixel depth of the destination.
648 * @thread The emulation thread.
649 */
650 DECLR3CALLBACKMEMBER(int, pfnCopyRect,(PPDMIDISPLAYPORT pInterface, uint32_t cx, uint32_t cy,
651 const uint8_t *pbSrc, int32_t xSrc, int32_t ySrc, uint32_t cxSrc, uint32_t cySrc, uint32_t cbSrcLine, uint32_t cSrcBitsPerPixel,
652 uint8_t *pbDst, int32_t xDst, int32_t yDst, uint32_t cxDst, uint32_t cyDst, uint32_t cbDstLine, uint32_t cDstBitsPerPixel));
653
654 /**
655 * Inform the VGA device of viewport changes (as a result of e.g. scrolling).
656 *
657 * @param pInterface Pointer to this interface.
658 * @param idScreen The screen updates are for.
659 * @param x The upper left corner x coordinate of the new viewport rectangle
660 * @param y The upper left corner y coordinate of the new viewport rectangle
661 * @param cx The width of the new viewport rectangle
662 * @param cy The height of the new viewport rectangle
663 * @thread GUI thread?
664 *
665 * @remarks Is allowed to be NULL.
666 */
667 DECLR3CALLBACKMEMBER(void, pfnSetViewport,(PPDMIDISPLAYPORT pInterface,
668 uint32_t idScreen, uint32_t x, uint32_t y, uint32_t cx, uint32_t cy));
669
670 /**
671 * Send a video mode hint to the VGA device.
672 *
673 * @param pInterface Pointer to this interface.
674 * @param cx The X resolution.
675 * @param cy The Y resolution.
676 * @param cBPP The bit count.
677 * @param iDisplay The screen number.
678 * @param dx X offset into the virtual framebuffer or ~0.
679 * @param dy Y offset into the virtual framebuffer or ~0.
680 * @param fEnabled Is this screen currently enabled?
681 * @param fNotifyGuest Should the device send the guest an IRQ?
682 * Set for the last hint of a series.
683 * @thread Schedules on the emulation thread.
684 */
685 DECLR3CALLBACKMEMBER(int, pfnSendModeHint, (PPDMIDISPLAYPORT pInterface, uint32_t cx, uint32_t cy,
686 uint32_t cBPP, uint32_t iDisplay, uint32_t dx,
687 uint32_t dy, uint32_t fEnabled, uint32_t fNotifyGuest));
688
689 /**
690 * Send the guest a notification about host cursor capabilities changes.
691 *
692 * @param pInterface Pointer to this interface.
693 * @param fSupportsRenderCursor Whether the host can draw the guest cursor
694 * using the host one provided the location matches.
695 * @param fSupportsMoveCursor Whether the host can draw the guest cursor
696 * itself at any position. Implies RenderCursor.
697 * @thread Any.
698 */
699 DECLR3CALLBACKMEMBER(void, pfnReportHostCursorCapabilities, (PPDMIDISPLAYPORT pInterface, bool fSupportsRenderCursor, bool fSupportsMoveCursor));
700
701 /**
702 * Tell the graphics device about the host cursor position.
703 *
704 * @param pInterface Pointer to this interface.
705 * @param x X offset into the cursor range.
706 * @param y Y offset into the cursor range.
707 * @param fOutOfRange The host pointer is out of all guest windows, so
708 * X and Y do not currently have meaningful value.
709 * @thread Any.
710 */
711 DECLR3CALLBACKMEMBER(void, pfnReportHostCursorPosition, (PPDMIDISPLAYPORT pInterface, uint32_t x, uint32_t y, bool fOutOfRange));
712} PDMIDISPLAYPORT;
713/** PDMIDISPLAYPORT interface ID. */
714#define PDMIDISPLAYPORT_IID "471b0520-338c-11e9-bb84-6ff2c956da45"
715
716/** @name Flags for PDMIDISPLAYCONNECTOR::pfnVBVAReportCursorPosition.
717 * @{ */
718/** Is the data in the report valid? */
719#define VBVA_CURSOR_VALID_DATA RT_BIT(0)
720/** Is the cursor position reported relative to a particular guest screen? */
721#define VBVA_CURSOR_SCREEN_RELATIVE RT_BIT(1)
722/** @} */
723
724/** Pointer to a 2D graphics acceleration command. */
725typedef struct VBOXVHWACMD VBOXVHWACMD;
726/** Pointer to a VBVA command header. */
727typedef struct VBVACMDHDR *PVBVACMDHDR;
728/** Pointer to a const VBVA command header. */
729typedef const struct VBVACMDHDR *PCVBVACMDHDR;
730/** Pointer to a VBVA screen information. */
731typedef struct VBVAINFOSCREEN *PVBVAINFOSCREEN;
732/** Pointer to a const VBVA screen information. */
733typedef const struct VBVAINFOSCREEN *PCVBVAINFOSCREEN;
734/** Pointer to a VBVA guest VRAM area information. */
735typedef struct VBVAINFOVIEW *PVBVAINFOVIEW;
736/** Pointer to a const VBVA guest VRAM area information. */
737typedef const struct VBVAINFOVIEW *PCVBVAINFOVIEW;
738typedef struct VBVAHOSTFLAGS *PVBVAHOSTFLAGS;
739struct VBOXVDMACMD_CHROMIUM_CMD; /* <- chromium [hgsmi] command */
740struct VBOXVDMACMD_CHROMIUM_CTL; /* <- chromium [hgsmi] command */
741
742
743/** Pointer to a display connector interface. */
744typedef struct PDMIDISPLAYCONNECTOR *PPDMIDISPLAYCONNECTOR;
745struct VBOXCRCMDCTL;
746typedef DECLCALLBACK(void) FNCRCTLCOMPLETION(struct VBOXCRCMDCTL *pCmd, uint32_t cbCmd, int rc, void *pvCompletion);
747typedef FNCRCTLCOMPLETION *PFNCRCTLCOMPLETION;
748
749/**
750 * Display connector interface (up).
751 * Pair with PDMIDISPLAYPORT.
752 */
753typedef struct PDMIDISPLAYCONNECTOR
754{
755 /**
756 * Resize the display.
757 * This is called when the resolution changes. This usually happens on
758 * request from the guest os, but may also happen as the result of a reset.
759 * If the callback returns VINF_VGA_RESIZE_IN_PROGRESS, the caller (VGA device)
760 * must not access the connector and return.
761 *
762 * @returns VINF_SUCCESS if the framebuffer resize was completed,
763 * VINF_VGA_RESIZE_IN_PROGRESS if resize takes time and not yet finished.
764 * @param pInterface Pointer to this interface.
765 * @param cBits Color depth (bits per pixel) of the new video mode.
766 * @param pvVRAM Address of the guest VRAM.
767 * @param cbLine Size in bytes of a single scan line.
768 * @param cx New display width.
769 * @param cy New display height.
770 * @thread The emulation thread.
771 */
772 DECLR3CALLBACKMEMBER(int, pfnResize,(PPDMIDISPLAYCONNECTOR pInterface, uint32_t cBits, void *pvVRAM, uint32_t cbLine,
773 uint32_t cx, uint32_t cy));
774
775 /**
776 * Update a rectangle of the display.
777 * PDMIDISPLAYPORT::pfnUpdateDisplay is the caller.
778 *
779 * @param pInterface Pointer to this interface.
780 * @param x The upper left corner x coordinate of the rectangle.
781 * @param y The upper left corner y coordinate of the rectangle.
782 * @param cx The width of the rectangle.
783 * @param cy The height of the rectangle.
784 * @thread The emulation thread.
785 */
786 DECLR3CALLBACKMEMBER(void, pfnUpdateRect,(PPDMIDISPLAYCONNECTOR pInterface, uint32_t x, uint32_t y, uint32_t cx, uint32_t cy));
787
788 /**
789 * Refresh the display.
790 *
791 * The interval between these calls is set by
792 * PDMIDISPLAYPORT::pfnSetRefreshRate(). The driver should call
793 * PDMIDISPLAYPORT::pfnUpdateDisplay() if it wishes to refresh the
794 * display. PDMIDISPLAYPORT::pfnUpdateDisplay calls pfnUpdateRect with
795 * the changed rectangles.
796 *
797 * @param pInterface Pointer to this interface.
798 * @thread The emulation thread.
799 */
800 DECLR3CALLBACKMEMBER(void, pfnRefresh,(PPDMIDISPLAYCONNECTOR pInterface));
801
802 /**
803 * Reset the display.
804 *
805 * Notification message when the graphics card has been reset.
806 *
807 * @param pInterface Pointer to this interface.
808 * @thread The emulation thread.
809 */
810 DECLR3CALLBACKMEMBER(void, pfnReset,(PPDMIDISPLAYCONNECTOR pInterface));
811
812 /**
813 * LFB video mode enter/exit.
814 *
815 * Notification message when LinearFrameBuffer video mode is enabled/disabled.
816 *
817 * @param pInterface Pointer to this interface.
818 * @param fEnabled false - LFB mode was disabled,
819 * true - an LFB mode was disabled
820 * @thread The emulation thread.
821 */
822 DECLR3CALLBACKMEMBER(void, pfnLFBModeChange,(PPDMIDISPLAYCONNECTOR pInterface, bool fEnabled));
823
824 /**
825 * Process the guest graphics adapter information.
826 *
827 * Direct notification from guest to the display connector.
828 *
829 * @param pInterface Pointer to this interface.
830 * @param pvVRAM Address of the guest VRAM.
831 * @param u32VRAMSize Size of the guest VRAM.
832 * @thread The emulation thread.
833 */
834 DECLR3CALLBACKMEMBER(void, pfnProcessAdapterData,(PPDMIDISPLAYCONNECTOR pInterface, void *pvVRAM, uint32_t u32VRAMSize));
835
836 /**
837 * Process the guest display information.
838 *
839 * Direct notification from guest to the display connector.
840 *
841 * @param pInterface Pointer to this interface.
842 * @param pvVRAM Address of the guest VRAM.
843 * @param uScreenId The index of the guest display to be processed.
844 * @thread The emulation thread.
845 */
846 DECLR3CALLBACKMEMBER(void, pfnProcessDisplayData,(PPDMIDISPLAYCONNECTOR pInterface, void *pvVRAM, unsigned uScreenId));
847
848 /**
849 * Process the guest Video HW Acceleration command.
850 *
851 * @param pInterface Pointer to this interface.
852 * @param enmCmd The command type (don't re-read from pCmd).
853 * @param fGuestCmd Set if the command origins with the guest and
854 * pCmd must be considered volatile.
855 * @param pCmd Video HW Acceleration Command to be processed.
856 * @retval VINF_SUCCESS - command is completed,
857 * @retval VINF_CALLBACK_RETURN if command will by asynchronously completed via
858 * complete callback.
859 * @retval VERR_INVALID_STATE if the command could not be processed (most
860 * likely because the framebuffer was disconnected) - the post should
861 * be retried later.
862 * @thread EMT
863 */
864 DECLR3CALLBACKMEMBER(int, pfnVHWACommandProcess,(PPDMIDISPLAYCONNECTOR pInterface, int enmCmd, bool fGuestCmd,
865 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCmd));
866
867 /**
868 * Process the guest chromium command.
869 *
870 * @param pInterface Pointer to this interface.
871 * @param pCmd Video HW Acceleration Command to be processed.
872 * @thread EMT
873 */
874 DECLR3CALLBACKMEMBER(void, pfnCrHgsmiCommandProcess,(PPDMIDISPLAYCONNECTOR pInterface,
875 struct VBOXVDMACMD_CHROMIUM_CMD RT_UNTRUSTED_VOLATILE_GUEST *pCmd,
876 uint32_t cbCmd));
877
878 /**
879 * Process the guest chromium control command.
880 *
881 * @param pInterface Pointer to this interface.
882 * @param pCmd Video HW Acceleration Command to be processed.
883 * @thread EMT
884 */
885 DECLR3CALLBACKMEMBER(void, pfnCrHgsmiControlProcess,(PPDMIDISPLAYCONNECTOR pInterface,
886 struct VBOXVDMACMD_CHROMIUM_CTL RT_UNTRUSTED_VOLATILE_GUEST *pCtl,
887 uint32_t cbCtl));
888
889 /**
890 * Process the guest chromium control command.
891 *
892 * @param pInterface Pointer to this interface.
893 * @param pCmd Video HW Acceleration Command to be processed.
894 * @param cbCmd Undocumented!
895 * @param pfnCompletion Undocumented!
896 * @param pvCompletion Undocumented!
897 * @thread EMT
898 */
899 DECLR3CALLBACKMEMBER(int, pfnCrHgcmCtlSubmit,(PPDMIDISPLAYCONNECTOR pInterface, struct VBOXCRCMDCTL *pCmd, uint32_t cbCmd,
900 PFNCRCTLCOMPLETION pfnCompletion, void *pvCompletion));
901
902 /**
903 * The specified screen enters VBVA mode.
904 *
905 * @param pInterface Pointer to this interface.
906 * @param uScreenId The screen updates are for.
907 * @param pHostFlags Undocumented!
908 * @param fRenderThreadMode if true - the graphics device has a separate thread that does all rendering.
909 * This means that:
910 * 1. most pfnVBVAXxx callbacks (see the individual documentation for each one)
911 * will be called in the context of the render thread rather than the emulation thread
912 * 2. PDMIDISPLAYCONNECTOR implementor (i.e. DisplayImpl) must NOT notify crogl backend
913 * about vbva-originated events (e.g. resize), because crogl is working in CrCmd mode,
914 * in the context of the render thread as part of the Graphics device, and gets notified about those events directly
915 * @thread if fRenderThreadMode is TRUE - the render thread, otherwise - the emulation thread.
916 */
917 DECLR3CALLBACKMEMBER(int, pfnVBVAEnable,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId,
918 struct VBVAHOSTFLAGS RT_UNTRUSTED_VOLATILE_GUEST *pHostFlags, bool fRenderThreadMode));
919
920 /**
921 * The specified screen leaves VBVA mode.
922 *
923 * @param pInterface Pointer to this interface.
924 * @param uScreenId The screen updates are for.
925 * @thread if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
926 * otherwise - the emulation thread.
927 */
928 DECLR3CALLBACKMEMBER(void, pfnVBVADisable,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId));
929
930 /**
931 * A sequence of pfnVBVAUpdateProcess calls begins.
932 *
933 * @param pInterface Pointer to this interface.
934 * @param uScreenId The screen updates are for.
935 * @thread if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
936 * otherwise - the emulation thread.
937 */
938 DECLR3CALLBACKMEMBER(void, pfnVBVAUpdateBegin,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId));
939
940 /**
941 * Process the guest VBVA command.
942 *
943 * @param pInterface Pointer to this interface.
944 * @param uScreenId The screen updates are for.
945 * @param pCmd Video HW Acceleration Command to be processed.
946 * @param cbCmd Undocumented!
947 * @thread if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
948 * otherwise - the emulation thread.
949 */
950 DECLR3CALLBACKMEMBER(void, pfnVBVAUpdateProcess,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId,
951 struct VBVACMDHDR const RT_UNTRUSTED_VOLATILE_GUEST *pCmd, size_t cbCmd));
952
953 /**
954 * A sequence of pfnVBVAUpdateProcess calls ends.
955 *
956 * @param pInterface Pointer to this interface.
957 * @param uScreenId The screen updates are for.
958 * @param x The upper left corner x coordinate of the combined rectangle of all VBVA updates.
959 * @param y The upper left corner y coordinate of the rectangle.
960 * @param cx The width of the rectangle.
961 * @param cy The height of the rectangle.
962 * @thread if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
963 * otherwise - the emulation thread.
964 */
965 DECLR3CALLBACKMEMBER(void, pfnVBVAUpdateEnd,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, int32_t x, int32_t y,
966 uint32_t cx, uint32_t cy));
967
968 /**
969 * Resize the display.
970 * This is called when the resolution changes. This usually happens on
971 * request from the guest os, but may also happen as the result of a reset.
972 * If the callback returns VINF_VGA_RESIZE_IN_PROGRESS, the caller (VGA device)
973 * must not access the connector and return.
974 *
975 * @todo Merge with pfnResize.
976 *
977 * @returns VINF_SUCCESS if the framebuffer resize was completed,
978 * VINF_VGA_RESIZE_IN_PROGRESS if resize takes time and not yet finished.
979 * @param pInterface Pointer to this interface.
980 * @param pView The description of VRAM block for this screen.
981 * @param pScreen The data of screen being resized.
982 * @param pvVRAM Address of the guest VRAM.
983 * @param fResetInputMapping Whether to reset the absolute pointing device to screen position co-ordinate
984 * mapping. Needed for real resizes, as the caller on the guest may not know how
985 * to set the mapping. Not wanted when we restore a saved state and are resetting
986 * the mode.
987 * @thread if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
988 * otherwise - the emulation thread.
989 */
990 DECLR3CALLBACKMEMBER(int, pfnVBVAResize,(PPDMIDISPLAYCONNECTOR pInterface, PCVBVAINFOVIEW pView, PCVBVAINFOSCREEN pScreen,
991 void *pvVRAM, bool fResetInputMapping));
992
993 /**
994 * Update the pointer shape.
995 * This is called when the mouse pointer shape changes. The new shape
996 * is passed as a caller allocated buffer that will be freed after returning
997 *
998 * @param pInterface Pointer to this interface.
999 * @param fVisible Visibility indicator (if false, the other parameters are undefined).
1000 * @param fAlpha Flag whether alpha channel is being passed.
1001 * @param xHot Pointer hot spot x coordinate.
1002 * @param yHot Pointer hot spot y coordinate.
1003 * @param cx Pointer width in pixels.
1004 * @param cy Pointer height in pixels.
1005 * @param pvShape New shape buffer.
1006 * @thread The emulation thread.
1007 */
1008 DECLR3CALLBACKMEMBER(int, pfnVBVAMousePointerShape,(PPDMIDISPLAYCONNECTOR pInterface, bool fVisible, bool fAlpha,
1009 uint32_t xHot, uint32_t yHot, uint32_t cx, uint32_t cy,
1010 const void *pvShape));
1011
1012 /**
1013 * The guest capabilities were updated.
1014 *
1015 * @param pInterface Pointer to this interface.
1016 * @param fCapabilities The new capability flag state.
1017 * @thread The emulation thread.
1018 */
1019 DECLR3CALLBACKMEMBER(void, pfnVBVAGuestCapabilityUpdate,(PPDMIDISPLAYCONNECTOR pInterface, uint32_t fCapabilities));
1020
1021 /** Read-only attributes.
1022 * For preformance reasons some readonly attributes are kept in the interface.
1023 * We trust the interface users to respect the readonlyness of these.
1024 * @{
1025 */
1026 /** Pointer to the display data buffer. */
1027 uint8_t *pbData;
1028 /** Size of a scanline in the data buffer. */
1029 uint32_t cbScanline;
1030 /** The color depth (in bits) the graphics card is supposed to provide. */
1031 uint32_t cBits;
1032 /** The display width. */
1033 uint32_t cx;
1034 /** The display height. */
1035 uint32_t cy;
1036 /** @} */
1037
1038 /**
1039 * The guest display input mapping rectangle was updated.
1040 *
1041 * @param pInterface Pointer to this interface.
1042 * @param xOrigin Upper left X co-ordinate relative to the first screen.
1043 * @param yOrigin Upper left Y co-ordinate relative to the first screen.
1044 * @param cx Rectangle width.
1045 * @param cy Rectangle height.
1046 * @thread The emulation thread.
1047 */
1048 DECLR3CALLBACKMEMBER(void, pfnVBVAInputMappingUpdate,(PPDMIDISPLAYCONNECTOR pInterface, int32_t xOrigin, int32_t yOrigin, uint32_t cx, uint32_t cy));
1049
1050 /**
1051 * The guest is reporting the requested location of the host pointer.
1052 *
1053 * @param pInterface Pointer to this interface.
1054 * @param fFlags VBVA_CURSOR_*
1055 * @param uScreenId The screen to which X and Y are relative if VBVA_CURSOR_SCREEN_RELATIVE is set.
1056 * @param x Cursor X offset.
1057 * @param y Cursor Y offset.
1058 * @thread The emulation thread.
1059 */
1060 DECLR3CALLBACKMEMBER(void, pfnVBVAReportCursorPosition,(PPDMIDISPLAYCONNECTOR pInterface, uint32_t fFlags, uint32_t uScreen, uint32_t x, uint32_t y));
1061} PDMIDISPLAYCONNECTOR;
1062/** PDMIDISPLAYCONNECTOR interface ID. */
1063#define PDMIDISPLAYCONNECTOR_IID "f2a4c9fc-2613-11e9-bc48-bf934e641fc0"
1064
1065
1066/** Pointer to a secret key interface. */
1067typedef struct PDMISECKEY *PPDMISECKEY;
1068
1069/**
1070 * Secret key interface to retrieve secret keys.
1071 */
1072typedef struct PDMISECKEY
1073{
1074 /**
1075 * Retains a key identified by the ID. The caller will only hold a reference
1076 * to the key and must not modify the key buffer in any way.
1077 *
1078 * @returns VBox status code.
1079 * @param pInterface Pointer to this interface.
1080 * @param pszId The alias/id for the key to retrieve.
1081 * @param ppbKey Where to store the pointer to the key buffer on success.
1082 * @param pcbKey Where to store the size of the key in bytes on success.
1083 */
1084 DECLR3CALLBACKMEMBER(int, pfnKeyRetain, (PPDMISECKEY pInterface, const char *pszId,
1085 const uint8_t **pbKey, size_t *pcbKey));
1086
1087 /**
1088 * Releases one reference of the key identified by the given identifier.
1089 * The caller must not access the key buffer after calling this operation.
1090 *
1091 * @returns VBox status code.
1092 * @param pInterface Pointer to this interface.
1093 * @param pszId The alias/id for the key to release.
1094 *
1095 * @note: It is advised to release the key whenever it is not used anymore so the entity
1096 * storing the key can do anything to make retrieving the key from memory more
1097 * difficult like scrambling the memory buffer for instance.
1098 */
1099 DECLR3CALLBACKMEMBER(int, pfnKeyRelease, (PPDMISECKEY pInterface, const char *pszId));
1100
1101 /**
1102 * Retains a password identified by the ID. The caller will only hold a reference
1103 * to the password and must not modify the buffer in any way.
1104 *
1105 * @returns VBox status code.
1106 * @param pInterface Pointer to this interface.
1107 * @param pszId The alias/id for the password to retrieve.
1108 * @param ppszPassword Where to store the pointer to the password on success.
1109 */
1110 DECLR3CALLBACKMEMBER(int, pfnPasswordRetain, (PPDMISECKEY pInterface, const char *pszId,
1111 const char **ppszPassword));
1112
1113 /**
1114 * Releases one reference of the password identified by the given identifier.
1115 * The caller must not access the password after calling this operation.
1116 *
1117 * @returns VBox status code.
1118 * @param pInterface Pointer to this interface.
1119 * @param pszId The alias/id for the password to release.
1120 *
1121 * @note: It is advised to release the password whenever it is not used anymore so the entity
1122 * storing the password can do anything to make retrieving the password from memory more
1123 * difficult like scrambling the memory buffer for instance.
1124 */
1125 DECLR3CALLBACKMEMBER(int, pfnPasswordRelease, (PPDMISECKEY pInterface, const char *pszId));
1126} PDMISECKEY;
1127/** PDMISECKEY interface ID. */
1128#define PDMISECKEY_IID "3d698355-d995-453d-960f-31566a891df2"
1129
1130/** Pointer to a secret key helper interface. */
1131typedef struct PDMISECKEYHLP *PPDMISECKEYHLP;
1132
1133/**
1134 * Secret key helper interface for non critical functionality.
1135 */
1136typedef struct PDMISECKEYHLP
1137{
1138 /**
1139 * Notifies the interface provider that a key couldn't be retrieved from the key store.
1140 *
1141 * @returns VBox status code.
1142 * @param pInterface Pointer to this interface.
1143 */
1144 DECLR3CALLBACKMEMBER(int, pfnKeyMissingNotify, (PPDMISECKEYHLP pInterface));
1145
1146} PDMISECKEYHLP;
1147/** PDMISECKEY interface ID. */
1148#define PDMISECKEYHLP_IID "7be96168-4156-40ac-86d2-3073bf8b318e"
1149
1150
1151/** Pointer to a stream interface. */
1152typedef struct PDMISTREAM *PPDMISTREAM;
1153/**
1154 * Stream interface (up).
1155 * Makes up the foundation for PDMICHARCONNECTOR. No pair interface.
1156 */
1157typedef struct PDMISTREAM
1158{
1159 /**
1160 * Polls for the specified events.
1161 *
1162 * @returns VBox status code.
1163 * @retval VERR_INTERRUPTED if the poll was interrupted.
1164 * @retval VERR_TIMEOUT if the maximum waiting time was reached.
1165 * @param pInterface Pointer to the interface structure containing the called function pointer.
1166 * @param fEvts The events to poll for, see RTPOLL_EVT_XXX.
1167 * @param *pfEvts Where to return details about the events that occurred.
1168 * @param cMillies Number of milliseconds to wait. Use
1169 * RT_INDEFINITE_WAIT to wait for ever.
1170 */
1171 DECLR3CALLBACKMEMBER(int, pfnPoll,(PPDMISTREAM pInterface, uint32_t fEvts, uint32_t *pfEvts, RTMSINTERVAL cMillies));
1172
1173 /**
1174 * Interrupts the current poll call.
1175 *
1176 * @returns VBox status code.
1177 * @param pInterface Pointer to the interface structure containing the called function pointer.
1178 */
1179 DECLR3CALLBACKMEMBER(int, pfnPollInterrupt,(PPDMISTREAM pInterface));
1180
1181 /**
1182 * Read bits.
1183 *
1184 * @returns VBox status code.
1185 * @param pInterface Pointer to the interface structure containing the called function pointer.
1186 * @param pvBuf Where to store the read bits.
1187 * @param pcbRead Number of bytes to read/bytes actually read.
1188 * @thread Any thread.
1189 *
1190 * @note: This is non blocking, use the poll callback to block when there is nothing to read.
1191 */
1192 DECLR3CALLBACKMEMBER(int, pfnRead,(PPDMISTREAM pInterface, void *pvBuf, size_t *pcbRead));
1193
1194 /**
1195 * Write bits.
1196 *
1197 * @returns VBox status code.
1198 * @param pInterface Pointer to the interface structure containing the called function pointer.
1199 * @param pvBuf Where to store the write bits.
1200 * @param pcbWrite Number of bytes to write/bytes actually written.
1201 * @thread Any thread.
1202 *
1203 * @note: This is non blocking, use the poll callback to block until there is room to write.
1204 */
1205 DECLR3CALLBACKMEMBER(int, pfnWrite,(PPDMISTREAM pInterface, const void *pvBuf, size_t *pcbWrite));
1206} PDMISTREAM;
1207/** PDMISTREAM interface ID. */
1208#define PDMISTREAM_IID "f9bd1ba6-c134-44cc-8259-febe14393952"
1209
1210
1211/** Mode of the parallel port */
1212typedef enum PDMPARALLELPORTMODE
1213{
1214 /** First invalid mode. */
1215 PDM_PARALLEL_PORT_MODE_INVALID = 0,
1216 /** SPP (Compatibility mode). */
1217 PDM_PARALLEL_PORT_MODE_SPP,
1218 /** EPP Data mode. */
1219 PDM_PARALLEL_PORT_MODE_EPP_DATA,
1220 /** EPP Address mode. */
1221 PDM_PARALLEL_PORT_MODE_EPP_ADDR,
1222 /** ECP mode (not implemented yet). */
1223 PDM_PARALLEL_PORT_MODE_ECP,
1224 /** 32bit hack. */
1225 PDM_PARALLEL_PORT_MODE_32BIT_HACK = 0x7fffffff
1226} PDMPARALLELPORTMODE;
1227
1228/** Pointer to a host parallel port interface. */
1229typedef struct PDMIHOSTPARALLELPORT *PPDMIHOSTPARALLELPORT;
1230/**
1231 * Host parallel port interface (down).
1232 * Pair with PDMIHOSTPARALLELCONNECTOR.
1233 */
1234typedef struct PDMIHOSTPARALLELPORT
1235{
1236 /**
1237 * Notify device/driver that an interrupt has occurred.
1238 *
1239 * @returns VBox status code.
1240 * @param pInterface Pointer to the interface structure containing the called function pointer.
1241 * @thread Any thread.
1242 */
1243 DECLR3CALLBACKMEMBER(int, pfnNotifyInterrupt,(PPDMIHOSTPARALLELPORT pInterface));
1244} PDMIHOSTPARALLELPORT;
1245/** PDMIHOSTPARALLELPORT interface ID. */
1246#define PDMIHOSTPARALLELPORT_IID "f24b8668-e7f6-4eaa-a14c-4aa2a5f7048e"
1247
1248
1249
1250/** Pointer to a Host Parallel connector interface. */
1251typedef struct PDMIHOSTPARALLELCONNECTOR *PPDMIHOSTPARALLELCONNECTOR;
1252/**
1253 * Host parallel connector interface (up).
1254 * Pair with PDMIHOSTPARALLELPORT.
1255 */
1256typedef struct PDMIHOSTPARALLELCONNECTOR
1257{
1258 /**
1259 * Write bits.
1260 *
1261 * @returns VBox status code.
1262 * @param pInterface Pointer to the interface structure containing the called function pointer.
1263 * @param pvBuf Where to store the write bits.
1264 * @param cbWrite Number of bytes to write.
1265 * @param enmMode Mode to write the data.
1266 * @thread Any thread.
1267 * @todo r=klaus cbWrite only defines buffer length, method needs a way top return actually written amount of data.
1268 */
1269 DECLR3CALLBACKMEMBER(int, pfnWrite,(PPDMIHOSTPARALLELCONNECTOR pInterface, const void *pvBuf,
1270 size_t cbWrite, PDMPARALLELPORTMODE enmMode));
1271
1272 /**
1273 * Read bits.
1274 *
1275 * @returns VBox status code.
1276 * @param pInterface Pointer to the interface structure containing the called function pointer.
1277 * @param pvBuf Where to store the read bits.
1278 * @param cbRead Number of bytes to read.
1279 * @param enmMode Mode to read the data.
1280 * @thread Any thread.
1281 * @todo r=klaus cbRead only defines buffer length, method needs a way top return actually read amount of data.
1282 */
1283 DECLR3CALLBACKMEMBER(int, pfnRead,(PPDMIHOSTPARALLELCONNECTOR pInterface, void *pvBuf,
1284 size_t cbRead, PDMPARALLELPORTMODE enmMode));
1285
1286 /**
1287 * Set data direction of the port (forward/reverse).
1288 *
1289 * @returns VBox status code.
1290 * @param pInterface Pointer to the interface structure containing the called function pointer.
1291 * @param fForward Flag whether to indicate whether the port is operated in forward or reverse mode.
1292 * @thread Any thread.
1293 */
1294 DECLR3CALLBACKMEMBER(int, pfnSetPortDirection,(PPDMIHOSTPARALLELCONNECTOR pInterface, bool fForward));
1295
1296 /**
1297 * Write control register bits.
1298 *
1299 * @returns VBox status code.
1300 * @param pInterface Pointer to the interface structure containing the called function pointer.
1301 * @param fReg The new control register value.
1302 * @thread Any thread.
1303 */
1304 DECLR3CALLBACKMEMBER(int, pfnWriteControl,(PPDMIHOSTPARALLELCONNECTOR pInterface, uint8_t fReg));
1305
1306 /**
1307 * Read control register bits.
1308 *
1309 * @returns VBox status code.
1310 * @param pInterface Pointer to the interface structure containing the called function pointer.
1311 * @param pfReg Where to store the control register bits.
1312 * @thread Any thread.
1313 */
1314 DECLR3CALLBACKMEMBER(int, pfnReadControl,(PPDMIHOSTPARALLELCONNECTOR pInterface, uint8_t *pfReg));
1315
1316 /**
1317 * Read status register bits.
1318 *
1319 * @returns VBox status code.
1320 * @param pInterface Pointer to the interface structure containing the called function pointer.
1321 * @param pfReg Where to store the status register bits.
1322 * @thread Any thread.
1323 */
1324 DECLR3CALLBACKMEMBER(int, pfnReadStatus,(PPDMIHOSTPARALLELCONNECTOR pInterface, uint8_t *pfReg));
1325
1326} PDMIHOSTPARALLELCONNECTOR;
1327/** PDMIHOSTPARALLELCONNECTOR interface ID. */
1328#define PDMIHOSTPARALLELCONNECTOR_IID "7c532602-7438-4fbc-9265-349d9f0415f9"
1329
1330
1331/** ACPI power source identifier */
1332typedef enum PDMACPIPOWERSOURCE
1333{
1334 PDM_ACPI_POWER_SOURCE_UNKNOWN = 0,
1335 PDM_ACPI_POWER_SOURCE_OUTLET,
1336 PDM_ACPI_POWER_SOURCE_BATTERY
1337} PDMACPIPOWERSOURCE;
1338/** Pointer to ACPI battery state. */
1339typedef PDMACPIPOWERSOURCE *PPDMACPIPOWERSOURCE;
1340
1341/** ACPI battey capacity */
1342typedef enum PDMACPIBATCAPACITY
1343{
1344 PDM_ACPI_BAT_CAPACITY_MIN = 0,
1345 PDM_ACPI_BAT_CAPACITY_MAX = 100,
1346 PDM_ACPI_BAT_CAPACITY_UNKNOWN = 255
1347} PDMACPIBATCAPACITY;
1348/** Pointer to ACPI battery capacity. */
1349typedef PDMACPIBATCAPACITY *PPDMACPIBATCAPACITY;
1350
1351/** ACPI battery state. See ACPI 3.0 spec '_BST (Battery Status)' */
1352typedef enum PDMACPIBATSTATE
1353{
1354 PDM_ACPI_BAT_STATE_CHARGED = 0x00,
1355 PDM_ACPI_BAT_STATE_DISCHARGING = 0x01,
1356 PDM_ACPI_BAT_STATE_CHARGING = 0x02,
1357 PDM_ACPI_BAT_STATE_CRITICAL = 0x04
1358} PDMACPIBATSTATE;
1359/** Pointer to ACPI battery state. */
1360typedef PDMACPIBATSTATE *PPDMACPIBATSTATE;
1361
1362/** Pointer to an ACPI port interface. */
1363typedef struct PDMIACPIPORT *PPDMIACPIPORT;
1364/**
1365 * ACPI port interface (down). Used by both the ACPI driver and (grumble) main.
1366 * Pair with PDMIACPICONNECTOR.
1367 */
1368typedef struct PDMIACPIPORT
1369{
1370 /**
1371 * Send an ACPI power off event.
1372 *
1373 * @returns VBox status code
1374 * @param pInterface Pointer to the interface structure containing the called function pointer.
1375 */
1376 DECLR3CALLBACKMEMBER(int, pfnPowerButtonPress,(PPDMIACPIPORT pInterface));
1377
1378 /**
1379 * Send an ACPI sleep button event.
1380 *
1381 * @returns VBox status code
1382 * @param pInterface Pointer to the interface structure containing the called function pointer.
1383 */
1384 DECLR3CALLBACKMEMBER(int, pfnSleepButtonPress,(PPDMIACPIPORT pInterface));
1385
1386 /**
1387 * Check if the last power button event was handled by the guest.
1388 *
1389 * @returns VBox status code
1390 * @param pInterface Pointer to the interface structure containing the called function pointer.
1391 * @param pfHandled Is set to true if the last power button event was handled, false otherwise.
1392 */
1393 DECLR3CALLBACKMEMBER(int, pfnGetPowerButtonHandled,(PPDMIACPIPORT pInterface, bool *pfHandled));
1394
1395 /**
1396 * Check if the guest entered the ACPI mode.
1397 *
1398 * @returns VBox status code
1399 * @param pInterface Pointer to the interface structure containing the called function pointer.
1400 * @param pfEntered Is set to true if the guest entered the ACPI mode, false otherwise.
1401 */
1402 DECLR3CALLBACKMEMBER(int, pfnGetGuestEnteredACPIMode,(PPDMIACPIPORT pInterface, bool *pfEntered));
1403
1404 /**
1405 * Check if the given CPU is still locked by the guest.
1406 *
1407 * @returns VBox status code
1408 * @param pInterface Pointer to the interface structure containing the called function pointer.
1409 * @param uCpu The CPU to check for.
1410 * @param pfLocked Is set to true if the CPU is still locked by the guest, false otherwise.
1411 */
1412 DECLR3CALLBACKMEMBER(int, pfnGetCpuStatus,(PPDMIACPIPORT pInterface, unsigned uCpu, bool *pfLocked));
1413
1414 /**
1415 * Send an ACPI monitor hot-plug event.
1416 *
1417 * @returns VBox status code
1418 * @param pInterface Pointer to the interface structure containing
1419 * the called function pointer.
1420 */
1421 DECLR3CALLBACKMEMBER(int, pfnMonitorHotPlugEvent,(PPDMIACPIPORT pInterface));
1422
1423 /**
1424 * Send a battery status change event.
1425 *
1426 * @returns VBox status code
1427 * @param pInterface Pointer to the interface structure containing
1428 * the called function pointer.
1429 */
1430 DECLR3CALLBACKMEMBER(int, pfnBatteryStatusChangeEvent,(PPDMIACPIPORT pInterface));
1431} PDMIACPIPORT;
1432/** PDMIACPIPORT interface ID. */
1433#define PDMIACPIPORT_IID "974cb8fb-7fda-408c-f9b4-7ff4e3b2a699"
1434
1435
1436/** Pointer to an ACPI connector interface. */
1437typedef struct PDMIACPICONNECTOR *PPDMIACPICONNECTOR;
1438/**
1439 * ACPI connector interface (up).
1440 * Pair with PDMIACPIPORT.
1441 */
1442typedef struct PDMIACPICONNECTOR
1443{
1444 /**
1445 * Get the current power source of the host system.
1446 *
1447 * @returns VBox status code
1448 * @param pInterface Pointer to the interface structure containing the called function pointer.
1449 * @param penmPowerSource Pointer to the power source result variable.
1450 */
1451 DECLR3CALLBACKMEMBER(int, pfnQueryPowerSource,(PPDMIACPICONNECTOR, PPDMACPIPOWERSOURCE penmPowerSource));
1452
1453 /**
1454 * Query the current battery status of the host system.
1455 *
1456 * @returns VBox status code?
1457 * @param pInterface Pointer to the interface structure containing the called function pointer.
1458 * @param pfPresent Is set to true if battery is present, false otherwise.
1459 * @param penmRemainingCapacity Pointer to the battery remaining capacity (0 - 100 or 255 for unknown).
1460 * @param penmBatteryState Pointer to the battery status.
1461 * @param pu32PresentRate Pointer to the present rate (0..1000 of the total capacity).
1462 */
1463 DECLR3CALLBACKMEMBER(int, pfnQueryBatteryStatus,(PPDMIACPICONNECTOR, bool *pfPresent, PPDMACPIBATCAPACITY penmRemainingCapacity,
1464 PPDMACPIBATSTATE penmBatteryState, uint32_t *pu32PresentRate));
1465} PDMIACPICONNECTOR;
1466/** PDMIACPICONNECTOR interface ID. */
1467#define PDMIACPICONNECTOR_IID "5f14bf8d-1edf-4e3a-a1e1-cca9fd08e359"
1468
1469struct VMMDevDisplayDef;
1470
1471/** Pointer to a VMMDevice port interface. */
1472typedef struct PDMIVMMDEVPORT *PPDMIVMMDEVPORT;
1473/**
1474 * VMMDevice port interface (down).
1475 * Pair with PDMIVMMDEVCONNECTOR.
1476 */
1477typedef struct PDMIVMMDEVPORT
1478{
1479 /**
1480 * Return the current absolute mouse position in pixels
1481 *
1482 * @returns VBox status code
1483 * @param pInterface Pointer to the interface structure containing the called function pointer.
1484 * @param pxAbs Pointer of result value, can be NULL
1485 * @param pyAbs Pointer of result value, can be NULL
1486 */
1487 DECLR3CALLBACKMEMBER(int, pfnQueryAbsoluteMouse,(PPDMIVMMDEVPORT pInterface, int32_t *pxAbs, int32_t *pyAbs));
1488
1489 /**
1490 * Set the new absolute mouse position in pixels
1491 *
1492 * @returns VBox status code
1493 * @param pInterface Pointer to the interface structure containing the called function pointer.
1494 * @param xAbs New absolute X position
1495 * @param yAbs New absolute Y position
1496 */
1497 DECLR3CALLBACKMEMBER(int, pfnSetAbsoluteMouse,(PPDMIVMMDEVPORT pInterface, int32_t xAbs, int32_t yAbs));
1498
1499 /**
1500 * Return the current mouse capability flags
1501 *
1502 * @returns VBox status code
1503 * @param pInterface Pointer to the interface structure containing the called function pointer.
1504 * @param pfCapabilities Pointer of result value
1505 */
1506 DECLR3CALLBACKMEMBER(int, pfnQueryMouseCapabilities,(PPDMIVMMDEVPORT pInterface, uint32_t *pfCapabilities));
1507
1508 /**
1509 * Set the current mouse capability flag (host side)
1510 *
1511 * @returns VBox status code
1512 * @param pInterface Pointer to the interface structure containing the called function pointer.
1513 * @param fCapsAdded Mask of capabilities to add to the flag
1514 * @param fCapsRemoved Mask of capabilities to remove from the flag
1515 */
1516 DECLR3CALLBACKMEMBER(int, pfnUpdateMouseCapabilities,(PPDMIVMMDEVPORT pInterface, uint32_t fCapsAdded, uint32_t fCapsRemoved));
1517
1518 /**
1519 * Issue a display resolution change request.
1520 *
1521 * Note that there can only one request in the queue and that in case the guest does
1522 * not process it, issuing another request will overwrite the previous.
1523 *
1524 * @returns VBox status code
1525 * @param pInterface Pointer to the interface structure containing the called function pointer.
1526 * @param cDisplays Number of displays. Can be either 1 or the number of VM virtual monitors.
1527 * @param paDisplays Definitions of guest screens to be applied. See VMMDev.h
1528 * @param fForce Whether to deliver the request to the guest even if the guest has
1529 * the requested resolution already.
1530 */
1531 DECLR3CALLBACKMEMBER(int, pfnRequestDisplayChange,(PPDMIVMMDEVPORT pInterface, uint32_t cDisplays,
1532 struct VMMDevDisplayDef const *paDisplays, bool fForce));
1533
1534 /**
1535 * Pass credentials to guest.
1536 *
1537 * Note that there can only be one set of credentials and the guest may or may not
1538 * query them and may do whatever it wants with them.
1539 *
1540 * @returns VBox status code.
1541 * @param pInterface Pointer to the interface structure containing the called function pointer.
1542 * @param pszUsername User name, may be empty (UTF-8).
1543 * @param pszPassword Password, may be empty (UTF-8).
1544 * @param pszDomain Domain name, may be empty (UTF-8).
1545 * @param fFlags VMMDEV_SETCREDENTIALS_*.
1546 */
1547 DECLR3CALLBACKMEMBER(int, pfnSetCredentials,(PPDMIVMMDEVPORT pInterface, const char *pszUsername,
1548 const char *pszPassword, const char *pszDomain,
1549 uint32_t fFlags));
1550
1551 /**
1552 * Notify the driver about a VBVA status change.
1553 *
1554 * @returns Nothing. Because it is informational callback.
1555 * @param pInterface Pointer to the interface structure containing the called function pointer.
1556 * @param fEnabled Current VBVA status.
1557 */
1558 DECLR3CALLBACKMEMBER(void, pfnVBVAChange, (PPDMIVMMDEVPORT pInterface, bool fEnabled));
1559
1560 /**
1561 * Issue a seamless mode change request.
1562 *
1563 * Note that there can only one request in the queue and that in case the guest does
1564 * not process it, issuing another request will overwrite the previous.
1565 *
1566 * @returns VBox status code
1567 * @param pInterface Pointer to the interface structure containing the called function pointer.
1568 * @param fEnabled Seamless mode enabled or not
1569 */
1570 DECLR3CALLBACKMEMBER(int, pfnRequestSeamlessChange,(PPDMIVMMDEVPORT pInterface, bool fEnabled));
1571
1572 /**
1573 * Issue a memory balloon change request.
1574 *
1575 * Note that there can only one request in the queue and that in case the guest does
1576 * not process it, issuing another request will overwrite the previous.
1577 *
1578 * @returns VBox status code
1579 * @param pInterface Pointer to the interface structure containing the called function pointer.
1580 * @param cMbBalloon Balloon size in megabytes
1581 */
1582 DECLR3CALLBACKMEMBER(int, pfnSetMemoryBalloon,(PPDMIVMMDEVPORT pInterface, uint32_t cMbBalloon));
1583
1584 /**
1585 * Issue a statistcs interval change request.
1586 *
1587 * Note that there can only one request in the queue and that in case the guest does
1588 * not process it, issuing another request will overwrite the previous.
1589 *
1590 * @returns VBox status code
1591 * @param pInterface Pointer to the interface structure containing the called function pointer.
1592 * @param cSecsStatInterval Statistics query interval in seconds
1593 * (0=disable).
1594 */
1595 DECLR3CALLBACKMEMBER(int, pfnSetStatisticsInterval,(PPDMIVMMDEVPORT pInterface, uint32_t cSecsStatInterval));
1596
1597 /**
1598 * Notify the guest about a VRDP status change.
1599 *
1600 * @returns VBox status code
1601 * @param pInterface Pointer to the interface structure containing the called function pointer.
1602 * @param fVRDPEnabled Current VRDP status.
1603 * @param uVRDPExperienceLevel Which visual effects to be disabled in
1604 * the guest.
1605 */
1606 DECLR3CALLBACKMEMBER(int, pfnVRDPChange, (PPDMIVMMDEVPORT pInterface, bool fVRDPEnabled, uint32_t uVRDPExperienceLevel));
1607
1608 /**
1609 * Notify the guest of CPU hot-unplug event.
1610 *
1611 * @returns VBox status code
1612 * @param pInterface Pointer to the interface structure containing the called function pointer.
1613 * @param idCpuCore The core id of the CPU to remove.
1614 * @param idCpuPackage The package id of the CPU to remove.
1615 */
1616 DECLR3CALLBACKMEMBER(int, pfnCpuHotUnplug, (PPDMIVMMDEVPORT pInterface, uint32_t idCpuCore, uint32_t idCpuPackage));
1617
1618 /**
1619 * Notify the guest of CPU hot-plug event.
1620 *
1621 * @returns VBox status code
1622 * @param pInterface Pointer to the interface structure containing the called function pointer.
1623 * @param idCpuCore The core id of the CPU to add.
1624 * @param idCpuPackage The package id of the CPU to add.
1625 */
1626 DECLR3CALLBACKMEMBER(int, pfnCpuHotPlug, (PPDMIVMMDEVPORT pInterface, uint32_t idCpuCore, uint32_t idCpuPackage));
1627
1628} PDMIVMMDEVPORT;
1629/** PDMIVMMDEVPORT interface ID. */
1630#define PDMIVMMDEVPORT_IID "2ccc19a5-742a-4af0-a7d3-31ea67ff50e9"
1631
1632
1633/** Pointer to a HPET legacy notification interface. */
1634typedef struct PDMIHPETLEGACYNOTIFY *PPDMIHPETLEGACYNOTIFY;
1635/**
1636 * HPET legacy notification interface.
1637 */
1638typedef struct PDMIHPETLEGACYNOTIFY
1639{
1640 /**
1641 * Notify about change of HPET legacy mode.
1642 *
1643 * @param pInterface Pointer to the interface structure containing the
1644 * called function pointer.
1645 * @param fActivated If HPET legacy mode is activated (@c true) or
1646 * deactivated (@c false).
1647 */
1648 DECLR3CALLBACKMEMBER(void, pfnModeChanged,(PPDMIHPETLEGACYNOTIFY pInterface, bool fActivated));
1649} PDMIHPETLEGACYNOTIFY;
1650/** PDMIHPETLEGACYNOTIFY interface ID. */
1651#define PDMIHPETLEGACYNOTIFY_IID "c9ada595-4b65-4311-8b21-b10498997774"
1652
1653
1654/** @name Flags for PDMIVMMDEVPORT::pfnSetCredentials.
1655 * @{ */
1656/** The guest should perform a logon with the credentials. */
1657#define VMMDEV_SETCREDENTIALS_GUESTLOGON RT_BIT(0)
1658/** The guest should prevent local logons. */
1659#define VMMDEV_SETCREDENTIALS_NOLOCALLOGON RT_BIT(1)
1660/** The guest should verify the credentials. */
1661#define VMMDEV_SETCREDENTIALS_JUDGE RT_BIT(15)
1662/** @} */
1663
1664/** Forward declaration of the guest information structure. */
1665struct VBoxGuestInfo;
1666/** Forward declaration of the guest information-2 structure. */
1667struct VBoxGuestInfo2;
1668/** Forward declaration of the guest statistics structure */
1669struct VBoxGuestStatistics;
1670/** Forward declaration of the guest status structure */
1671struct VBoxGuestStatus;
1672
1673/** Forward declaration of the video accelerator command memory. */
1674struct VBVAMEMORY;
1675/** Pointer to video accelerator command memory. */
1676typedef struct VBVAMEMORY *PVBVAMEMORY;
1677
1678/** Pointer to a VMMDev connector interface. */
1679typedef struct PDMIVMMDEVCONNECTOR *PPDMIVMMDEVCONNECTOR;
1680/**
1681 * VMMDev connector interface (up).
1682 * Pair with PDMIVMMDEVPORT.
1683 */
1684typedef struct PDMIVMMDEVCONNECTOR
1685{
1686 /**
1687 * Update guest facility status.
1688 *
1689 * Called in response to VMMDevReq_ReportGuestStatus, reset or state restore.
1690 *
1691 * @param pInterface Pointer to this interface.
1692 * @param uFacility The facility.
1693 * @param uStatus The status.
1694 * @param fFlags Flags assoicated with the update. Currently
1695 * reserved and should be ignored.
1696 * @param pTimeSpecTS Pointer to the timestamp of this report.
1697 * @thread The emulation thread.
1698 */
1699 DECLR3CALLBACKMEMBER(void, pfnUpdateGuestStatus,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t uFacility, uint16_t uStatus,
1700 uint32_t fFlags, PCRTTIMESPEC pTimeSpecTS));
1701
1702 /**
1703 * Updates a guest user state.
1704 *
1705 * Called in response to VMMDevReq_ReportGuestUserState.
1706 *
1707 * @param pInterface Pointer to this interface.
1708 * @param pszUser Guest user name to update status for.
1709 * @param pszDomain Domain the guest user is bound to. Optional.
1710 * @param uState New guest user state to notify host about.
1711 * @param pabDetails Pointer to optional state data.
1712 * @param cbDetails Size (in bytes) of optional state data.
1713 * @thread The emulation thread.
1714 */
1715 DECLR3CALLBACKMEMBER(void, pfnUpdateGuestUserState,(PPDMIVMMDEVCONNECTOR pInterface, const char *pszUser,
1716 const char *pszDomain, uint32_t uState,
1717 const uint8_t *pabDetails, uint32_t cbDetails));
1718
1719 /**
1720 * Reports the guest API and OS version.
1721 * Called whenever the Additions issue a guest info report request.
1722 *
1723 * @param pInterface Pointer to this interface.
1724 * @param pGuestInfo Pointer to guest information structure
1725 * @thread The emulation thread.
1726 */
1727 DECLR3CALLBACKMEMBER(void, pfnUpdateGuestInfo,(PPDMIVMMDEVCONNECTOR pInterface, const struct VBoxGuestInfo *pGuestInfo));
1728
1729 /**
1730 * Reports the detailed Guest Additions version.
1731 *
1732 * @param pInterface Pointer to this interface.
1733 * @param uFullVersion The guest additions version as a full version.
1734 * Use VBOX_FULL_VERSION_GET_MAJOR,
1735 * VBOX_FULL_VERSION_GET_MINOR and
1736 * VBOX_FULL_VERSION_GET_BUILD to access it.
1737 * (This will not be zero, so turn down the
1738 * paranoia level a notch.)
1739 * @param pszName Pointer to the sanitized version name. This can
1740 * be empty, but will not be NULL. If not empty,
1741 * it will contain a build type tag and/or a
1742 * publisher tag. If both, then they are separated
1743 * by an underscore (VBOX_VERSION_STRING fashion).
1744 * @param uRevision The SVN revision. Can be 0.
1745 * @param fFeatures Feature mask, currently none are defined.
1746 *
1747 * @thread The emulation thread.
1748 */
1749 DECLR3CALLBACKMEMBER(void, pfnUpdateGuestInfo2,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t uFullVersion,
1750 const char *pszName, uint32_t uRevision, uint32_t fFeatures));
1751
1752 /**
1753 * Update the guest additions capabilities.
1754 * This is called when the guest additions capabilities change. The new capabilities
1755 * are given and the connector should update its internal state.
1756 *
1757 * @param pInterface Pointer to this interface.
1758 * @param newCapabilities New capabilities.
1759 * @thread The emulation thread.
1760 */
1761 DECLR3CALLBACKMEMBER(void, pfnUpdateGuestCapabilities,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t newCapabilities));
1762
1763 /**
1764 * Update the mouse capabilities.
1765 * This is called when the mouse capabilities change. The new capabilities
1766 * are given and the connector should update its internal state.
1767 *
1768 * @param pInterface Pointer to this interface.
1769 * @param newCapabilities New capabilities.
1770 * @thread The emulation thread.
1771 */
1772 DECLR3CALLBACKMEMBER(void, pfnUpdateMouseCapabilities,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t newCapabilities));
1773
1774 /**
1775 * Update the pointer shape.
1776 * This is called when the mouse pointer shape changes. The new shape
1777 * is passed as a caller allocated buffer that will be freed after returning
1778 *
1779 * @param pInterface Pointer to this interface.
1780 * @param fVisible Visibility indicator (if false, the other parameters are undefined).
1781 * @param fAlpha Flag whether alpha channel is being passed.
1782 * @param xHot Pointer hot spot x coordinate.
1783 * @param yHot Pointer hot spot y coordinate.
1784 * @param x Pointer new x coordinate on screen.
1785 * @param y Pointer new y coordinate on screen.
1786 * @param cx Pointer width in pixels.
1787 * @param cy Pointer height in pixels.
1788 * @param cbScanline Size of one scanline in bytes.
1789 * @param pvShape New shape buffer.
1790 * @thread The emulation thread.
1791 */
1792 DECLR3CALLBACKMEMBER(void, pfnUpdatePointerShape,(PPDMIVMMDEVCONNECTOR pInterface, bool fVisible, bool fAlpha,
1793 uint32_t xHot, uint32_t yHot,
1794 uint32_t cx, uint32_t cy,
1795 void *pvShape));
1796
1797 /**
1798 * Enable or disable video acceleration on behalf of guest.
1799 *
1800 * @param pInterface Pointer to this interface.
1801 * @param fEnable Whether to enable acceleration.
1802 * @param pVbvaMemory Video accelerator memory.
1803
1804 * @return VBox rc. VINF_SUCCESS if VBVA was enabled.
1805 * @thread The emulation thread.
1806 */
1807 DECLR3CALLBACKMEMBER(int, pfnVideoAccelEnable,(PPDMIVMMDEVCONNECTOR pInterface, bool fEnable, PVBVAMEMORY pVbvaMemory));
1808
1809 /**
1810 * Force video queue processing.
1811 *
1812 * @param pInterface Pointer to this interface.
1813 * @thread The emulation thread.
1814 */
1815 DECLR3CALLBACKMEMBER(void, pfnVideoAccelFlush,(PPDMIVMMDEVCONNECTOR pInterface));
1816
1817 /**
1818 * Return whether the given video mode is supported/wanted by the host.
1819 *
1820 * @returns VBox status code
1821 * @param pInterface Pointer to this interface.
1822 * @param display The guest monitor, 0 for primary.
1823 * @param cy Video mode horizontal resolution in pixels.
1824 * @param cx Video mode vertical resolution in pixels.
1825 * @param cBits Video mode bits per pixel.
1826 * @param pfSupported Where to put the indicator for whether this mode is supported. (output)
1827 * @thread The emulation thread.
1828 */
1829 DECLR3CALLBACKMEMBER(int, pfnVideoModeSupported,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t display, uint32_t cx, uint32_t cy, uint32_t cBits, bool *pfSupported));
1830
1831 /**
1832 * Queries by how many pixels the height should be reduced when calculating video modes
1833 *
1834 * @returns VBox status code
1835 * @param pInterface Pointer to this interface.
1836 * @param pcyReduction Pointer to the result value.
1837 * @thread The emulation thread.
1838 */
1839 DECLR3CALLBACKMEMBER(int, pfnGetHeightReduction,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pcyReduction));
1840
1841 /**
1842 * Informs about a credentials judgement result from the guest.
1843 *
1844 * @returns VBox status code
1845 * @param pInterface Pointer to this interface.
1846 * @param fFlags Judgement result flags.
1847 * @thread The emulation thread.
1848 */
1849 DECLR3CALLBACKMEMBER(int, pfnSetCredentialsJudgementResult,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t fFlags));
1850
1851 /**
1852 * Set the visible region of the display
1853 *
1854 * @returns VBox status code.
1855 * @param pInterface Pointer to this interface.
1856 * @param cRect Number of rectangles in pRect
1857 * @param pRect Rectangle array
1858 * @thread The emulation thread.
1859 */
1860 DECLR3CALLBACKMEMBER(int, pfnSetVisibleRegion,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t cRect, PRTRECT pRect));
1861
1862 /**
1863 * Query the visible region of the display
1864 *
1865 * @returns VBox status code.
1866 * @param pInterface Pointer to this interface.
1867 * @param pcRects Where to return the number of rectangles in
1868 * paRects.
1869 * @param paRects Rectangle array (set to NULL to query the number
1870 * of rectangles)
1871 * @thread The emulation thread.
1872 */
1873 DECLR3CALLBACKMEMBER(int, pfnQueryVisibleRegion,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pcRects, PRTRECT paRects));
1874
1875 /**
1876 * Request the statistics interval
1877 *
1878 * @returns VBox status code.
1879 * @param pInterface Pointer to this interface.
1880 * @param pulInterval Pointer to interval in seconds
1881 * @thread The emulation thread.
1882 */
1883 DECLR3CALLBACKMEMBER(int, pfnQueryStatisticsInterval,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pulInterval));
1884
1885 /**
1886 * Report new guest statistics
1887 *
1888 * @returns VBox status code.
1889 * @param pInterface Pointer to this interface.
1890 * @param pGuestStats Guest statistics
1891 * @thread The emulation thread.
1892 */
1893 DECLR3CALLBACKMEMBER(int, pfnReportStatistics,(PPDMIVMMDEVCONNECTOR pInterface, struct VBoxGuestStatistics *pGuestStats));
1894
1895 /**
1896 * Query the current balloon size
1897 *
1898 * @returns VBox status code.
1899 * @param pInterface Pointer to this interface.
1900 * @param pcbBalloon Balloon size
1901 * @thread The emulation thread.
1902 */
1903 DECLR3CALLBACKMEMBER(int, pfnQueryBalloonSize,(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pcbBalloon));
1904
1905 /**
1906 * Query the current page fusion setting
1907 *
1908 * @returns VBox status code.
1909 * @param pInterface Pointer to this interface.
1910 * @param pfPageFusionEnabled Pointer to boolean
1911 * @thread The emulation thread.
1912 */
1913 DECLR3CALLBACKMEMBER(int, pfnIsPageFusionEnabled,(PPDMIVMMDEVCONNECTOR pInterface, bool *pfPageFusionEnabled));
1914
1915} PDMIVMMDEVCONNECTOR;
1916/** PDMIVMMDEVCONNECTOR interface ID. */
1917#define PDMIVMMDEVCONNECTOR_IID "aff90240-a443-434e-9132-80c186ab97d4"
1918
1919
1920/**
1921 * Generic status LED core.
1922 * Note that a unit doesn't have to support all the indicators.
1923 */
1924typedef union PDMLEDCORE
1925{
1926 /** 32-bit view. */
1927 uint32_t volatile u32;
1928 /** Bit view. */
1929 struct
1930 {
1931 /** Reading/Receiving indicator. */
1932 uint32_t fReading : 1;
1933 /** Writing/Sending indicator. */
1934 uint32_t fWriting : 1;
1935 /** Busy indicator. */
1936 uint32_t fBusy : 1;
1937 /** Error indicator. */
1938 uint32_t fError : 1;
1939 } s;
1940} PDMLEDCORE;
1941
1942/** LED bit masks for the u32 view.
1943 * @{ */
1944/** Reading/Receiving indicator. */
1945#define PDMLED_READING RT_BIT(0)
1946/** Writing/Sending indicator. */
1947#define PDMLED_WRITING RT_BIT(1)
1948/** Busy indicator. */
1949#define PDMLED_BUSY RT_BIT(2)
1950/** Error indicator. */
1951#define PDMLED_ERROR RT_BIT(3)
1952/** @} */
1953
1954
1955/**
1956 * Generic status LED.
1957 * Note that a unit doesn't have to support all the indicators.
1958 */
1959typedef struct PDMLED
1960{
1961 /** Just a magic for sanity checking. */
1962 uint32_t u32Magic;
1963 uint32_t u32Alignment; /**< structure size alignment. */
1964 /** The actual LED status.
1965 * Only the device is allowed to change this. */
1966 PDMLEDCORE Actual;
1967 /** The asserted LED status which is cleared by the reader.
1968 * The device will assert the bits but never clear them.
1969 * The driver clears them as it sees fit. */
1970 PDMLEDCORE Asserted;
1971} PDMLED;
1972
1973/** Pointer to an LED. */
1974typedef PDMLED *PPDMLED;
1975/** Pointer to a const LED. */
1976typedef const PDMLED *PCPDMLED;
1977
1978/** Magic value for PDMLED::u32Magic. */
1979#define PDMLED_MAGIC UINT32_C(0x11335577)
1980
1981/** Pointer to an LED ports interface. */
1982typedef struct PDMILEDPORTS *PPDMILEDPORTS;
1983/**
1984 * Interface for exporting LEDs (down).
1985 * Pair with PDMILEDCONNECTORS.
1986 */
1987typedef struct PDMILEDPORTS
1988{
1989 /**
1990 * Gets the pointer to the status LED of a unit.
1991 *
1992 * @returns VBox status code.
1993 * @param pInterface Pointer to the interface structure containing the called function pointer.
1994 * @param iLUN The unit which status LED we desire.
1995 * @param ppLed Where to store the LED pointer.
1996 */
1997 DECLR3CALLBACKMEMBER(int, pfnQueryStatusLed,(PPDMILEDPORTS pInterface, unsigned iLUN, PPDMLED *ppLed));
1998
1999} PDMILEDPORTS;
2000/** PDMILEDPORTS interface ID. */
2001#define PDMILEDPORTS_IID "435e0cec-8549-4ca0-8c0d-98e52f1dc038"
2002
2003
2004/** Pointer to an LED connectors interface. */
2005typedef struct PDMILEDCONNECTORS *PPDMILEDCONNECTORS;
2006/**
2007 * Interface for reading LEDs (up).
2008 * Pair with PDMILEDPORTS.
2009 */
2010typedef struct PDMILEDCONNECTORS
2011{
2012 /**
2013 * Notification about a unit which have been changed.
2014 *
2015 * The driver must discard any pointers to data owned by
2016 * the unit and requery it.
2017 *
2018 * @param pInterface Pointer to the interface structure containing the called function pointer.
2019 * @param iLUN The unit number.
2020 */
2021 DECLR3CALLBACKMEMBER(void, pfnUnitChanged,(PPDMILEDCONNECTORS pInterface, unsigned iLUN));
2022} PDMILEDCONNECTORS;
2023/** PDMILEDCONNECTORS interface ID. */
2024#define PDMILEDCONNECTORS_IID "8ed63568-82a7-4193-b57b-db8085ac4495"
2025
2026
2027/** Pointer to a Media Notification interface. */
2028typedef struct PDMIMEDIANOTIFY *PPDMIMEDIANOTIFY;
2029/**
2030 * Interface for exporting Medium eject information (up). No interface pair.
2031 */
2032typedef struct PDMIMEDIANOTIFY
2033{
2034 /**
2035 * Signals that the medium was ejected.
2036 *
2037 * @returns VBox status code.
2038 * @param pInterface Pointer to the interface structure containing the called function pointer.
2039 * @param iLUN The unit which had the medium ejected.
2040 */
2041 DECLR3CALLBACKMEMBER(int, pfnEjected,(PPDMIMEDIANOTIFY pInterface, unsigned iLUN));
2042
2043} PDMIMEDIANOTIFY;
2044/** PDMIMEDIANOTIFY interface ID. */
2045#define PDMIMEDIANOTIFY_IID "fc22d53e-feb1-4a9c-b9fb-0a990a6ab288"
2046
2047
2048/** The special status unit number */
2049#define PDM_STATUS_LUN 999
2050
2051
2052#ifdef VBOX_WITH_HGCM
2053
2054/** Abstract HGCM command structure. Used only to define a typed pointer. */
2055struct VBOXHGCMCMD;
2056
2057/** Pointer to HGCM command structure. This pointer is unique and identifies
2058 * the command being processed. The pointer is passed to HGCM connector methods,
2059 * and must be passed back to HGCM port when command is completed.
2060 */
2061typedef struct VBOXHGCMCMD *PVBOXHGCMCMD;
2062
2063/** Pointer to a HGCM port interface. */
2064typedef struct PDMIHGCMPORT *PPDMIHGCMPORT;
2065/**
2066 * Host-Guest communication manager port interface (down). Normally implemented
2067 * by VMMDev.
2068 * Pair with PDMIHGCMCONNECTOR.
2069 */
2070typedef struct PDMIHGCMPORT
2071{
2072 /**
2073 * Notify the guest on a command completion.
2074 *
2075 * @returns VINF_SUCCESS or VERR_CANCELLED if the guest canceled the call.
2076 * @param pInterface Pointer to this interface.
2077 * @param rc The return code (VBox error code).
2078 * @param pCmd A pointer that identifies the completed command.
2079 */
2080 DECLR3CALLBACKMEMBER(int, pfnCompleted,(PPDMIHGCMPORT pInterface, int32_t rc, PVBOXHGCMCMD pCmd));
2081
2082 /**
2083 * Checks if @a pCmd was restored & resubmitted from saved state.
2084 *
2085 * @returns true if restored, false if not.
2086 * @param pInterface Pointer to this interface.
2087 * @param pCmd The command we're checking on.
2088 */
2089 DECLR3CALLBACKMEMBER(bool, pfnIsCmdRestored,(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd));
2090
2091 /**
2092 * Checks if @a pCmd was cancelled.
2093 *
2094 * @returns true if cancelled, false if not.
2095 * @param pInterface Pointer to this interface.
2096 * @param pCmd The command we're checking on.
2097 */
2098 DECLR3CALLBACKMEMBER(bool, pfnIsCmdCancelled,(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd));
2099
2100 /**
2101 * Gets the VMMDevRequestHeader::fRequestor value for @a pCmd.
2102 *
2103 * @returns The fRequestor value, VMMDEV_REQUESTOR_LEGACY if guest does not
2104 * support it, VMMDEV_REQUESTOR_LOWEST if invalid parameters.
2105 * @param pInterface Pointer to this interface.
2106 * @param pCmd The command we're in checking on.
2107 */
2108 DECLR3CALLBACKMEMBER(uint32_t, pfnGetRequestor,(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd));
2109
2110 /**
2111 * Gets the VMMDevState::idSession value.
2112 *
2113 * @returns VMMDevState::idSession.
2114 * @param pInterface Pointer to this interface.
2115 */
2116 DECLR3CALLBACKMEMBER(uint64_t, pfnGetVMMDevSessionId,(PPDMIHGCMPORT pInterface));
2117
2118} PDMIHGCMPORT;
2119/** PDMIHGCMPORT interface ID. */
2120# define PDMIHGCMPORT_IID "28c0a201-68cd-4752-9404-bb42a0c09eb7"
2121
2122/* forward decl to hgvmsvc.h. */
2123struct VBOXHGCMSVCPARM;
2124/** Pointer to a HGCM service location structure. */
2125typedef struct HGCMSERVICELOCATION *PHGCMSERVICELOCATION;
2126/** Pointer to a HGCM connector interface. */
2127typedef struct PDMIHGCMCONNECTOR *PPDMIHGCMCONNECTOR;
2128/**
2129 * The Host-Guest communication manager connector interface (up). Normally
2130 * implemented by Main::VMMDevInterface.
2131 * Pair with PDMIHGCMPORT.
2132 */
2133typedef struct PDMIHGCMCONNECTOR
2134{
2135 /**
2136 * Locate a service and inform it about a client connection.
2137 *
2138 * @param pInterface Pointer to this interface.
2139 * @param pCmd A pointer that identifies the command.
2140 * @param pServiceLocation Pointer to the service location structure.
2141 * @param pu32ClientID Where to store the client id for the connection.
2142 * @return VBox status code.
2143 * @thread The emulation thread.
2144 */
2145 DECLR3CALLBACKMEMBER(int, pfnConnect,(PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, PHGCMSERVICELOCATION pServiceLocation, uint32_t *pu32ClientID));
2146
2147 /**
2148 * Disconnect from service.
2149 *
2150 * @param pInterface Pointer to this interface.
2151 * @param pCmd A pointer that identifies the command.
2152 * @param u32ClientID The client id returned by the pfnConnect call.
2153 * @return VBox status code.
2154 * @thread The emulation thread.
2155 */
2156 DECLR3CALLBACKMEMBER(int, pfnDisconnect,(PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, uint32_t u32ClientID));
2157
2158 /**
2159 * Process a guest issued command.
2160 *
2161 * @param pInterface Pointer to this interface.
2162 * @param pCmd A pointer that identifies the command.
2163 * @param u32ClientID The client id returned by the pfnConnect call.
2164 * @param u32Function Function to be performed by the service.
2165 * @param cParms Number of parameters in the array pointed to by paParams.
2166 * @param paParms Pointer to an array of parameters.
2167 * @param tsArrival The STAM_GET_TS() value when the request arrived.
2168 * @return VBox status code.
2169 * @thread The emulation thread.
2170 */
2171 DECLR3CALLBACKMEMBER(int, pfnCall,(PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, uint32_t u32ClientID, uint32_t u32Function,
2172 uint32_t cParms, struct VBOXHGCMSVCPARM *paParms, uint64_t tsArrival));
2173
2174 /**
2175 * Notification about the guest cancelling a pending request.
2176 * @param pInterface Pointer to this interface.
2177 * @param pCmd A pointer that identifies the command.
2178 * @param idclient The client id returned by the pfnConnect call.
2179 */
2180 DECLR3CALLBACKMEMBER(void, pfnCancelled,(PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, uint32_t idClient));
2181
2182} PDMIHGCMCONNECTOR;
2183/** PDMIHGCMCONNECTOR interface ID. */
2184# define PDMIHGCMCONNECTOR_IID "33cb5c91-6a4a-4ad9-3fec-d1f7d413c4a5"
2185
2186#endif /* VBOX_WITH_HGCM */
2187
2188
2189/** Pointer to a display VBVA callbacks interface. */
2190typedef struct PDMIDISPLAYVBVACALLBACKS *PPDMIDISPLAYVBVACALLBACKS;
2191/**
2192 * Display VBVA callbacks interface (up).
2193 */
2194typedef struct PDMIDISPLAYVBVACALLBACKS
2195{
2196
2197 /**
2198 * Informs guest about completion of processing the given Video HW Acceleration
2199 * command, does not wait for the guest to process the command.
2200 *
2201 * @returns ???
2202 * @param pInterface Pointer to this interface.
2203 * @param pCmd The Video HW Acceleration Command that was
2204 * completed.
2205 */
2206 DECLR3CALLBACKMEMBER(int, pfnVHWACommandCompleteAsync,(PPDMIDISPLAYVBVACALLBACKS pInterface,
2207 VBOXVHWACMD RT_UNTRUSTED_VOLATILE_GUEST *pCmd));
2208
2209 DECLR3CALLBACKMEMBER(int, pfnCrHgsmiCommandCompleteAsync,(PPDMIDISPLAYVBVACALLBACKS pInterface,
2210 struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, int rc));
2211
2212 DECLR3CALLBACKMEMBER(int, pfnCrHgsmiControlCompleteAsync,(PPDMIDISPLAYVBVACALLBACKS pInterface,
2213 struct VBOXVDMACMD_CHROMIUM_CTL *pCmd, int rc));
2214
2215 DECLR3CALLBACKMEMBER(int, pfnCrCtlSubmit,(PPDMIDISPLAYVBVACALLBACKS pInterface, struct VBOXCRCMDCTL *pCmd, uint32_t cbCmd,
2216 PFNCRCTLCOMPLETION pfnCompletion, void *pvCompletion));
2217
2218 DECLR3CALLBACKMEMBER(int, pfnCrCtlSubmitSync,(PPDMIDISPLAYVBVACALLBACKS pInterface,
2219 struct VBOXCRCMDCTL *pCmd, uint32_t cbCmd));
2220} PDMIDISPLAYVBVACALLBACKS;
2221/** PDMIDISPLAYVBVACALLBACKS */
2222#define PDMIDISPLAYVBVACALLBACKS_IID "ddac0bd0-332d-4671-8853-732921a80216"
2223
2224/** Pointer to a PCI raw connector interface. */
2225typedef struct PDMIPCIRAWCONNECTOR *PPDMIPCIRAWCONNECTOR;
2226/**
2227 * PCI raw connector interface (up).
2228 */
2229typedef struct PDMIPCIRAWCONNECTOR
2230{
2231
2232 /**
2233 *
2234 */
2235 DECLR3CALLBACKMEMBER(int, pfnDeviceConstructComplete, (PPDMIPCIRAWCONNECTOR pInterface, const char *pcszName,
2236 uint32_t uHostPciAddress, uint32_t uGuestPciAddress,
2237 int rc));
2238
2239} PDMIPCIRAWCONNECTOR;
2240/** PDMIPCIRAWCONNECTOR interface ID. */
2241#define PDMIPCIRAWCONNECTOR_IID "14aa9c6c-8869-4782-9dfc-910071a6aebf"
2242
2243/** @} */
2244
2245RT_C_DECLS_END
2246
2247#endif /* !VBOX_INCLUDED_vmm_pdmifs_h */
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