From 7ab26d51808bd4ffab2510091b062a91cf6a8c81 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Wed, 11 Apr 2018 20:58:58 +0200 Subject: [PATCH] EmbeddedPkg: introduce NvVarStoreFormattedLib Some platforms don't format a variable store template at build time; instead they format the non-volatile varstore flash chip during boot, dynamically. Introduce NvVarStoreFormattedLib to enable such platforms to delay the "variable read" service drivers until the platform specific module(s) report that the variable store has been formatted. The platform-specific module that performs the formatting during startup is usually an FVB or MM FVB driver. Under the proposed scheme, it becomes responsible for installing gEdkiiNvVarStoreFormattedGuid with a NULL interface in the protocol database. In turn, the platform DSC will hook NvVarStoreFormattedLib into the variable service driver, to make the latter wait for the FVB driver. Platforms that need not delay the variable service driver like this may still use the same FVB driver; gEdkiiNvVarStoreFormattedGuid will simply be ignored. Cc: Ard Biesheuvel Cc: Leif Lindholm Cc: Steve Capper Cc: Supreeth Venkatesh Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek Reviewed-by: Ard Biesheuvel Tested-by: Steve Capper Reviewed-by: Leif Lindholm --- EmbeddedPkg/EmbeddedPkg.dec | 3 ++ .../Include/Guid/NvVarStoreFormatted.h | 39 ++++++++++++++ .../NvVarStoreFormattedLib.c | 41 +++++++++++++++ .../NvVarStoreFormattedLib.inf | 52 +++++++++++++++++++ 4 files changed, 135 insertions(+) create mode 100644 EmbeddedPkg/Include/Guid/NvVarStoreFormatted.h create mode 100644 EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.c create mode 100644 EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.inf diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec index e48ce2e95b..c7b134dd34 100644 --- a/EmbeddedPkg/EmbeddedPkg.dec +++ b/EmbeddedPkg/EmbeddedPkg.dec @@ -67,6 +67,9 @@ # HII form set GUID for ConsolePrefDxe driver gConsolePrefFormSetGuid = { 0x2d2358b4, 0xe96c, 0x484d, { 0xb2, 0xdd, 0x7c, 0x2e, 0xdf, 0xc7, 0xd5, 0x6f } } + ## Include/Guid/NvVarStoreFormatted.h + gEdkiiNvVarStoreFormattedGuid = { 0xd1a86e3f, 0x0707, 0x4c35, { 0x83, 0xcd, 0xdc, 0x2c, 0x29, 0xc8, 0x91, 0xa3 } } + [Protocols.common] gHardwareInterruptProtocolGuid = { 0x2890B3EA, 0x053D, 0x1643, { 0xAD, 0x0C, 0xD6, 0x48, 0x08, 0xDA, 0x3F, 0xF1 } } gHardwareInterrupt2ProtocolGuid = { 0x32898322, 0x2da1, 0x474a, { 0xba, 0xaa, 0xf3, 0xf7, 0xcf, 0x56, 0x94, 0x70 } } diff --git a/EmbeddedPkg/Include/Guid/NvVarStoreFormatted.h b/EmbeddedPkg/Include/Guid/NvVarStoreFormatted.h new file mode 100644 index 0000000000..4e057e4d89 --- /dev/null +++ b/EmbeddedPkg/Include/Guid/NvVarStoreFormatted.h @@ -0,0 +1,39 @@ +/** @file + EDKII NvVarStore Formatted GUID + + A NULL protocol instance with this GUID in the DXE and/or MM protocol + databases, and/or a NULL PPI with this GUID in the PPI database, implies that + a DXE or MM driver, or a PEIM, has verified (or dynamically ensured) that the + non-volatile variable store has valid and consistent headers + (EFI_FIRMWARE_VOLUME_HEADER and VARIABLE_STORE_HEADER). + + Said predicate is required by the read-only variable PEIM, and the read side + of the runtime variable DXE and MM drivers, immediately after they are + dispatched. This GUID presents platforms with one way to coordinate between + their module(s) that format the variable store FVB device and the variable + service drivers. + + Copyright (C) 2018, Red Hat, Inc. + + This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that 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 __EDKII_NV_VAR_STORE_FORMATTED_H__ +#define __EDKII_NV_VAR_STORE_FORMATTED_H__ + +#define EDKII_NV_VAR_STORE_FORMATTED_GUID \ + { \ + 0xd1a86e3f, 0x0707, 0x4c35, \ + { 0x83, 0xcd, 0xdc, 0x2c, 0x29, 0xc8, 0x91, 0xa3 } \ + } + +extern EFI_GUID gEdkiiNvVarStoreFormattedGuid; + +#endif diff --git a/EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.c b/EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.c new file mode 100644 index 0000000000..001e47cfe8 --- /dev/null +++ b/EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.c @@ -0,0 +1,41 @@ +/** @file + A hook-in library for: + - MdeModulePkg/Universal/Variable/Pei/VariablePei.inf + - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf + - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf + + Plugging this library instance into one of the above modules makes that + variable service backend wait for another platform module to dynamically + initialize or verify EFI_FIRMWARE_VOLUME_HEADER and VARIABLE_STORE_HEADER in + the non-volatile variable store FVB device. The initialization / verification + is signaled by installing gEdkiiNvVarStoreFormattedGuid into the + phase-matching PPI or protocol database, with a NULL interface. (Note that + installing gEdkiiNvVarStoreFormattedGuid into either the DXE or the MM + protocol database will unblock VariableSmm -- refer to EFI_SECTION_MM_DEPEX + in the PI spec.) + + Copyright (C) 2018, Red Hat, Inc. + + 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 + +RETURN_STATUS +EFIAPI +NvVarStoreFormattedInitialize ( + VOID + ) +{ + // + // Do nothing, just imbue VariablePei / VariableRuntimeDxe / VariableSmm with + // a PPI or protocol dependency on EDKII_NV_VAR_STORE_FORMATTED_GUID. + // + return RETURN_SUCCESS; +} diff --git a/EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.inf b/EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.inf new file mode 100644 index 0000000000..b02fc78109 --- /dev/null +++ b/EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.inf @@ -0,0 +1,52 @@ +## @file +# A hook-in library for: +# - MdeModulePkg/Universal/Variable/Pei/VariablePei.inf +# - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf +# - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf +# +# Plugging this library instance into one of the above modules makes that +# variable service backend wait for another platform module to dynamically +# initialize or verify EFI_FIRMWARE_VOLUME_HEADER and VARIABLE_STORE_HEADER in +# the non-volatile variable store FVB device. The initialization / verification +# is signaled by installing gEdkiiNvVarStoreFormattedGuid into the +# phase-matching PPI or protocol database, with a NULL interface. (Note that +# installing gEdkiiNvVarStoreFormattedGuid into either the DXE or the MM +# protocol database will unblock VariableSmm -- refer to EFI_SECTION_MM_DEPEX +# in the PI spec.) +# +# Copyright (C) 2018, Red Hat, Inc. +# +# 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 = 1.27 + BASE_NAME = NvVarStoreFormattedLib + FILE_GUID = 78f76ae8-ae62-4455-8148-c3a7ebaaa3f3 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NvVarStoreFormattedLib|PEIM DXE_RUNTIME_DRIVER DXE_SMM_DRIVER + CONSTRUCTOR = NvVarStoreFormattedInitialize + +[Sources] + NvVarStoreFormattedLib.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +# +# The matching DEPEX section below will generate the EFI_SECTION_PEI_DEPEX, +# EFI_SECTION_DXE_DEPEX or EFI_SECTION_MM_DEPEX leaf section for the PEIM +# (EFI_FV_FILETYPE_PEIM), DXE_RUNTIME_DRIVER (EFI_FV_FILETYPE_DRIVER), or +# DXE_SMM_DRIVER (EFI_FV_FILETYPE_MM) module, respectively. +# +[Depex.common.PEIM, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] + gEdkiiNvVarStoreFormattedGuid -- 2.39.2