Coverage Report

Created: 2025-12-05 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/hbfa-fl/HBFA/UefiHostFuzzTestCasePkg/TestCase/OvmfPkg/VirtioPciDeviceDxe/TestVirtioPciDevice.c
Line
Count
Source
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 <stdio.h>
9
#include <stdlib.h>
10
#include <string.h>
11
#include <assert.h>
12
13
#include <Uefi.h>
14
15
#include <Library/BaseLib.h>
16
#include <Library/DebugLib.h>
17
#include <Library/BaseMemoryLib.h>
18
#include <Library/MemoryAllocationLib.h>
19
#include <Library/VirtioPciDeviceStubLib.h>
20
#include <Library/PciCapPciIoLib.h>
21
#include <Library/PciCapLib.h>
22
23
2.80k
#define TOTAL_SIZE   (512 * 1024)
24
#define BLOCK_SIZE   (512)
25
#define IO_ALIGN     (1)
26
27
UINTN
28
EFIAPI
29
GetMaxBufferSize (
30
  VOID
31
  )
32
2.80k
{
33
2.80k
  return TOTAL_SIZE;
34
2.80k
}
35
36
EFI_STATUS
37
EFIAPI
38
ParseCapabilities (
39
  IN OUT VIRTIO_1_0_DEV *Device
40
  )
41
385
{
42
385
  EFI_STATUS   Status;
43
385
  PCI_CAP_DEV  *PciDevice;
44
385
  PCI_CAP_LIST *CapList;
45
385
  UINT16       VendorInstance;
46
385
  PCI_CAP      *VendorCap;
47
48
385
  Status = PciCapPciIoDeviceInit (Device->PciIo, &PciDevice);
49
385
  if (EFI_ERROR (Status)) {
50
0
    return Status;
51
0
  }
52
53
385
  Status = PciCapListInit (PciDevice, &CapList);
54
385
  if (EFI_ERROR (Status)) {
55
116
    goto UninitPciDevice;
56
116
  }
57
58
269
  for (VendorInstance = 0;
59
607
       !EFI_ERROR (PciCapListFindCap (CapList, PciCapNormal,
60
269
                     EFI_PCI_CAPABILITY_ID_VENDOR, VendorInstance,
61
269
                     &VendorCap));
62
385
       VendorInstance++) {
63
385
    UINT8             CapLen;
64
385
    VIRTIO_PCI_CAP    VirtIoCap;
65
385
    VIRTIO_1_0_CONFIG *ParsedConfig;
66
67
    //
68
    // Big enough to accommodate a VIRTIO_PCI_CAP structure?
69
    //
70
385
    Status = PciCapRead (PciDevice, VendorCap,
71
385
               OFFSET_OF (EFI_PCI_CAPABILITY_VENDOR_HDR, Length), &CapLen,
72
385
               sizeof CapLen);
73
385
    if (EFI_ERROR (Status)) {
74
0
      goto UninitCapList;
75
0
    }
76
385
    if (CapLen < sizeof VirtIoCap) {
77
      //
78
      // Too small, move to next.
79
      //
80
234
      continue;
81
234
    }
82
83
    //
84
    // Read interesting part of capability.
85
    //
86
151
    Status = PciCapRead (PciDevice, VendorCap, 0, &VirtIoCap, sizeof VirtIoCap);
87
151
    if (EFI_ERROR (Status)) {
88
36
      goto UninitCapList;
89
36
    }
90
91
115
    switch (VirtIoCap.ConfigType) {
92
31
    case VIRTIO_PCI_CAP_COMMON_CFG:
93
31
      ParsedConfig = &Device->CommonConfig;
94
31
      break;
95
40
    case VIRTIO_PCI_CAP_NOTIFY_CFG:
96
40
      ParsedConfig = &Device->NotifyConfig;
97
40
      break;
98
18
    case VIRTIO_PCI_CAP_DEVICE_CFG:
99
18
      ParsedConfig = &Device->SpecificConfig;
100
18
      break;
101
26
    default:
102
      //
103
      // Capability is not interesting.
104
      //
105
26
      continue;
106
115
    }
107
108
    //
109
    // Save the location of the register block into ParsedConfig.
110
    //
111
89
    Status = GetBarType (Device->PciIo, VirtIoCap.Bar, &ParsedConfig->BarType);
112
89
    if (EFI_ERROR (Status)) {
113
8
      goto UninitCapList;
114
8
    }
115
81
    ParsedConfig->Bar    = VirtIoCap.Bar;
116
81
    ParsedConfig->Offset = VirtIoCap.Offset;
117
81
    ParsedConfig->Length = VirtIoCap.Length;
118
119
81
    if (VirtIoCap.ConfigType == VIRTIO_PCI_CAP_NOTIFY_CFG) {
120
      //
121
      // This capability has an additional field called NotifyOffsetMultiplier;
122
      // parse it too.
123
      //
124
39
      if (CapLen < sizeof VirtIoCap + sizeof Device->NotifyOffsetMultiplier) {
125
        //
126
        // Too small, move to next.
127
        //
128
14
        continue;
129
14
      }
130
131
25
      Status = PciCapRead (PciDevice, VendorCap, sizeof VirtIoCap,
132
25
                 &Device->NotifyOffsetMultiplier,
133
25
                 sizeof Device->NotifyOffsetMultiplier);
134
25
      if (EFI_ERROR (Status)) {
135
3
        goto UninitCapList;
136
3
      }
137
25
    }
138
139
    //
140
    // Capability parsed successfully.
141
    //
142
64
    ParsedConfig->Exists = TRUE;
143
64
  }
144
145
222
  ASSERT_EFI_ERROR (Status);
146
147
269
UninitCapList:
148
269
  PciCapListUninit (CapList);
149
150
385
UninitPciDevice:
151
385
  PciCapPciIoDeviceUninit (PciDevice);
152
153
385
  return Status;
154
269
}
155
156
VOID
157
EFIAPI
158
RunTestHarness(
159
  IN VOID  *TestBuffer,
160
  IN UINTN TestBufferSize
161
  )
162
491
{
163
491
  VIRTIO_1_0_DEV         *VirtioPciDevice;
164
491
  EFI_STATUS             Status;
165
491
  EFI_PCI_IO_PROTOCOL    *PciIo;
166
167
491
  VirtioPciDevice = (VIRTIO_1_0_DEV *) AllocateZeroPool(sizeof (*VirtioPciDevice));
168
  
169
491
  PciIo = (EFI_PCI_IO_PROTOCOL *)AllocateZeroPool(sizeof (*PciIo));
170
171
491
  VirtioPciDevice->PciIo = PciIo; 
172
  
173
491
  Status = InitVirtioPciDevice (VirtioPciDevice, TestBuffer, TestBufferSize, PciIo);
174
  
175
491
  if (!EFI_ERROR(Status)) {
176
385
    ParseCapabilities (VirtioPciDevice);
177
385
  }
178
  
179
491
  FreePool (PciIo);
180
491
  FreePool (VirtioPciDevice);
181
491
}