Aaron,

This patch just follow UEFI spec 2.5 chapter 31.2.11.1 description to enable 
this feature. I think in OS environment, OS utility can just partial change the 
configuration data. We can't export config access protocol to OS environment.

Thanks,
Eric
From: aaron....@congatec.com [mailto:aaron....@congatec.com]
Sent: Wednesday, December 23, 2015 2:27 AM
To: Dong, Eric
Cc: Bi, Dandan; edk2-devel@lists.01.org; edk2-devel; Gao, Liming; 
El-Haj-Mahmoud, Samer
Subject: Re: [edk2] [patch] MdeModulePkg:Make HII configuration settings 
available to OS runtime

I have a question about this.   Making the Hii Configuration data available to 
the OS at run time only exports the data from the Hii database.  It does not 
make the Hii Configuration Access protocols (or their callback functions) 
available to the OS?  So if a 3rd party OpRom was making using of their own Hii 
Configuration Access protocols and using callbacks to prevent specific 
combinations of configurations, then that would not be caught by an OS based 
setup browser?  Additionally, shouldn't an OS based setup browser have the 
problem of retrieving the current configuration data since it would need to use 
the config access protocols?

Best Regards,
Aaron



From:        "Dong, Eric" <eric.d...@intel.com<mailto:eric.d...@intel.com>>
To:        "El-Haj-Mahmoud, Samer" 
<samer.el-haj-mahm...@hpe.com<mailto:samer.el-haj-mahm...@hpe.com>>, "Bi, 
Dandan" <dandan...@intel.com<mailto:dandan...@intel.com>>, 
"edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>" 
<edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>>,
Cc:        "Gao, Liming" <liming....@intel.com<mailto:liming....@intel.com>>
Date:        12/21/2015 05:29 PM
Subject:        Re: [edk2] [patch] MdeModulePkg:Make HII        configuration   
     settings        available to OS runtime
Sent by:        "edk2-devel" 
<edk2-devel-boun...@lists.01.org<mailto:edk2-devel-boun...@lists.01.org>>
________________________________



Yes, all the Hii database data will be export. Also the ConfigResp string for 
all HII drivers.

-----Original Message-----
From: El-Haj-Mahmoud, Samer [mailto:samer.el-haj-mahm...@hpe.com]
Sent: Tuesday, December 22, 2015 9:25 AM
To: Dong, Eric; Bi, Dandan; 
edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
Cc: Gao, Liming
Subject: RE: [edk2] [patch] MdeModulePkg:Make HII configuration settings 
available to OS runtime

Does this also export all string packages?

-----Original Message-----
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Dong, 
Eric
Sent: Monday, December 21, 2015 8:22 PM
To: Bi, Dandan <dandan...@intel.com<mailto:dandan...@intel.com>>; 
edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
Cc: Gao, Liming <liming....@intel.com<mailto:liming....@intel.com>>
Subject: Re: [edk2] [patch] MdeModulePkg:Make HII configuration settings 
available to OS runtime

Reviewed-by: Eric Dong <eric.d...@intel.com<mailto:eric.d...@intel.com>>

-----Original Message-----
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Dandan Bi
Sent: Monday, December 21, 2015 4:45 PM
To: edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
Cc: Dong, Eric; Gao, Liming
Subject: [edk2] [patch] MdeModulePkg:Make HII configuration settings available 
to OS runtime

This feature is aimed to allow OS make use of the HII database during runtime.
In this case, the contents of the HII Database is exported to a buffer.
The pointer to the buffer is placed in the EFI System Configuration Table, 
where it can be retrieved by an OS application.

Cc: Liming Gao <liming....@intel.com<mailto:liming....@intel.com>>
Cc: Eric Dong <eric.d...@intel.com<mailto:eric.d...@intel.com>>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Dandan Bi <dandan...@intel.com<mailto:dandan...@intel.com>>
---
MdeModulePkg/Universal/HiiDatabaseDxe/Database.c   | 102 ++++++++++++++++++++-
.../Universal/HiiDatabaseDxe/HiiDatabase.h         |   5 +
.../Universal/HiiDatabaseDxe/HiiDatabaseEntry.c    |  51 +++++++++++
3 files changed, 157 insertions(+), 1 deletion(-)

diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c 
b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
index ec56795..011e712 100644
--- a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
+++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
@@ -2773,10 +2773,96 @@ ExportPackageList (
  *UsedSize += ResultSize + sizeof (EFI_HII_PACKAGE_HEADER);

  return EFI_SUCCESS;
}

+/**
+This is an internal function,mainly use to get and update configuration 
settings information.
+
+@param  This            A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
+@param  NewPackage      Indaicate whether add the packages in the package list 
to the database.
+
+@retval EFI_SUCCESS     Get the information successfully.
+
+**/
+EFI_STATUS
+HiiGetConfigurationSetting(
+  IN CONST EFI_HII_DATABASE_PROTOCOL        *This,
+  IN BOOLEAN                                NewPackage
+  )
+{
+  EFI_STATUS                          Status;
+  HII_DATABASE_PRIVATE_DATA           *Private;
+  EFI_HII_PACKAGE_LIST_HEADER         *DatabaseInfo;
+  EFI_STRING                          ConfigAltResp;
+  UINTN                               DatabaseInfoSize;
+  UINTN                               ConfigLen;
+
+  DatabaseInfo         = NULL;
+  ConfigAltResp        = NULL;
+  DatabaseInfoSize     = 0;
+  ConfigLen            = 0;
+
+  Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);
+
+  //
+  // Get the length of the buffer that is required for the exported data.
+  //
+
+  Status = HiiExportPackageLists(This, NULL, &DatabaseInfoSize,
+ DatabaseInfo);  if (Status == EFI_BUFFER_TOO_SMALL) {
+    if (gRTDatabaseInfoBuffer == NULL){
+      gRTDatabaseInfoBuffer = AllocateRuntimePool (DatabaseInfoSize);
+    } else if (DatabaseInfoSize != gDatabaseInfoSize ) {
+      if (NewPackage){
+        gBS->InstallConfigurationTable (&gEfiHiiDatabaseProtocolGuid, NULL);
+      }
+      gRTDatabaseInfoBuffer = 
ReallocateRuntimePool(gDatabaseInfoSize,DatabaseInfoSize,gRTDatabaseInfoBuffer);
+    }
+    ASSERT (gRTDatabaseInfoBuffer != NULL);
+
+    gDatabaseInfoSize = DatabaseInfoSize;
+
+    //
+    //install it to configuration table.
+    //
+    if (NewPackage){
+      gBS->InstallConfigurationTable (&gEfiHiiDatabaseProtocolGuid, 
gRTDatabaseInfoBuffer);
+    }
+  }
+
+  //
+  // Get ConfigResp string
+  //
+  Status =
+ HiiConfigRoutingExportConfig(&Private->ConfigRouting,&ConfigAltResp);
+  if (!EFI_ERROR (Status)){
+    ConfigLen = StrLen(ConfigAltResp);
+    if (gRTConfigRespBuffer == NULL){
+      gRTConfigRespBuffer = AllocateRuntimePool ((ConfigLen + 1) * sizeof 
(CHAR16));
+    } else if (ConfigLen != gConfigLen ){
+      if (NewPackage){
+        gBS->InstallConfigurationTable (&gEfiHiiConfigRoutingProtocolGuid, 
NULL);
+      }
+      gRTConfigRespBuffer = ReallocateRuntimePool((gConfigLen + 1) * sizeof 
(CHAR16),(ConfigLen + 1) * sizeof (CHAR16),gRTConfigRespBuffer);
+    }
+    ASSERT (gRTConfigRespBuffer != NULL);
+
+    gConfigLen = ConfigLen;
+
+    //
+    //install it to configuration table.
+    //
+    if (NewPackage){
+      gBS->InstallConfigurationTable (&gEfiHiiConfigRoutingProtocolGuid, 
gRTConfigRespBuffer);
+    }
+
+    FreePool(ConfigAltResp);
+  }
+
+  return EFI_SUCCESS;
+
+}

/**
  This function adds the packages in the package list to the database and 
returns a handle. If there is a
  EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function 
will
  create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the 
package list.
@@ -2865,10 +2951,18 @@ HiiNewPackageList (
    Status = AddDevicePathPackage (Private, EFI_HII_DATABASE_NOTIFY_NEW_PACK, 
DevicePath, DatabaseRecord);
    ASSERT_EFI_ERROR (Status);
  }

  *Handle = DatabaseRecord->Handle;
+
+  //
+  // Get the configuration setting info.
+  // And install it to configuration table.
+  //
+
+  HiiGetConfigurationSetting(This,TRUE);
+
  return EFI_SUCCESS;
}


/**
@@ -3077,11 +3171,17 @@ HiiUpdatePackageList (
      }

      //
      // Add all of the packages within the new package list
      //
-      return AddPackages (Private, EFI_HII_DATABASE_NOTIFY_ADD_PACK, 
PackageList, Node);
+      Status = AddPackages (Private, EFI_HII_DATABASE_NOTIFY_ADD_PACK, 
PackageList, Node);
+      //
+      // Update the the configuration setting info
+      //
+      HiiGetConfigurationSetting(This,FALSE);
+
+      return Status;
    }
  }

  return EFI_NOT_FOUND;
}
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h 
b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h
index bb0090a..1be508b 100644
--- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h
+++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h
@@ -2017,6 +2017,11 @@ GetSupportedLanguages (

//
// Global variables
//
extern EFI_EVENT gHiiKeyboardLayoutChanged;
+extern EFI_HII_PACKAGE_LIST_HEADER *gRTDatabaseInfoBuffer; extern
+EFI_STRING gRTConfigRespBuffer; extern UINTN gDatabaseInfoSize; extern
+UINTN gConfigLen;
+
#endif
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseEntry.c 
b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseEntry.c
index 6448c97..c35655c 100644
--- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseEntry.c
+++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseEntry.c
@@ -18,10 +18,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
EXPRESS OR IMPLIED.

//
// Global variables
//
EFI_EVENT gHiiKeyboardLayoutChanged;
+EFI_EVENT mExitBootServicesEvent = (EFI_EVENT)NULL;
+
+EFI_HII_PACKAGE_LIST_HEADER    *gRTDatabaseInfoBuffer = NULL;
+EFI_STRING                     gRTConfigRespBuffer    = NULL;
+UINTN                          gDatabaseInfoSize = 0;
+UINTN                          gConfigLen = 0;

HII_DATABASE_PRIVATE_DATA mPrivate = {
  HII_DATABASE_PRIVATE_DATA_SIGNATURE,
  {
    (LIST_ENTRY *) NULL,
@@ -122,10 +128,43 @@ KeyboardLayoutChangeNullEvent (  {
  return;
}

/**
+  Callback function for ExitBootServices.
+
+  @param  Event                 Event whose notification function is being 
invoked.
+  @param  Context               The pointer to the notification function's 
context,
+                                which is implementation-dependent.
+
+**/
+VOID
+EFIAPI
+ExitBootServicesCallback (
+  IN EFI_EVENT                Event,
+  IN VOID                     *Context
+  )
+{
+  EFI_STATUS                          Status;
+
+  //
+  //export the contents of the HII Database and the current
+ configuration into  runtime buffer  //  Status =
+ HiiExportPackageLists(&mPrivate.HiiDatabase, NULL, &gDatabaseInfoSize,
+ gRTDatabaseInfoBuffer);  ASSERT_EFI_ERROR (Status);
+
+  Status =
+ HiiConfigRoutingExportConfig(&mPrivate.ConfigRouting,&gRTConfigRespBuf
+ fer);
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Install the package list and configuration date to configuration table.
+  //
+  gBS->InstallConfigurationTable (&gEfiHiiDatabaseProtocolGuid,
+gRTDatabaseInfoBuffer);
+  gBS->InstallConfigurationTable (&gEfiHiiConfigRoutingProtocolGuid,
+gRTConfigRespBuffer); }
+
+/**
  Initialize HII Database.


  @param ImageHandle     The image handle.
  @param SystemTable     The system table.
@@ -177,10 +216,22 @@ InitializeHiiDatabase (
                  );
  if (EFI_ERROR (Status)) {
    return Status;
  }

+  //
+  // Create a event with EVT_SIGNAL_EXIT_BOOT_SERVICES type.
+  //
+  Status = gBS->CreateEvent (
+                  EVT_SIGNAL_EXIT_BOOT_SERVICES,
+                  TPL_CALLBACK,
+                  ExitBootServicesCallback,
+                  NULL,
+                  &mExitBootServicesEvent
+                  );
+  ASSERT_EFI_ERROR (Status);
+
  Handle = NULL;
  Status = gBS->InstallMultipleProtocolInterfaces (
                  &Handle,
                  &gEfiHiiFontProtocolGuid,
                  &mPrivate.HiiFont,
--
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to