VirtualBox

source: vbox/trunk/include/VBox/scsiinline.h@ 65971

Last change on this file since 65971 was 65112, checked in by vboxsync, 8 years ago

doxygen fix

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.9 KB
Line 
1/* $Id: scsiinline.h 65112 2017-01-04 14:10:16Z vboxsync $ */
2/** @file
3 * VirtualBox: SCSI inline helpers used by devices, drivers, etc.
4 */
5
6/*
7 * Copyright (C) 2006-2016 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#ifndef ___VBox_scsiinline_h
18#define ___VBox_scsiinline_h
19
20#include <iprt/stdint.h>
21
22/** @defgroup grp_scsi_inline The SCSI inline helpers
23 * @{
24 */
25
26
27/**
28 * Converts a given 16bit value to big endian and stores it in the given buffer.
29 *
30 * @returns nothing.
31 * @param pbBuf The buffer to store the value into.
32 * @param u16Val The value to store.
33 */
34DECLINLINE(void) scsiH2BE_U16(uint8_t *pbBuf, uint16_t u16Val)
35{
36 pbBuf[0] = u16Val >> 8;
37 pbBuf[1] = u16Val;
38}
39
40
41/**
42 * Converts a given 24bit value to big endian and stores it in the given buffer.
43 *
44 * @returns nothing.
45 * @param pbBuf The buffer to store the value into.
46 * @param u32Val The value to store.
47 */
48DECLINLINE(void) scsiH2BE_U24(uint8_t *pbBuf, uint32_t u32Val)
49{
50 pbBuf[0] = u32Val >> 16;
51 pbBuf[1] = u32Val >> 8;
52 pbBuf[2] = u32Val;
53}
54
55
56/**
57 * Converts a given 32bit value to big endian and stores it in the given buffer.
58 *
59 * @returns nothing.
60 * @param pbBuf The buffer to store the value into.
61 * @param u32Val The value to store.
62 */
63DECLINLINE(void) scsiH2BE_U32(uint8_t *pbBuf, uint32_t u32Val)
64{
65 pbBuf[0] = u32Val >> 24;
66 pbBuf[1] = u32Val >> 16;
67 pbBuf[2] = u32Val >> 8;
68 pbBuf[3] = u32Val;
69}
70
71
72/**
73 * Converts a given 64bit value to big endian and stores it in the given buffer.
74 *
75 * @returns nothing.
76 * @param pbBuf The buffer to store the value into.
77 * @param u64Val The value to store.
78 */
79DECLINLINE(void) scsiH2BE_U64(uint8_t *pbBuf, uint64_t u64Val)
80{
81 pbBuf[0] = u64Val >> 56;
82 pbBuf[1] = u64Val >> 48;
83 pbBuf[2] = u64Val >> 40;
84 pbBuf[3] = u64Val >> 32;
85 pbBuf[4] = u64Val >> 24;
86 pbBuf[5] = u64Val >> 16;
87 pbBuf[6] = u64Val >> 8;
88 pbBuf[7] = u64Val;
89}
90
91/**
92 * Returns a 16bit value read from the given buffer converted to host endianess.
93 *
94 * @returns The converted 16bit value.
95 * @param pbBuf The buffer to read the value from.
96 */
97DECLINLINE(uint16_t) scsiBE2H_U16(const uint8_t *pbBuf)
98{
99 return (pbBuf[0] << 8) | pbBuf[1];
100}
101
102
103/**
104 * Returns a 24bit value read from the given buffer converted to host endianess.
105 *
106 * @returns The converted 24bit value as a 32bit unsigned integer.
107 * @param pbBuf The buffer to read the value from.
108 */
109DECLINLINE(uint32_t) scsiBE2H_U24(const uint8_t *pbBuf)
110{
111 return (pbBuf[0] << 16) | (pbBuf[1] << 8) | pbBuf[2];
112}
113
114
115/**
116 * Returns a 32bit value read from the given buffer converted to host endianess.
117 *
118 * @returns The converted 32bit value.
119 * @param pbBuf The buffer to read the value from.
120 */
121DECLINLINE(uint32_t) scsiBE2H_U32(const uint8_t *pbBuf)
122{
123 return (pbBuf[0] << 24) | (pbBuf[1] << 16) | (pbBuf[2] << 8) | pbBuf[3];
124}
125
126
127/**
128 * Returns a 64bit value read from the given buffer converted to host endianess.
129 *
130 * @returns The converted 64bit value.
131 * @param pbBuf The buffer to read the value from.
132 */
133DECLINLINE(uint64_t) scsiBE2H_U64(const uint8_t *pbBuf)
134{
135 return ((uint64_t)pbBuf[0] << 56)
136 | ((uint64_t)pbBuf[1] << 48)
137 | ((uint64_t)pbBuf[2] << 40)
138 | ((uint64_t)pbBuf[3] << 32)
139 | ((uint64_t)pbBuf[4] << 24)
140 | ((uint64_t)pbBuf[5] << 16)
141 | ((uint64_t)pbBuf[6] << 8)
142 | (uint64_t)pbBuf[7];
143}
144
145
146/**
147 * Converts the given LBA number to the MSF (Minutes:Seconds:Frames) format
148 * and stores it in the given buffer.
149 *
150 * @returns nothing.
151 * @param pbBuf The buffer to store the value into.
152 * @param iLBA The LBA to convert.
153 */
154DECLINLINE(void) scsiLBA2MSF(uint8_t *pbBuf, uint32_t iLBA)
155{
156 iLBA += 150;
157 pbBuf[0] = (iLBA / 75) / 60;
158 pbBuf[1] = (iLBA / 75) % 60;
159 pbBuf[2] = iLBA % 75;
160}
161
162
163/**
164 * Converts a MSF formatted address value read from the given buffer
165 * to an LBA number.
166 *
167 * @returns The LBA number.
168 * @param pbBuf The buffer to read the MSF formatted address
169 * from.
170 */
171DECLINLINE(uint32_t) scsiMSF2LBA(const uint8_t *pbBuf)
172{
173 return (pbBuf[0] * 60 + pbBuf[1]) * 75 + pbBuf[2];
174}
175
176
177/**
178 * Copies a given string to the given destination padding all unused space
179 * in the destination with spaces.
180 *
181 * @returns nothing.
182 * @param pbDst Where to store the string padded with spaces.
183 * @param pbSrc The string to copy.
184 * @param cbSize Size of the destination buffer.
185 */
186DECLINLINE(void) scsiPadStr(uint8_t *pbDst, const char *pbSrc, uint32_t cbSize)
187{
188 for (uint32_t i = 0; i < cbSize; i++)
189 {
190 if (*pbSrc)
191 pbDst[i] = *pbSrc++;
192 else
193 pbDst[i] = ' ';
194 }
195}
196
197
198/**
199 * Copies a given string to the given destination padding all unused space
200 * in the destination with spaces.
201 *
202 * @returns nothing.
203 * @param pbDst Where to store the string padded with spaces.
204 * @param pbSrc The string to copy.
205 * @param cbSize Size of the destination buffer.
206 */
207DECLINLINE(void) scsiPadStrS(int8_t *pbDst, const char *pbSrc, uint32_t cbSize)
208{
209 for (uint32_t i = 0; i < cbSize; i++)
210 {
211 if (*pbSrc)
212 pbDst[i] = *pbSrc++;
213 else
214 pbDst[i] = ' ';
215 }
216}
217
218/** @} */
219
220#endif /* ___VBox_scsiinline_h */
221
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