]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / Database.c
index e8f4564e6478e3b2f10fc18bb249f438c6b3b662..6da0e30c989fbc6c882900984ed298f9db293a35 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
 Implementation for EFI_HII_DATABASE_PROTOCOL.\r
 \r
-Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -21,11 +15,16 @@ EFI_HII_PACKAGE_LIST_HEADER    *gRTDatabaseInfoBuffer = NULL;
 EFI_STRING                     gRTConfigRespBuffer    = NULL;\r
 UINTN                          gDatabaseInfoSize = 0;\r
 UINTN                          gConfigRespSize = 0;\r
-BOOLEAN                        gExportConfigResp = TRUE;\r
+BOOLEAN                        gExportConfigResp = FALSE;\r
 UINTN                          gNvDefaultStoreSize = 0;\r
 SKU_ID                         gSkuId              = 0xFFFFFFFFFFFFFFFF;\r
 LIST_ENTRY                     gVarStorageList     = INITIALIZE_LIST_HEAD_VARIABLE (gVarStorageList);\r
 \r
+//\r
+// HII database lock.\r
+//\r
+EFI_LOCK mHiiDatabaseLock = EFI_INITIALIZE_LOCK_VARIABLE(TPL_NOTIFY);\r
+\r
 /**\r
   This function generates a HII_DATABASE_RECORD node and adds into hii database.\r
   This is a internal function.\r
@@ -898,7 +897,7 @@ UpdateDefaultSettingInFormPackage (
       IfrScope         = IfrOpHdr->Scope;\r
       IfrQuestionType  = IfrOpHdr->OpCode;\r
       IfrQuestionHdr   = (EFI_IFR_QUESTION_HEADER *) (IfrOpHdr + 1);\r
-      IfrCheckBox      = (EFI_IFR_CHECKBOX *) (IfrOpHdr + 1);\r
+      IfrCheckBox      = (EFI_IFR_CHECKBOX *) IfrOpHdr;\r
       EfiVarStoreIndex = IsEfiVarStoreQuestion (IfrQuestionHdr, EfiVarStoreList, EfiVarStoreNumber);\r
       Width            = sizeof (BOOLEAN);\r
       if (EfiVarStoreIndex < EfiVarStoreNumber) {\r
@@ -1431,7 +1430,7 @@ Error:
 \r
 /**\r
  Adjust all string packages in a single package list to have the same max string ID.\r
\r
+\r
  @param  PackageList        Pointer to a package list which will be adjusted.\r
 \r
  @retval EFI_SUCCESS  Adjust all string packages successfully.\r
@@ -3154,7 +3153,7 @@ AddPackages (
     PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);\r
     CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
   }\r
-  \r
+\r
   //\r
   // Adjust String Package to make sure all string packages have the same max string ID.\r
   //\r
@@ -3435,39 +3434,6 @@ HiiGetDatabaseInfo(
 \r
 }\r
 \r
-/**\r
-This  function mainly use to get and update configuration settings information.\r
-\r
-@param  This                   A pointer to the EFI_HII_DATABASE_PROTOCOL instance.\r
-\r
-@retval EFI_SUCCESS            Get the information successfully.\r
-@retval EFI_OUT_OF_RESOURCES   Not enough memory to store the Configuration Setting data.\r
-\r
-**/\r
-EFI_STATUS\r
-HiiGetConfigurationSetting(\r
-  IN CONST EFI_HII_DATABASE_PROTOCOL        *This\r
-  )\r
-{\r
-  EFI_STATUS                          Status;\r
-\r
-  //\r
-  // Get the HiiDatabase info.\r
-  //\r
-  Status = HiiGetDatabaseInfo(This);\r
-\r
-  //\r
-  // Get ConfigResp string\r
-  //\r
-  if (gExportConfigResp) {\r
-    Status = HiiGetConfigRespInfo (This);\r
-    gExportConfigResp = FALSE;\r
-  }\r
-  return Status;\r
-\r
-}\r
-\r
-\r
 /**\r
   This function adds the packages in the package list to the database and returns a handle. If there is a\r
   EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will\r
@@ -3520,17 +3486,20 @@ HiiNewPackageList (
     DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
     if (CompareGuid (\r
           &(DatabaseRecord->PackageList->PackageListHdr.PackageListGuid),\r
-          &PackageListGuid) && \r
+          &PackageListGuid) &&\r
         DatabaseRecord->DriverHandle == DriverHandle) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
   }\r
 \r
+  EfiAcquireLock (&mHiiDatabaseLock);\r
+\r
   //\r
   // Build a PackageList node\r
   //\r
   Status = GenerateHiiDatabaseRecord (Private, &DatabaseRecord);\r
   if (EFI_ERROR (Status)) {\r
+    EfiReleaseLock (&mHiiDatabaseLock);\r
     return Status;\r
   }\r
 \r
@@ -3540,6 +3509,7 @@ HiiNewPackageList (
   //\r
   Status = AddPackages (Private, EFI_HII_DATABASE_NOTIFY_NEW_PACK, PackageList, DatabaseRecord);\r
   if (EFI_ERROR (Status)) {\r
+    EfiReleaseLock (&mHiiDatabaseLock);\r
     return Status;\r
   }\r
 \r
@@ -3561,11 +3531,28 @@ HiiNewPackageList (
   *Handle = DatabaseRecord->Handle;\r
 \r
   //\r
-  // Check whether need to get the Database and configuration setting info.\r
+  // Check whether need to get the Database info.\r
   // Only after ReadyToBoot, need to do the export.\r
   //\r
   if (gExportAfterReadyToBoot) {\r
-    HiiGetConfigurationSetting(This);\r
+    HiiGetDatabaseInfo (This);\r
+  }\r
+  EfiReleaseLock (&mHiiDatabaseLock);\r
+\r
+  //\r
+  // Notes:\r
+  // HiiGetDatabaseInfo () will get the contents of HII data base,\r
+  // belong to the atomic behavior of Hii Database update.\r
+  // And since HiiGetConfigRespInfo () will get the configuration setting info from HII drivers\r
+  // we can not think it belong to the atomic behavior of Hii Database update.\r
+  // That's why EfiReleaseLock (&mHiiDatabaseLock) is callled before HiiGetConfigRespInfo ().\r
+  //\r
+\r
+  // Check whether need to get the configuration setting info from HII drivers.\r
+  // When after ReadyToBoot and need to do the export for form package add.\r
+  //\r
+  if (gExportAfterReadyToBoot && gExportConfigResp) {\r
+    HiiGetConfigRespInfo (This);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -3610,6 +3597,8 @@ HiiRemovePackageList (
     return EFI_NOT_FOUND;\r
   }\r
 \r
+  EfiAcquireLock (&mHiiDatabaseLock);\r
+\r
   Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   //\r
@@ -3627,34 +3616,42 @@ HiiRemovePackageList (
       //\r
       Status = RemoveGuidPackages (Private, Handle, PackageList);\r
       if (EFI_ERROR (Status)) {\r
+        EfiReleaseLock (&mHiiDatabaseLock);\r
         return Status;\r
       }\r
       Status = RemoveFormPackages (Private, Handle, PackageList);\r
       if (EFI_ERROR (Status)) {\r
+        EfiReleaseLock (&mHiiDatabaseLock);\r
         return Status;\r
       }\r
       Status = RemoveKeyboardLayoutPackages (Private, Handle, PackageList);\r
       if (EFI_ERROR (Status)) {\r
+        EfiReleaseLock (&mHiiDatabaseLock);\r
         return Status;\r
       }\r
       Status = RemoveStringPackages (Private, Handle, PackageList);\r
       if (EFI_ERROR (Status)) {\r
+        EfiReleaseLock (&mHiiDatabaseLock);\r
         return Status;\r
       }\r
       Status = RemoveFontPackages (Private, Handle, PackageList);\r
       if (EFI_ERROR (Status)) {\r
+        EfiReleaseLock (&mHiiDatabaseLock);\r
         return Status;\r
       }\r
       Status = RemoveImagePackages (Private, Handle, PackageList);\r
       if (EFI_ERROR (Status)) {\r
+        EfiReleaseLock (&mHiiDatabaseLock);\r
         return Status;\r
       }\r
       Status = RemoveSimpleFontPackages (Private, Handle, PackageList);\r
       if (EFI_ERROR (Status)) {\r
+        EfiReleaseLock (&mHiiDatabaseLock);\r
         return Status;\r
       }\r
       Status = RemoveDevicePathPackage (Private, Handle, PackageList);\r
       if (EFI_ERROR (Status)) {\r
+        EfiReleaseLock (&mHiiDatabaseLock);\r
         return Status;\r
       }\r
 \r
@@ -3674,16 +3671,35 @@ HiiRemovePackageList (
       FreePool (Node);\r
 \r
       //\r
-      // Check whether need to get the Database and configuration setting info.\r
+      // Check whether need to get the Database info.\r
       // Only after ReadyToBoot, need to do the export.\r
       //\r
       if (gExportAfterReadyToBoot) {\r
-        HiiGetConfigurationSetting(This);\r
+        HiiGetDatabaseInfo (This);\r
+      }\r
+      EfiReleaseLock (&mHiiDatabaseLock);\r
+\r
+      //\r
+      // Notes:\r
+      // HiiGetDatabaseInfo () will get the contents of HII data base,\r
+      // belong to the atomic behavior of Hii Database update.\r
+      // And since HiiGetConfigRespInfo () will get the configuration setting info from HII drivers\r
+      // we can not think it belong to the atomic behavior of Hii Database update.\r
+      // That's why EfiReleaseLock (&mHiiDatabaseLock) is callled before HiiGetConfigRespInfo ().\r
+      //\r
+\r
+      //\r
+      // Check whether need to get the configuration setting info from HII drivers.\r
+      // When after ReadyToBoot and need to do the export for form package remove.\r
+      //\r
+      if (gExportAfterReadyToBoot && gExportConfigResp) {\r
+        HiiGetConfigRespInfo (This);\r
       }\r
       return EFI_SUCCESS;\r
     }\r
   }\r
 \r
+  EfiReleaseLock (&mHiiDatabaseLock);\r
   return EFI_NOT_FOUND;\r
 }\r
 \r
@@ -3736,6 +3752,7 @@ HiiUpdatePackageList (
 \r
   Status = EFI_SUCCESS;\r
 \r
+  EfiAcquireLock (&mHiiDatabaseLock);\r
   //\r
   // Get original packagelist to be updated\r
   //\r
@@ -3777,6 +3794,7 @@ HiiUpdatePackageList (
         }\r
 \r
         if (EFI_ERROR (Status)) {\r
+          EfiReleaseLock (&mHiiDatabaseLock);\r
           return Status;\r
         }\r
 \r
@@ -3790,19 +3808,35 @@ HiiUpdatePackageList (
       Status = AddPackages (Private, EFI_HII_DATABASE_NOTIFY_ADD_PACK, PackageList, Node);\r
 \r
       //\r
-      // Check whether need to get the Database and configuration setting info.\r
+      // Check whether need to get the Database info.\r
       // Only after ReadyToBoot, need to do the export.\r
       //\r
-      if (gExportAfterReadyToBoot) {\r
-        if (Status == EFI_SUCCESS){\r
-          HiiGetConfigurationSetting(This);\r
-        }\r
+      if (gExportAfterReadyToBoot && Status == EFI_SUCCESS) {\r
+        HiiGetDatabaseInfo (This);\r
+      }\r
+      EfiReleaseLock (&mHiiDatabaseLock);\r
+\r
+      //\r
+      // Notes:\r
+      // HiiGetDatabaseInfo () will get the contents of HII data base,\r
+      // belong to the atomic behavior of Hii Database update.\r
+      // And since HiiGetConfigRespInfo () will get the configuration setting info from HII drivers\r
+      // we can not think it belong to the atomic behavior of Hii Database update.\r
+      // That's why EfiReleaseLock (&mHiiDatabaseLock) is callled before HiiGetConfigRespInfo ().\r
+      //\r
+\r
+      //\r
+      // Check whether need to get the configuration setting info from HII drivers.\r
+      // When after ReadyToBoot and need to do the export for form package update.\r
+      //\r
+      if (gExportAfterReadyToBoot && gExportConfigResp && Status == EFI_SUCCESS) {\r
+        HiiGetConfigRespInfo (This);\r
       }\r
 \r
       return Status;\r
     }\r
   }\r
-\r
+  EfiReleaseLock (&mHiiDatabaseLock);\r
   return EFI_NOT_FOUND;\r
 }\r
 \r
@@ -3992,7 +4026,7 @@ HiiListPackageLists (
   @retval EFI_NOT_FOUND          The specified Handle could not be found in the\r
                                  current database.\r
   @retval EFI_INVALID_PARAMETER  BufferSize was NULL.\r
-  @retval EFI_INVALID_PARAMETER  The value referenced by BufferSize was not zero \r
+  @retval EFI_INVALID_PARAMETER  The value referenced by BufferSize was not zero\r
                                  and Buffer was NULL.\r
 \r
 **/\r