]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c
Ovmf/HardwareInfoLib: Create Pei lib to parse directly from fw-cfg
[mirror_edk2.git] / OvmfPkg / Library / HardwareInfoLib / QemuFwCfgHardwareInfoLib.c
CommitLineData
2b1a5b8c
NOL
1/*/@file\r
2 Qemu fw-cfg wrappers for hardware info parsing.\r
3 Provides an alternative to parse hardware information from a fw-cfg\r
4 file without relying on dynamic memory allocations.\r
5\r
6 Copyright 2021 - 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.\r
7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9**/\r
10\r
11#include <Library/DebugLib.h>\r
12#include <Library/QemuFwCfgLib.h>\r
13\r
14#include <Library/HardwareInfoLib.h>\r
15\r
16/**\r
17 Update an optional pointer value if possible\r
18\r
19 @param[out] DataSize Pointer to variable to be updated\r
20 @param[in] Value Value to set the pointed variable to.\r
21**/\r
22STATIC\r
23VOID\r
24UpdateDataSize (\r
25 OUT UINTN *DataSize,\r
26 IN UINTN Value\r
27 )\r
28{\r
29 if (DataSize == NULL) {\r
30 return;\r
31 }\r
32\r
33 *DataSize = Value;\r
34}\r
35\r
36EFI_STATUS\r
37QemuFwCfgReadNextHardwareInfoByType (\r
38 IN HARDWARE_INFO_TYPE Type,\r
39 IN UINTN TypeSize,\r
40 IN UINTN TotalFileSize,\r
41 OUT VOID *Data,\r
42 OUT UINTN *DataSize OPTIONAL,\r
43 IN OUT UINTN *ReadIndex\r
44 )\r
45{\r
46 HARDWARE_INFO_HEADER Header;\r
47\r
48 if ((Data == NULL) ||\r
49 (ReadIndex == NULL) ||\r
50 (TypeSize == 0) ||\r
51 (Type == HardwareInfoTypeUndefined) ||\r
52 (TotalFileSize == 0))\r
53 {\r
54 return EFI_INVALID_PARAMETER;\r
55 }\r
56\r
57 UpdateDataSize (DataSize, 0);\r
58\r
59 while (*ReadIndex < TotalFileSize) {\r
60 QemuFwCfgReadBytes (sizeof (Header), &Header);\r
61 *ReadIndex += sizeof (Header);\r
62\r
63 if ((Header.Size > MAX_UINTN) || (((UINT64)*ReadIndex + Header.Size) > TotalFileSize)) {\r
64 *ReadIndex = TotalFileSize;\r
65 return EFI_ABORTED;\r
66 }\r
67\r
68 if ((Header.Type.Value == Type) && (Header.Size <= TypeSize)) {\r
69 QemuFwCfgReadBytes ((UINTN)Header.Size, Data);\r
70\r
71 *ReadIndex += (UINTN)Header.Size;\r
72 UpdateDataSize (DataSize, (UINTN)Header.Size);\r
73\r
74 return EFI_SUCCESS;\r
75 }\r
76\r
77 //\r
78 // Skip the bytes corresponding to the next element as it is\r
79 // not of the expected type and/or size. The TotalFileSize\r
80 // and individual elements sizes should match so the size\r
81 // check is skipped.\r
82 //\r
83 QemuFwCfgSkipBytes ((UINTN)Header.Size);\r
84 *ReadIndex += (UINTN)Header.Size;\r
85 }\r
86\r
87 return EFI_END_OF_FILE;\r
88}\r