VirtualBox

source: vbox/trunk/src/VBox/Devices/Storage/DrvHostBase.h@ 72919

Last change on this file since 72919 was 69500, checked in by vboxsync, 7 years ago

*: scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.1 KB
Line 
1/* $Id: DrvHostBase.h 69500 2017-10-28 15:14:05Z vboxsync $ */
2/** @file
3 * DrvHostBase - Host base drive access driver.
4 */
5
6/*
7 * Copyright (C) 2006-2017 Oracle Corporation
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
18#ifndef __HostDrvBase_h__
19#define __HostDrvBase_h__
20
21#include <iprt/assert.h>
22#include <iprt/err.h>
23#include <iprt/critsect.h>
24#include <iprt/log.h>
25#include <iprt/semaphore.h>
26#include <VBox/cdefs.h>
27#include <VBox/vmm/pdmdrv.h>
28#include <VBox/vmm/pdmstorageifs.h>
29
30RT_C_DECLS_BEGIN
31
32
33/** Pointer to host base drive access driver instance data. */
34typedef struct DRVHOSTBASE *PDRVHOSTBASE;
35/**
36 * Host base drive access driver instance data.
37 *
38 * @implements PDMIMOUNT
39 * @implements PDMIMEDIA
40 */
41typedef struct DRVHOSTBASE
42{
43 /** Critical section used to serialize access to the handle and other
44 * members of this struct. */
45 RTCRITSECT CritSect;
46 /** Pointer driver instance. */
47 PPDMDRVINS pDrvIns;
48 /** Drive type. */
49 PDMMEDIATYPE enmType;
50 /** Visible to the BIOS. */
51 bool fBiosVisible;
52 /** The configuration readonly value. */
53 bool fReadOnlyConfig;
54 /** The current readonly status. */
55 bool fReadOnly;
56 /** Flag whether failure to attach is an error or not. */
57 bool fAttachFailError;
58 /** Flag whether to keep instance working (as unmounted though). */
59 bool fKeepInstance;
60 /** Device name (MMHeap). */
61 char *pszDevice;
62 /** Device name to open (RTStrFree). */
63 char *pszDeviceOpen;
64 /** Uuid of the drive. */
65 RTUUID Uuid;
66
67 /** Pointer to the media port interface above us. */
68 PPDMIMEDIAPORT pDrvMediaPort;
69 /** Pointer to the extended media port interface above us. */
70 PPDMIMEDIAEXPORT pDrvMediaExPort;
71 /** Pointer to the mount notify interface above us. */
72 PPDMIMOUNTNOTIFY pDrvMountNotify;
73 /** Our media interface. */
74 PDMIMEDIA IMedia;
75 /** Our extended media interface. */
76 PDMIMEDIAEX IMediaEx;
77 /** Our mountable interface. */
78 PDMIMOUNT IMount;
79
80 /** Media present indicator. */
81 bool volatile fMediaPresent;
82 /** Locked indicator. */
83 bool fLocked;
84 /** The size of the media currently in the drive.
85 * This is invalid if no drive is in the drive. */
86 uint64_t volatile cbSize;
87
88 /** Handle of the poller thread. */
89 RTTHREAD ThreadPoller;
90 /** Event semaphore the thread will wait on. */
91 RTSEMEVENT EventPoller;
92 /** The poller interval. */
93 RTMSINTERVAL cMilliesPoller;
94 /** The shutdown indicator. */
95 bool volatile fShutdownPoller;
96
97 /** BIOS PCHS geometry. */
98 PDMMEDIAGEOMETRY PCHSGeometry;
99 /** BIOS LCHS geometry. */
100 PDMMEDIAGEOMETRY LCHSGeometry;
101
102 /** Pointer to the current buffer holding data. */
103 void *pvBuf;
104 /** Size of the buffer. */
105 size_t cbBuf;
106 /** Size of the I/O request to allocate. */
107 size_t cbIoReqAlloc;
108
109 /** Release statistics: number of bytes written. */
110 STAMCOUNTER StatBytesWritten;
111 /** Release statistics: number of bytes read. */
112 STAMCOUNTER StatBytesRead;
113 /** Release statistics: Number of requests submitted. */
114 STAMCOUNTER StatReqsSubmitted;
115 /** Release statistics: Number of requests failed. */
116 STAMCOUNTER StatReqsFailed;
117 /** Release statistics: Number of requests succeeded. */
118 STAMCOUNTER StatReqsSucceeded;
119 /** Release statistics: Number of flush requests. */
120 STAMCOUNTER StatReqsFlush;
121 /** Release statistics: Number of write requests. */
122 STAMCOUNTER StatReqsWrite;
123 /** Release statistics: Number of read requests. */
124 STAMCOUNTER StatReqsRead;
125
126 /**
127 * Performs the locking / unlocking of the device.
128 *
129 * This callback pointer should be set to NULL if the device doesn't support this action.
130 *
131 * @returns VBox status code.
132 * @param pThis Pointer to the instance data.
133 * @param fLock Set if locking, clear if unlocking.
134 */
135 DECLCALLBACKMEMBER(int, pfnDoLock)(PDRVHOSTBASE pThis, bool fLock);
136
137 union
138 {
139#ifdef DRVHOSTBASE_OS_INT_DECLARED
140 DRVHOSTBASEOS Os;
141#endif
142 uint8_t abPadding[64];
143 };
144} DRVHOSTBASE;
145
146
147/**
148 * Request structure fo a request.
149 */
150typedef struct DRVHOSTBASEREQ
151{
152 /** Transfer size. */
153 size_t cbReq;
154 /** Amount of residual data. */
155 size_t cbResidual;
156 /** Start of the request data for the device above us. */
157 uint8_t abAlloc[1];
158} DRVHOSTBASEREQ;
159/** Pointer to a request structure. */
160typedef DRVHOSTBASEREQ *PDRVHOSTBASEREQ;
161
162DECLHIDDEN(int) DRVHostBaseInit(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, const char *pszCfgValid, PDMMEDIATYPE enmType);
163DECLHIDDEN(int) DRVHostBaseMediaPresent(PDRVHOSTBASE pThis);
164DECLHIDDEN(void) DRVHostBaseMediaNotPresent(PDRVHOSTBASE pThis);
165DECLCALLBACK(void) DRVHostBaseDestruct(PPDMDRVINS pDrvIns);
166
167DECLHIDDEN(int) drvHostBaseScsiCmdOs(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,
168 void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies);
169DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis);
170DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb);
171DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead);
172DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite);
173DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis);
174DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock);
175DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis);
176
177DECLHIDDEN(void) drvHostBaseInitOs(PDRVHOSTBASE pThis);
178DECLHIDDEN(int) drvHostBaseOpenOs(PDRVHOSTBASE pThis, bool fReadOnly);
179DECLHIDDEN(int) drvHostBaseMediaRefreshOs(PDRVHOSTBASE pThis);
180DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent);
181DECLHIDDEN(bool) drvHostBaseIsMediaPollingRequiredOs(PDRVHOSTBASE pThis);
182DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis);
183
184DECLHIDDEN(int) drvHostBaseBufferRetain(PDRVHOSTBASE pThis, PDRVHOSTBASEREQ pReq, size_t cbBuf, bool fWrite, void **ppvBuf);
185DECLHIDDEN(int) drvHostBaseBufferRelease(PDRVHOSTBASE pThis, PDRVHOSTBASEREQ pReq, size_t cbBuf, bool fWrite, void *pvBuf);
186
187RT_C_DECLS_END
188
189#endif
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