From 611c7f1101267d53b039a04136e55f313c756c5c Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Fri, 24 Apr 2020 09:53:47 +0200 Subject: OvmfPkg: introduce QemuFwCfgSimpleParserLib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Cc: Jordan Justen Cc: Per Sundstrom Cc: Philippe Mathieu-Daudé Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2681 Signed-off-by: Laszlo Ersek Message-Id: <20200424075353.8489-2-lersek@redhat.com> Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Ard Biesheuvel --- OvmfPkg/Include/Library/QemuFwCfgSimpleParserLib.h | 128 +++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 OvmfPkg/Include/Library/QemuFwCfgSimpleParserLib.h (limited to 'OvmfPkg/Include/Library') diff --git a/OvmfPkg/Include/Library/QemuFwCfgSimpleParserLib.h b/OvmfPkg/Include/Library/QemuFwCfgSimpleParserLib.h new file mode 100644 index 0000000000..c6062bae87 --- /dev/null +++ b/OvmfPkg/Include/Library/QemuFwCfgSimpleParserLib.h @@ -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 + +/** + 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_ -- cgit v1.2.3