OvmfPkg: introduce QemuFwCfgSimpleParserLib

We already parse some boolean and integer values from named fw_cfg files
(usually into PCDs), and we're going to cover more. Add a dedicated
library for centralizing the parsing logic.

Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Per Sundstrom <per_sundstrom@yahoo.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2681
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20200424075353.8489-2-lersek@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
This commit is contained in:
Laszlo Ersek
2020-04-24 09:53:47 +02:00
committed by mergify[bot]
parent 64ab457d1f
commit 611c7f1101
7 changed files with 560 additions and 0 deletions

View File

@ -0,0 +1,128 @@
/** @file
Parse the contents of named fw_cfg files as simple (scalar) data types.
Copyright (C) 2020, Red Hat, Inc.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef QEMU_FW_CFG_SIMPLE_PARSER_LIB_H_
#define QEMU_FW_CFG_SIMPLE_PARSER_LIB_H_
#include <Base.h>
/**
Look up FileName with QemuFwCfgFindFile() from QemuFwCfgLib. Read the fw_cfg
file into a small array with automatic storage duration. Parse the array as
the textual representation of a BOOLEAN.
@param[in] FileName The name of the fw_cfg file to look up and parse.
@param[out] Value On success, Value is TRUE if the contents of the fw_cfg
file case-insensitively match "true", "yes", "y",
"enable", "enabled", "1".
On success, Value is FALSE if the contents of the fw_cfg
file case-insensitively match "false", "no", "n",
"disable", "disabled", "0".
On failure, Value is not changed.
@retval RETURN_SUCCESS Parsing successful. Value has been set.
@retval RETURN_UNSUPPORTED Firmware configuration is unavailable.
@retval RETURN_PROTOCOL_ERROR Parsing failed. Value has not been changed.
@return Error codes propagated from
QemuFwCfgFindFile(). Value has not been
changed.
**/
RETURN_STATUS
EFIAPI
QemuFwCfgParseBool (
IN CONST CHAR8 *FileName,
OUT BOOLEAN *Value
);
/**
Look up FileName with QemuFwCfgFindFile() from QemuFwCfgLib. Read the fw_cfg
file into a small array with automatic storage duration. Parse the array as
the textual representation of a UINT8.
@param[in] FileName The name of the fw_cfg file to look up and parse.
@param[in] ParseAsHex If TRUE, call BaseLib's AsciiStrHexToUint64S() for
parsing the fw_cfg file.
If FALSE, call BaseLib's AsciiStrDecimalToUint64S()
for parsing the fw_cfg file.
@param[out] Value On success, Value has been parsed with the BaseLib
function determined by ParseAsHex, and also
range-checked for [0, MAX_UINT8].
On failure, Value is not changed.
@retval RETURN_SUCCESS Parsing successful. Value has been set.
@retval RETURN_UNSUPPORTED Firmware configuration is unavailable.
@retval RETURN_PROTOCOL_ERROR Parsing failed. Value has not been changed.
@retval RETURN_PROTOCOL_ERROR Parsing succeeded, but the result does not fit
in the [0, MAX_UINT8] range. Value has not
been changed.
@return Error codes propagated from
QemuFwCfgFindFile() and from the BaseLib
function selected by ParseAsHex. Value has not
been changed.
**/
RETURN_STATUS
EFIAPI
QemuFwCfgParseUint8 (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT8 *Value
);
//
// The following functions behave identically to QemuFwCfgParseUint8(),
// only their range checks use MAX_UINT16, MAX_UINT32, MAX_UINT64, MAX_UINTN,
// respectively.
//
RETURN_STATUS
EFIAPI
QemuFwCfgParseUint16 (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT16 *Value
);
RETURN_STATUS
EFIAPI
QemuFwCfgParseUint32 (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT32 *Value
);
RETURN_STATUS
EFIAPI
QemuFwCfgParseUint64 (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT64 *Value
);
RETURN_STATUS
EFIAPI
QemuFwCfgParseUintn (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINTN *Value
);
#endif // QEMU_FW_CFG_SIMPLE_PARSER_LIB_H_