]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
MdeModulePkg/DisplayEngine: Remove useless NULL ptr check for NewPos
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / Database.c
index 45448c5198ac804ddc0d15762b5b3adffeb312d3..b59a9b2965af10c527510a25089602473862de18 100644 (file)
@@ -21,11 +21,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 +903,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
@@ -3435,39 +3440,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
@@ -3526,11 +3498,14 @@ HiiNewPackageList (
     }\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 +3515,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 +3537,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 +3603,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 +3622,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 +3677,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 +3758,7 @@ HiiUpdatePackageList (
 \r
   Status = EFI_SUCCESS;\r
 \r
+  EfiAcquireLock (&mHiiDatabaseLock);\r
   //\r
   // Get original packagelist to be updated\r
   //\r
@@ -3777,6 +3800,7 @@ HiiUpdatePackageList (
         }\r
 \r
         if (EFI_ERROR (Status)) {\r
+          EfiReleaseLock (&mHiiDatabaseLock);\r
           return Status;\r
         }\r
 \r
@@ -3790,19 +3814,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