On Fri, Feb 21, 2014 at 3:58 PM, Laszlo Ersek <ler...@redhat.com> wrote:
> This small library allows the saving and loading of platform configuration
> to/from the non-volatile variable store.
>
> It provides a backend for EFI_HII_CONFIG_ACCESS_PROTOCOL (ie. setup forms)
> and for various DXE and UEFI drivers that depend on the platform
> configuration.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> ---
>  .../PlatformConfigLib/PlatformConfigLib.inf        |  36 +++++++
>  OvmfPkg/Include/Library/PlatformConfigLib.h        |  54 +++++++++++
>  .../Library/PlatformConfigLib/PlatformConfigLib.c  | 106 
> +++++++++++++++++++++
>  OvmfPkg/OvmfPkgIa32.dsc                            |   2 +
>  OvmfPkg/OvmfPkgIa32X64.dsc                         |   2 +
>  OvmfPkg/OvmfPkgX64.dsc                             |   2 +
>  6 files changed, 202 insertions(+)
>  create mode 100644 OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
>  create mode 100644 OvmfPkg/Include/Library/PlatformConfigLib.h
>  create mode 100644 OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.c
>
> diff --git a/OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf 
> b/OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
> new file mode 100644
> index 0000000..cffb60c
> --- /dev/null
> +++ b/OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
> @@ -0,0 +1,36 @@
> +## @file
> +# Library for serializing (persistently storing) and deserializing OVMF's
> +# platform configuration.
> +#
> +# Copyright (C) 2014, 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                    = 0x00010005
> +  BASE_NAME                      = PlatformConfigLib
> +  FILE_GUID                      = 30F126DF-CD18-4DDC-BE0A-1159540BCADF
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = PlatformConfigLib|DXE_DRIVER UEFI_DRIVER
> +
> +[Sources]
> +  PlatformConfigLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  OvmfPkg/OvmfPkg.dec
> +
> +[LibraryClasses]
> +  UefiRuntimeServicesTableLib
> +
> +[Guids]
> +  gOvmfPlatformConfigGuid
> diff --git a/OvmfPkg/Include/Library/PlatformConfigLib.h 
> b/OvmfPkg/Include/Library/PlatformConfigLib.h
> new file mode 100644
> index 0000000..d2c11a5
> --- /dev/null
> +++ b/OvmfPkg/Include/Library/PlatformConfigLib.h
> @@ -0,0 +1,54 @@
> +/** @file
> +
> +  Library for serializing (persistently storing) and deserializing OVMF's
> +  platform configuration.
> +
> +  Copyright (C) 2014, 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.
> +
> +**/
> +
> +#ifndef _PLATFORM_CONFIG_LIB_H_
> +#define _PLATFORM_CONFIG_LIB_H_
> +
> +#include <Base.h>
> +
> +//
> +// This structure participates in driver configuration and in communication
> +// with HII. It does not (necessarily) reflect the wire format in the
> +// persistent store.
> +//
> +#pragma pack(1)
> +typedef struct {
> +  //
> +  // preferred graphics console resolution when booting
> +  //
> +  UINT32 HorizontalResolution;
> +  UINT32 VerticalResolution;
> +} PLATFORM_CONFIG;
> +#pragma pack()
> +
> +//
> +// Please see the API documentation near the function definitions.
> +//
> +EFI_STATUS
> +EFIAPI
> +PlatformConfigSave (
> +  IN PLATFORM_CONFIG *PlatformConfig
> +  );
> +
> +EFI_STATUS
> +EFIAPI
> +PlatformConfigLoad (
> +  OUT PLATFORM_CONFIG *PlatformConfig,
> +  OUT UINT64          *OptionalElements
> +  );
> +
> +#endif // _PLATFORM_CONFIG_LIB_H_
> diff --git a/OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.c 
> b/OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.c
> new file mode 100644
> index 0000000..73c4bfc
> --- /dev/null
> +++ b/OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.c
> @@ -0,0 +1,106 @@
> +/** @file
> +
> +  Library for serializing (persistently storing) and deserializing OVMF's
> +  platform configuration.
> +
> +  Copyright (C) 2014, 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 <Library/PlatformConfigLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Guid/OvmfPlatformConfig.h>
> +
> +
> +//
> +// Name of the UEFI variable that we use for persistent storage.
> +//
> +STATIC CHAR16 mVariableName[] = L"PlatformConfig";
> +
> +
> +/**
> +  Serialize and persistently save platform configuration.
> +
> +  @param[in] PlatformConfig  The platform configuration to serialize and 
> save.
> +
> +  @return  Status codes returned by gRT->SetVariable().
> +**/
> +EFI_STATUS
> +EFIAPI
> +PlatformConfigSave (
> +  IN PLATFORM_CONFIG *PlatformConfig
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  //
> +  // We could implement any kind of translation here, as part of 
> serialization.
> +  // For example, we could expose the platform configuration in separate
> +  // variables with human-readable contents, allowing other tools to access
> +  // them more easily. For now, just save a binary dump.
> +  //
> +  Status = gRT->SetVariable (mVariableName, &gOvmfPlatformConfigGuid,
> +                  EFI_VARIABLE_NON_VOLATILE | 
> EFI_VARIABLE_BOOTSERVICE_ACCESS |
> +                    EFI_VARIABLE_RUNTIME_ACCESS,
> +                  sizeof *PlatformConfig, PlatformConfig);
> +  return Status;
> +}
> +
> +
> +/**
> +  Load and deserialize platform configuration.
> +
> +  When the function fails, output parameters are indeterminate.
> +
> +  @param[out] PlatformConfig    The platform configuration to receive the
> +                                loaded data.
> +
> +  @param[out] OptionalElements  This bitmap describes the presence of 
> optional
> +                                configuration elements.
> +
> +  @retval  EFI_SUCCESS         Loading & deserialization successful.
> +  @retval  EFI_PROTOCOL_ERROR  Invalid contents in persistent store.
> +  @return                      Error codes returned by gRT->GetVariable().
> +**/
> +EFI_STATUS
> +EFIAPI
> +PlatformConfigLoad (
> +  OUT PLATFORM_CONFIG *PlatformConfig,
> +  OUT UINT64          *OptionalElements
> +  )
> +{
> +  UINTN      DataSize;
> +  EFI_STATUS Status;
> +
> +  //
> +  // Any translation done in PlatformConfigSave() would have to be mirrored
> +  // here. For now, just load the binary dump.
> +  //
> +  // Versioning of the binary wire format can be implemented later on, based 
> on
> +  // size (only incremental changes, ie. new fields), and on GUID.
> +  // (Incompatible changes require a GUID change.)
> +  //
> +  DataSize = sizeof *PlatformConfig;
> +  Status = gRT->GetVariable (mVariableName, &gOvmfPlatformConfigGuid,
> +                  NULL /* Attributes */, &DataSize, PlatformConfig);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  //
> +  // No optional configuration elements are supported for the time being.
> +  //
> +  if (DataSize < sizeof *PlatformConfig) {
> +    return EFI_PROTOCOL_ERROR;
> +  }
> +  *OptionalElements = 0;
> +  return EFI_SUCCESS;
> +}

It seems like these functions don't take into account firmware
'upgrades' which might cause the size of PLATFORM_CONFIG to grow
compared to what is in the variable.

Unfortunately, dealing with that can be complicated. There are ways of
getting default values from HII to help out with this. Or, one can
pre-fill the structure with zeros and hope those are safe values.

Another potential concern: firmware downgrade, which can cause the
variable size to be larger than expected.

-Jordan

> diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
> index 78ab4e8..435a625 100644
> --- a/OvmfPkg/OvmfPkgIa32.dsc
> +++ b/OvmfPkg/OvmfPkgIa32.dsc
> @@ -226,6 +226,7 @@
>  !endif
>    PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
>    UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
> +  PlatformConfigLib|OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
>
>  [LibraryClasses.common.DXE_DRIVER]
>    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> @@ -244,6 +245,7 @@
>    DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
>    PlatformBdsLib|OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
>    
> CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
> +  PlatformConfigLib|OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
>
>  [LibraryClasses.common.UEFI_APPLICATION]
>    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
> index 9fbdf56..04896f1 100644
> --- a/OvmfPkg/OvmfPkgIa32X64.dsc
> +++ b/OvmfPkg/OvmfPkgIa32X64.dsc
> @@ -231,6 +231,7 @@
>  !endif
>    PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
>    UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
> +  PlatformConfigLib|OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
>
>  [LibraryClasses.common.DXE_DRIVER]
>    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> @@ -249,6 +250,7 @@
>    DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
>    PlatformBdsLib|OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
>    
> CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
> +  PlatformConfigLib|OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
>
>  [LibraryClasses.common.UEFI_APPLICATION]
>    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
> index 5776c0e..8dd11b8 100644
> --- a/OvmfPkg/OvmfPkgX64.dsc
> +++ b/OvmfPkg/OvmfPkgX64.dsc
> @@ -231,6 +231,7 @@
>  !endif
>    PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
>    UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
> +  PlatformConfigLib|OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
>
>  [LibraryClasses.common.DXE_DRIVER]
>    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> @@ -249,6 +250,7 @@
>    DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
>    PlatformBdsLib|OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
>    
> CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf
> +  PlatformConfigLib|OvmfPkg/Library/PlatformConfigLib/PlatformConfigLib.inf
>
>  [LibraryClasses.common.UEFI_APPLICATION]
>    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> --
> 1.8.3.1
>
>
>
> ------------------------------------------------------------------------------
> Managing the Performance of Cloud-Based Applications
> Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
> Read the Whitepaper.
> http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Flow-based real-time traffic analytics software. Cisco certified tool.
Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer
Customize your own dashboards, set traffic alerts and generate reports.
Network behavioral analysis & security monitoring. All-in-one tool.
http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to