From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp-fw-80007.amazon.com (smtp-fw-80007.amazon.com [99.78.197.218]) by mx.groups.io with SMTP id smtpd.web12.14816.1642698741432010893 for ; Thu, 20 Jan 2022 09:12:21 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amazon.com header.s=amazon201209 header.b=t5Q9A1ZL; spf=pass (domain: amazon.de, ip: 99.78.197.218, mailfrom: prvs=012ed7d3b=ncoleon@amazon.de) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1642698742; x=1674234742; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=wKEa2mQB30ttIklD4jZl87QI6u8XFnHYG9QIPgPTJU0=; b=t5Q9A1ZL1vnnS1ZGXvrg4EAiIaZKvG4bZCWDoEAvCKV7KEHIrSLdKF0j YP9irynHmldV27HBT5QWB6DiI9vJWmNXn13OYF+VDNlc5z01KY7goxUyM AXQRzVUKHSaJvtecZyM8NjTBNqd7WUtZi+z+/pJzQFOpYtWBq76jO1xqx c=; X-IronPort-AV: E=Sophos;i="5.88,302,1635206400"; d="scan'208";a="56749850" Received: from pdx4-co-svc-p1-lb2-vlan2.amazon.com (HELO email-inbound-relay-iad-1e-90d70b14.us-east-1.amazon.com) ([10.25.36.210]) by smtp-border-fw-80007.pdx80.corp.amazon.com with ESMTP; 20 Jan 2022 17:12:04 +0000 Received: from EX13D49EUC003.ant.amazon.com (iad12-ws-svc-p26-lb9-vlan3.iad.amazon.com [10.40.163.38]) by email-inbound-relay-iad-1e-90d70b14.us-east-1.amazon.com (Postfix) with ESMTPS id 755ADC08CF; Thu, 20 Jan 2022 17:12:02 +0000 (UTC) Received: from ub4014a598e6c52.ant.amazon.com (10.43.162.8) by EX13D49EUC003.ant.amazon.com (10.43.164.91) with Microsoft SMTP Server (TLS) id 15.0.1497.28; Thu, 20 Jan 2022 17:11:59 +0000 From: "Ojeda Leon, Nicolas" To: CC: , Nicolas Ojeda Leon , Alexander Graf , Gerd Hoffmann Subject: [PATCH v2 2/8] Ovmf/HardwareInfoLib: Parse data directly from fw-cfg Date: Thu, 20 Jan 2022 18:10:15 +0100 Message-ID: <66b045d70f81c8e1a01269a13e55c5b47b7898c5.1642697671.git.ncoleon@amazon.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: MIME-Version: 1.0 X-Originating-IP: [10.43.162.8] X-ClientProxiedBy: EX13D12UWA004.ant.amazon.com (10.43.160.168) To EX13D49EUC003.ant.amazon.com (10.43.164.91) Content-Type: text/plain Create QemuFwCfgHardwareInfoLib which extends the base HardwareInfoLib and provide fw-cfg wrappers to read hardware info elements out of a fw-cfg file. The Hardware Info library is intended to describe non-discoverable hardware information and share that from the host to the guest in Ovmf platforms. The QEMU fw-cfg extension for this library provides a first variation to parse hardware info by reading it directly from a fw-cfg file. This library offers a wrapper function to the plain QmeuFwCfgReadBytes which, specifically, parses header-data pairs out of the binary values in the file. For this purpose, the approach is incremental, reading the file block by block and outputting the values only for a specific known hardware type (e.g. PCI host bridges). One element is returned in each call until the end of the file is reached. Considering fw-cfg as the first means to transport hardware info from the host to the guest, this wrapping library offers the possibility to statically, and in steps, read a specific type of hardware info elements out of the file. This method reads one hardware element of a specific type at a time, without the need to pre-allocate memory and read the whole file or dynamically allocate memory for each new element found. As a usage example, the static approach followed by this library enables early UEFI stages to use and read hardware information supplied by the host. For instance, in early times of the PEI stage, hardware information can be parsed out from a fw-cfg file prescinding from memory services, that may not yet be available, and avoiding dynamic memory allocations. Cc: Alexander Graf Cc: Gerd Hoffmann Signed-off-by: Nicolas Ojeda Leon --- .../Library/QemuFwCfgHardwareInfoLib.h | 59 ++++++++++++ .../QemuFwCfgHardwareInfoLib.c | 89 +++++++++++++++++++ .../QemuFwCfgHardwareInfoLib.inf | 42 +++++++++ OvmfPkg/OvmfPkgX64.dsc | 1 + 4 files changed, 191 insertions(+) create mode 100644 OvmfPkg/Include/Library/QemuFwCfgHardwareInfoLib.h create mode 100644 OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c create mode 100644 OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.inf diff --git a/OvmfPkg/Include/Library/QemuFwCfgHardwareInfoLib.h b/OvmfPkg/Include/Library/QemuFwCfgHardwareInfoLib.h new file mode 100644 index 0000000000..f6c351a4e4 --- /dev/null +++ b/OvmfPkg/Include/Library/QemuFwCfgHardwareInfoLib.h @@ -0,0 +1,59 @@ +/*/@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 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +#ifndef __QEMU_FW_CFG_HARDWARE_INFO_LIB_H__ +#define __QEMU_FW_CFG_HARDWARE_INFO_LIB_H__ + +#include "../Library/HardwareInfoLib/HardwareInfoTypesLib.h" + +/** + Read, if available, the next Type element in the FwCfg file. + The FwCfg item must already be selected, this is a wrapper around + QemuFwCfgReadBytes and the Data pointer should be set to an existent + memory location with TypeSize bytes allocated for the date to be + properly written. If a Type element is found in the file which has a + size (in the header) greater than TypeSize, it is skipped. + + @param[in] Type Hardware Info Type to search for + @param[in] TypeSize Size (in bytes) of the structure intended to + be used to dereference the data + @param[in] TotalFileSize Total size (in bytes) of the FwCfg file from + which the data is read. + @param[out] Data Pointer to a memory allocated instance into + which the data is written to. + @param[out] DataSize Size in bytes of the actually filled + data available in the Data object after a + successful operation + @param[inout] ReadIndex Index of the next byte to be read. Incremented + accordingly after a read operation to reflect + up to date status + + @retval EFI_SUCCESS Next element found and read into Data + @retval EFI_INVALID_PARAMETER Operation failed + @retval EFI_END_OF_FILE End of the file reached, no more elements + to read. +**/ +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 + ); + +#endif // __QEMU_FW_CFG_HARDWARE_INFO_LIB_H__ diff --git a/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c b/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c new file mode 100644 index 0000000000..059da546d1 --- /dev/null +++ b/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c @@ -0,0 +1,89 @@ +/*/@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 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +#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.Type.Value == Type) && (Header.Size <= TypeSize)) { + QemuFwCfgReadBytes (Header.Size, Data); + + *ReadIndex += Header.Size; + UpdateDataSize (DataSize, 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 (Header.Size); + *ReadIndex += Header.Size; + } + + return EFI_END_OF_FILE; +} diff --git a/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.inf b/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.inf new file mode 100644 index 0000000000..0a2eca3c00 --- /dev/null +++ b/OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.inf @@ -0,0 +1,42 @@ +## @file +# Hardware information library wrappers over Qemu fw-cfg functionality to parse, +# in a static manner, non-discoverable hardware information. +# +# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = QemuFwCfgHardwareInfoLib + FILE_GUID = 3D5011B3-9CBB-4C0B-88E8-1D758283C659 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = QemuFwCfgHardwareInfoLib + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = X64 +# + +[Sources] + QemuFwCfgHardwareInfoLib.c + HardwareInfoPciHostBridgeLib.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + DebugLib + QemuFwCfgLib diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 4589adff38..fb82fd02eb 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -175,6 +175,7 @@ SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.inf + QemuFwCfgHardwareInfoLib|OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.inf QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFwCfgSimpleParserLib.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf -- 2.17.1 Amazon Development Center Germany GmbH Krausenstr. 38 10117 Berlin Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B Sitz: Berlin Ust-ID: DE 289 237 879