/src/hbfa-fl/HBFA/UefiHostFuzzTestCasePkg/TestStub/UsbIoPpiStubLib/UsbIoPpiStubLib.c
Line | Count | Source (jump to first uncovered line) |
1 | | /** @file |
2 | | |
3 | | Copyright (c) 2018, Intel Corporation. All rights reserved.<BR> |
4 | | SPDX-License-Identifier: BSD-2-Clause-Patent |
5 | | |
6 | | **/ |
7 | | |
8 | | #include <Uefi.h> |
9 | | #include <PiPei.h> |
10 | | #include <Ppi/UsbIo.h> |
11 | | #include <IndustryStandard/Usb.h> |
12 | | |
13 | | #include <Library/BaseLib.h> |
14 | | #include <Library/DebugLib.h> |
15 | | #include <Library/BaseMemoryLib.h> |
16 | | #include <Library/MemoryAllocationLib.h> |
17 | | |
18 | | VOID *mDeviceDescBuffer; |
19 | | UINTN mDeviceDescBufferSize; |
20 | | VOID *mConfigDescBuffer; |
21 | | UINTN mConfigDescBufferSize; |
22 | | VOID *mStringDescBuffer; |
23 | | UINTN mStringDescBufferSize; |
24 | | |
25 | | // |
26 | | // USB Keyboard example |
27 | | // |
28 | | USB_DEVICE_DESCRIPTOR mDeviceDesc = { |
29 | | 0x12, // Length; |
30 | | 0x01, // DescriptorType; - USB_DESC_TYPE_DEVICE |
31 | | 0x0110, // BcdUSB; |
32 | | 0x00, // DeviceClass; |
33 | | 0x00, // DeviceSubClass; |
34 | | 0x00, // DeviceProtocol; |
35 | | 0x08, // MaxPacketSize0; |
36 | | 0x03F0, // IdVendor; |
37 | | 0x0325, // IdProduct; |
38 | | 0x0103, // BcdDevice; |
39 | | 0x01, // StrManufacturer; |
40 | | 0x02, // StrProduct; |
41 | | 0x00, // StrSerialNumber; |
42 | | 0x01, // NumConfigurations; |
43 | | }; |
44 | | |
45 | | typedef struct { |
46 | | USB_CONFIG_DESCRIPTOR ConfigDesc; |
47 | | USB_INTERFACE_DESCRIPTOR InterfaceDesc; |
48 | | EFI_USB_HID_DESCRIPTOR HidDesc; |
49 | | USB_ENDPOINT_DESCRIPTOR EndpointDesc; |
50 | | } FULL_USB_CONFIG_DESCRIPTOR; |
51 | | |
52 | | FULL_USB_CONFIG_DESCRIPTOR mConfigDesc = { |
53 | | { |
54 | | 0x09, // Length; |
55 | | 0x02, // DescriptorType; - USB_DESC_TYPE_CONFIG |
56 | | 0x0022, // TotalLength; |
57 | | 0x01, // NumInterfaces; |
58 | | 0x01, // ConfigurationValue; |
59 | | 0x00, // Configuration; |
60 | | 0xA0, // Attributes; |
61 | | 0x32, // MaxPower; |
62 | | }, |
63 | | { |
64 | | 0x09, // Length; |
65 | | 0x04, // DescriptorType; - USB_DESC_TYPE_INTERFACE |
66 | | 0x00, // InterfaceNumber; |
67 | | 0x00, // AlternateSetting; |
68 | | 0x01, // NumEndpoints; |
69 | | 0x03, // InterfaceClass; |
70 | | 0x01, // InterfaceSubClass; |
71 | | 0x01, // InterfaceProtocol; |
72 | | 0x00, // Interface; |
73 | | }, |
74 | | { |
75 | | 0x09, // Length; |
76 | | 0x21, // DescriptorType; - USB_DESC_TYPE_HID |
77 | | 0x0110, // BcdHID; |
78 | | 0x00, // CountryCode; |
79 | | 0x01, // NumDescriptors; |
80 | | {{0x22, 0x0041}}, // HidClassDesc[0]; |
81 | | }, |
82 | | { |
83 | | 0x07, // Length; |
84 | | 0x05, // DescriptorType; - USB_DESC_TYPE_ENDPOINT |
85 | | 0x81, // EndpointAddress; |
86 | | 0x03, // Attributes; |
87 | | 0x0008, // MaxPacketSize; |
88 | | 0x0A, // Interval; |
89 | | }, |
90 | | }; |
91 | | |
92 | | EFI_USB_STRING_DESCRIPTOR mStringDesc = { |
93 | | 0x04, // Length; |
94 | | 0x03, // DescriptorType; - USB_DESC_TYPE_STRING |
95 | | {0x0409}, // String[0]; |
96 | | }; |
97 | | |
98 | | typedef struct { |
99 | | UINT8 Length; |
100 | | UINT8 DescriptorType; |
101 | | CHAR16 String[4]; |
102 | | } FULL_EFI_USB_STRING_DESCRIPTOR; |
103 | | |
104 | | FULL_EFI_USB_STRING_DESCRIPTOR mStringDesc_2 = { |
105 | | 0x0A, // Length; |
106 | | 0x03, // DescriptorType; - USB_DESC_TYPE_STRING |
107 | | {0x2000, 0x2000, 0x2000, 0x2000}, // String |
108 | | }; |
109 | | |
110 | | // |
111 | | // USB Key example |
112 | | // |
113 | | USB_DEVICE_DESCRIPTOR mDeviceDesc2 = { |
114 | | 0x12, // Length; |
115 | | 0x01, // DescriptorType; - USB_DESC_TYPE_DEVICE |
116 | | 0x0200, // BcdUSB; |
117 | | 0x00, // DeviceClass; |
118 | | 0x00, // DeviceSubClass; |
119 | | 0x00, // DeviceProtocol; |
120 | | 0x40, // MaxPacketSize0; |
121 | | 0x0781, // IdVendor; |
122 | | 0x5151, // IdProduct; |
123 | | 0x0010, // BcdDevice; |
124 | | 0x01, // StrManufacturer; |
125 | | 0x02, // StrProduct; |
126 | | 0x03, // StrSerialNumber; |
127 | | 0x01, // NumConfigurations; |
128 | | }; |
129 | | |
130 | | typedef struct { |
131 | | USB_CONFIG_DESCRIPTOR ConfigDesc; |
132 | | USB_INTERFACE_DESCRIPTOR InterfaceDesc; |
133 | | USB_ENDPOINT_DESCRIPTOR EndpointDesc1; |
134 | | USB_ENDPOINT_DESCRIPTOR EndpointDesc2; |
135 | | } FULL_USB_CONFIG_DESCRIPTOR2; |
136 | | |
137 | | FULL_USB_CONFIG_DESCRIPTOR2 mConfigDesc2 = { |
138 | | { |
139 | | 0x09, // Length; |
140 | | 0x02, // DescriptorType; - USB_DESC_TYPE_CONFIG |
141 | | 0x0020, // TotalLength; |
142 | | 0x01, // NumInterfaces; |
143 | | 0x01, // ConfigurationValue; |
144 | | 0x00, // Configuration; |
145 | | 0x80, // Attributes; |
146 | | 0x64, // MaxPower; |
147 | | }, |
148 | | { |
149 | | 0x09, // Length; |
150 | | 0x04, // DescriptorType; - USB_DESC_TYPE_INTERFACE |
151 | | 0x00, // InterfaceNumber; |
152 | | 0x00, // AlternateSetting; |
153 | | 0x02, // NumEndpoints; |
154 | | 0x08, // InterfaceClass; |
155 | | 0x06, // InterfaceSubClass; |
156 | | 0x50, // InterfaceProtocol; |
157 | | 0x00, // Interface; |
158 | | }, |
159 | | { |
160 | | 0x07, // Length; |
161 | | 0x05, // DescriptorType; - USB_DESC_TYPE_ENDPOINT |
162 | | 0x81, // EndpointAddress; |
163 | | 0x02, // Attributes; |
164 | | 0x0200, // MaxPacketSize; |
165 | | 0x00, // Interval; |
166 | | }, |
167 | | { |
168 | | 0x07, // Length; |
169 | | 0x05, // DescriptorType; - USB_DESC_TYPE_ENDPOINT |
170 | | 0x01, // EndpointAddress; |
171 | | 0x02, // Attributes; |
172 | | 0x0200, // MaxPacketSize; |
173 | | 0x01, // Interval; |
174 | | }, |
175 | | }; |
176 | | |
177 | | EFI_USB_STRING_DESCRIPTOR mStringDesc2 = { |
178 | | 0x04, // Length; |
179 | | 0x03, // DescriptorType; - USB_DESC_TYPE_STRING |
180 | | {0x0409}, // String[0]; |
181 | | }; |
182 | | |
183 | | typedef struct { |
184 | | UINT8 Length; |
185 | | UINT8 DescriptorType; |
186 | | CHAR16 String[4]; |
187 | | } FULL_EFI_USB_STRING_DESCRIPTOR2; |
188 | | |
189 | | FULL_EFI_USB_STRING_DESCRIPTOR2 mStringDesc2_2 = { |
190 | | 0x0A, // Length; |
191 | | 0x03, // DescriptorType; - USB_DESC_TYPE_STRING |
192 | | {0x2000, 0x2000, 0x2000, 0x2000}, // String |
193 | | }; |
194 | | |
195 | | EFI_STATUS |
196 | | EFIAPI |
197 | | UsbIoPpiStubControlTransfer ( |
198 | | IN EFI_PEI_SERVICES **PeiServices, |
199 | | IN PEI_USB_IO_PPI *This, |
200 | | IN EFI_USB_DEVICE_REQUEST *Request, |
201 | | IN EFI_USB_DATA_DIRECTION Direction, |
202 | | IN UINT32 Timeout, |
203 | | IN OUT VOID *Data OPTIONAL, |
204 | | IN UINTN DataLength OPTIONAL |
205 | | ) |
206 | 350 | { |
207 | 350 | DEBUG ((DEBUG_INFO, "USB_STUB: ControlTransfer\n")); |
208 | | |
209 | 350 | if ((Direction == EfiUsbDataIn) && |
210 | 350 | (Request->RequestType == 0x80) && |
211 | 350 | (Request->Request == USB_REQ_GET_DESCRIPTOR)) { |
212 | 350 | switch (Request->Value >> 8) { |
213 | 0 | case USB_DESC_TYPE_DEVICE: |
214 | 0 | DEBUG ((DEBUG_INFO, "DEVICE - 0x%x\n", DataLength)); |
215 | 0 | if (mDeviceDescBuffer != NULL) { |
216 | 0 | if (DataLength > mDeviceDescBufferSize) { |
217 | 0 | DataLength = mDeviceDescBufferSize; |
218 | 0 | } |
219 | 0 | CopyMem (Data, mDeviceDescBuffer, DataLength); |
220 | 0 | } else { |
221 | 0 | if (DataLength > sizeof(mDeviceDesc)) { |
222 | 0 | DataLength = sizeof(mDeviceDesc); |
223 | 0 | } |
224 | 0 | CopyMem (Data, &mDeviceDesc, DataLength); |
225 | 0 | } |
226 | 0 | break; |
227 | 350 | case USB_DESC_TYPE_CONFIG: |
228 | 350 | DEBUG ((DEBUG_INFO, "CONFIG - 0x%x\n", DataLength)); |
229 | 350 | if (mConfigDescBuffer != NULL) { |
230 | 350 | if (DataLength > mConfigDescBufferSize) { |
231 | 174 | DataLength = mConfigDescBufferSize; |
232 | 174 | } |
233 | 350 | CopyMem (Data, mConfigDescBuffer, DataLength); |
234 | 350 | } else { |
235 | 0 | if (DataLength > sizeof(mConfigDesc)) { |
236 | 0 | DataLength = sizeof(mConfigDesc); |
237 | 0 | } |
238 | 0 | CopyMem (Data, &mConfigDesc, DataLength); |
239 | 0 | } |
240 | 350 | break; |
241 | 0 | case USB_DESC_TYPE_STRING: |
242 | 0 | DEBUG ((DEBUG_INFO, "STRING - 0x%x\n", DataLength)); |
243 | 0 | if (mStringDescBuffer != NULL) { |
244 | 0 | if (DataLength > mStringDescBufferSize) { |
245 | 0 | DataLength = mStringDescBufferSize; |
246 | 0 | } |
247 | 0 | CopyMem (Data, mStringDescBuffer, DataLength); |
248 | 0 | } else { |
249 | 0 | if (DataLength > sizeof(mStringDesc)) { |
250 | 0 | DataLength = sizeof(mStringDesc); |
251 | 0 | } |
252 | 0 | CopyMem (Data, &mStringDesc, DataLength); |
253 | 0 | } |
254 | 0 | break; |
255 | 350 | } |
256 | 350 | } |
257 | | |
258 | 350 | return EFI_SUCCESS; |
259 | 350 | } |
260 | | |
261 | | EFI_STATUS |
262 | | EFIAPI |
263 | | UsbIoPpiStubBulkTransfer ( |
264 | | IN EFI_PEI_SERVICES **PeiServices, |
265 | | IN PEI_USB_IO_PPI *This, |
266 | | IN UINT8 DeviceEndpoint, |
267 | | IN OUT VOID *Data, |
268 | | IN OUT UINTN *DataLength, |
269 | | IN UINTN Timeout |
270 | | ) |
271 | 0 | { |
272 | 0 | DEBUG ((DEBUG_INFO, "USB_STUB: BulkTransfer\n")); |
273 | 0 | return EFI_UNSUPPORTED; |
274 | 0 | } |
275 | | |
276 | | EFI_STATUS |
277 | | EFIAPI |
278 | | UsbIoPpiStubGetInterfaceDescriptor ( |
279 | | IN EFI_PEI_SERVICES **PeiServices, |
280 | | IN PEI_USB_IO_PPI *This, |
281 | | IN EFI_USB_INTERFACE_DESCRIPTOR **InterfaceDescriptor |
282 | | ) |
283 | 0 | { |
284 | 0 | DEBUG ((DEBUG_INFO, "USB_STUB: GetInterfaceDescriptor\n")); |
285 | 0 | return EFI_UNSUPPORTED; |
286 | 0 | } |
287 | | |
288 | | EFI_STATUS |
289 | | EFIAPI |
290 | | UsbIoPpiStubGetEndpointDescriptor ( |
291 | | IN EFI_PEI_SERVICES **PeiServices, |
292 | | IN PEI_USB_IO_PPI *This, |
293 | | IN UINT8 EndpointIndex, |
294 | | IN EFI_USB_ENDPOINT_DESCRIPTOR **EndpointDescriptor |
295 | | ) |
296 | 0 | { |
297 | 0 | DEBUG ((DEBUG_INFO, "USB_STUB: GetEndpointDescriptor\n")); |
298 | 0 | return EFI_UNSUPPORTED; |
299 | 0 | } |
300 | | |
301 | | EFI_STATUS |
302 | | EFIAPI |
303 | | UsbIoPpiStubPortReset ( |
304 | | IN EFI_PEI_SERVICES **PeiServices, |
305 | | IN PEI_USB_IO_PPI *This |
306 | | ) |
307 | 0 | { |
308 | 0 | DEBUG ((DEBUG_INFO, "USB_IO_STUB: PortReset\n")); |
309 | 0 | return EFI_UNSUPPORTED; |
310 | 0 | } |
311 | | |
312 | | PEI_USB_IO_PPI mUsbIoPpiStub = { |
313 | | UsbIoPpiStubControlTransfer, |
314 | | UsbIoPpiStubBulkTransfer, |
315 | | UsbIoPpiStubGetInterfaceDescriptor, |
316 | | UsbIoPpiStubGetEndpointDescriptor, |
317 | | UsbIoPpiStubPortReset, |
318 | | }; |
319 | | |
320 | | EFI_STATUS |
321 | | EFIAPI |
322 | | UsbIoPpiStubInitialize ( |
323 | | IN VOID *DeviceDescBuffer, |
324 | | IN UINTN DeviceDescBufferSize, |
325 | | IN VOID *ConfigDescBuffer, |
326 | | IN UINTN ConfigDescBufferSize, |
327 | | IN VOID *StringDescBuffer, |
328 | | IN UINTN StringDescBufferSize, |
329 | | OUT PEI_USB_IO_PPI **UsbIoPpi |
330 | | ) |
331 | 193 | { |
332 | 193 | mDeviceDescBuffer = DeviceDescBuffer; |
333 | 193 | mDeviceDescBufferSize = DeviceDescBufferSize; |
334 | 193 | mConfigDescBuffer = ConfigDescBuffer; |
335 | 193 | mConfigDescBufferSize = ConfigDescBufferSize; |
336 | 193 | mStringDescBuffer = StringDescBuffer; |
337 | 193 | mStringDescBufferSize = StringDescBufferSize; |
338 | 193 | *UsbIoPpi = &mUsbIoPpiStub; |
339 | 193 | return EFI_SUCCESS; |
340 | 193 | } |