Coverage Report

Created: 2024-10-17 06:29

/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
}