X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=OvmfPkg%2FLibrary%2FHardwareInfoLib%2FQemuFwCfgHardwareInfoLib.c;fp=OvmfPkg%2FLibrary%2FHardwareInfoLib%2FQemuFwCfgHardwareInfoLib.c;h=48d9dcd8ad0edb129ef2299a9f9b5b7e59addca5;hp=0000000000000000000000000000000000000000;hb=2b1a5b8c613301311113e1efc6fc65478e2e6365;hpb=6c9f218bc0d967bea99b139e190a11b703de4d6c diff --git a/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c b/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c new file mode 100644 index 0000000000..48d9dcd8ad --- /dev/null +++ b/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c @@ -0,0 +1,88 @@ +/*/@file + Qemu fw-cfg wrappers for hardware info parsing. + Provides an alternative to parse hardware information from a fw-cfg + file without relying on dynamic memory allocations. + + Copyright 2021 - 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +#include + +/** + Update an optional pointer value if possible + + @param[out] DataSize Pointer to variable to be updated + @param[in] Value Value to set the pointed variable to. +**/ +STATIC +VOID +UpdateDataSize ( + OUT UINTN *DataSize, + IN UINTN Value + ) +{ + if (DataSize == NULL) { + return; + } + + *DataSize = Value; +} + +EFI_STATUS +QemuFwCfgReadNextHardwareInfoByType ( + IN HARDWARE_INFO_TYPE Type, + IN UINTN TypeSize, + IN UINTN TotalFileSize, + OUT VOID *Data, + OUT UINTN *DataSize OPTIONAL, + IN OUT UINTN *ReadIndex + ) +{ + HARDWARE_INFO_HEADER Header; + + if ((Data == NULL) || + (ReadIndex == NULL) || + (TypeSize == 0) || + (Type == HardwareInfoTypeUndefined) || + (TotalFileSize == 0)) + { + return EFI_INVALID_PARAMETER; + } + + UpdateDataSize (DataSize, 0); + + while (*ReadIndex < TotalFileSize) { + QemuFwCfgReadBytes (sizeof (Header), &Header); + *ReadIndex += sizeof (Header); + + if ((Header.Size > MAX_UINTN) || (((UINT64)*ReadIndex + Header.Size) > TotalFileSize)) { + *ReadIndex = TotalFileSize; + return EFI_ABORTED; + } + + if ((Header.Type.Value == Type) && (Header.Size <= TypeSize)) { + QemuFwCfgReadBytes ((UINTN)Header.Size, Data); + + *ReadIndex += (UINTN)Header.Size; + UpdateDataSize (DataSize, (UINTN)Header.Size); + + return EFI_SUCCESS; + } + + // + // Skip the bytes corresponding to the next element as it is + // not of the expected type and/or size. The TotalFileSize + // and individual elements sizes should match so the size + // check is skipped. + // + QemuFwCfgSkipBytes ((UINTN)Header.Size); + *ReadIndex += (UINTN)Header.Size; + } + + return EFI_END_OF_FILE; +}