/*/@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; }