/** @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
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
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
\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
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
\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
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
//\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
*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
return EFI_NOT_FOUND;\r
}\r
\r
+ EfiAcquireLock (&mHiiDatabaseLock);\r
+\r
Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
\r
//\r
//\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
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
\r
Status = EFI_SUCCESS;\r
\r
+ EfiAcquireLock (&mHiiDatabaseLock);\r
//\r
// Get original packagelist to be updated\r
//\r
}\r
\r
if (EFI_ERROR (Status)) {\r
+ EfiReleaseLock (&mHiiDatabaseLock);\r
return Status;\r
}\r
\r
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
@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