mirror of https://github.com/acidanthera/audk.git
89 lines
2.2 KiB
C
89 lines
2.2 KiB
C
/*/@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 <Library/DebugLib.h>
|
|
#include <Library/QemuFwCfgLib.h>
|
|
|
|
#include <Library/HardwareInfoLib.h>
|
|
|
|
/**
|
|
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;
|
|
}
|