]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) Fix a bug. Before this fix, a Module that calling UEFI HII Interface to get the...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 8 May 2008 08:57:58 +0000 (08:57 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 8 May 2008 08:57:58 +0000 (08:57 +0000)
2) Correct a few other minor issues.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5185 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c

index ab99d5d760613868c92ec27ba2a12e0358b31ef1..6a83c3a3b7a8a971c7d3676ca38a1bb1b21b9417 100644 (file)
@@ -120,7 +120,6 @@ GetBufferStorage  (
 EFI_STATUS\r
 InstallDefaultUefiConfigAccessProtocol (\r
   IN  CONST EFI_HII_PACKAGES                         *Packages,\r
-  OUT       EFI_HANDLE                               *Handle,\r
   IN  OUT   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
   )\r
 {\r
@@ -128,7 +127,7 @@ InstallDefaultUefiConfigAccessProtocol (
   EFI_STATUS                                  Status;\r
   HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigAccessInstance;\r
 \r
-  Status = HiiLibCreateHiiDriverHandle (Handle);\r
+  Status = HiiLibCreateHiiDriverHandle (&MapEntry->UefiHiiDriverHandle);\r
   ConfigAccessInstance = AllocateCopyPool (\r
                            sizeof (HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE), \r
                            &ConfigAccessProtocolInstanceTempate\r
@@ -147,7 +146,7 @@ InstallDefaultUefiConfigAccessProtocol (
   }\r
 \r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
-          Handle,\r
+          &MapEntry->UefiHiiDriverHandle,\r
           &gEfiHiiConfigAccessProtocolGuid,\r
           &ConfigAccessInstance->ConfigAccessProtocol,\r
           NULL\r
index d9abdcc1090f3a1dd534ee4d1d07f597462b16e7..365578344fd247e479c891c0a58099e5c685f516 100644 (file)
@@ -21,7 +21,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 EFI_STATUS\r
 InstallDefaultUefiConfigAccessProtocol (\r
   IN  CONST EFI_HII_PACKAGES                         *Packages,\r
-  OUT       EFI_HANDLE                               *Handle,\r
   IN  OUT   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
   )\r
 ;\r
index 53863d81143526af6a605fb1845858b6f1eaae3d..8eab0813e6c24ce4b9c54d5b8bd4a349c7cbc856 100644 (file)
@@ -136,6 +136,10 @@ AddPackNotify (
   Status  = EFI_SUCCESS;\r
   Private = mHiiThunkPrivateData;\r
 \r
+  if (mInFrameworkHiiNewPack) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
   //\r
   // We only create a MapEntry if the Uefi Hii Handle is only already registered\r
   // by the HII Thunk Layer.\r
@@ -252,6 +256,10 @@ RemovePackNotify (
   ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
   ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);\r
 \r
+  if (mInFrameworkHiiRemovePack) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
   Private = mHiiThunkPrivateData;\r
 \r
   MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, Handle);\r
index 64a8aeacaa0154baaf46aee342950917c09ef44e..6e9c28a8418b9c33bc23d97dc462b0c00530dd5a 100644 (file)
@@ -95,6 +95,7 @@ typedef struct {
   UINT32                    Signature;\r
   FRAMEWORK_EFI_HII_HANDLE  FrameworkHiiHandle;\r
   EFI_HII_HANDLE            UefiHiiHandle;\r
+  EFI_HANDLE                UefiHiiDriverHandle;\r
 \r
   BOOLEAN                   IsPackageListWithOnlyStringPackages;\r
   //\r
@@ -151,6 +152,7 @@ extern CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;
 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
 \r
 extern BOOLEAN                                    mInFrameworkHiiNewPack;\r
+extern BOOLEAN                                    mInFrameworkHiiRemovePack;\r
 \r
 \r
 //\r
index 9624e377f47608fb3f95f1506cfc888a51807c81..970d789368561d9a837d1fe3bcd864924577e06a 100644 (file)
@@ -17,6 +17,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "HiiDatabase.h"\r
 \r
 \r
+BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
+BOOLEAN mInFrameworkHiiRemovePack = FALSE;\r
+\r
+\r
 EFI_STATUS\r
 GetIfrAndStringPackNum (\r
   IN CONST EFI_HII_PACKAGES               *Packages,\r
@@ -196,7 +200,7 @@ AddStringPackagesToMatchingIfrPackageList (
 EFI_HII_PACKAGE_LIST_HEADER *\r
 PrepareUefiPackageListFromFrameworkHiiPackages (\r
   IN CONST EFI_HII_PACKAGES            *Packages,\r
-  IN CONST EFI_GUID                    *GuidId  OPTIONAL\r
+  IN CONST EFI_GUID                    *PackageListGuid\r
   )\r
 {\r
   UINTN                       NumberOfPackages;\r
@@ -208,6 +212,9 @@ PrepareUefiPackageListFromFrameworkHiiPackages (
   UINTN                       Index;\r
   TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
 \r
+  ASSERT (Packages != NULL);\r
+  ASSERT (PackageListGuid != NULL);\r
+\r
   TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) ((UINT8 *) &Packages->GuidId + sizeof (Packages->GuidId));\r
   NumberOfPackages = Packages->NumberOfPackages;\r
 \r
@@ -227,11 +234,8 @@ PrepareUefiPackageListFromFrameworkHiiPackages (
   PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);\r
   PackageListHeader = AllocateZeroPool (PackageListLength);\r
   ASSERT (PackageListHeader != NULL);\r
-  if (GuidId == NULL) {\r
-    CopyMem (&PackageListHeader->PackageListGuid, Packages->GuidId, sizeof (EFI_GUID));\r
-  } else {\r
-    CopyMem (&PackageListHeader->PackageListGuid, GuidId, sizeof (EFI_GUID));\r
-  }\r
+\r
+  CopyMem (&PackageListHeader->PackageListGuid, PackageListGuid, sizeof (EFI_GUID));\r
   PackageListHeader->PackageLength = PackageListLength;\r
 \r
   PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
@@ -324,9 +328,7 @@ UefiRegisterPackageList(
   EFI_HII_PACKAGE_LIST_HEADER *UefiPackageListHeader;\r
   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
   EFI_GUID                    GuidId;\r
-  EFI_HANDLE                  UefiHiiDriverHandle;\r
 \r
-  UefiHiiDriverHandle = NULL;\r
   UefiPackageListHeader = NULL;\r
 \r
   Status = GetIfrAndStringPackNum (Packages, &IfrPackNum, &StringPackNum);\r
@@ -355,6 +357,8 @@ UefiRegisterPackageList(
   if (Packages->GuidId == NULL) {\r
     Packages->GuidId = &GuidId;\r
     GenerateGuidId (&mAGuid, Packages->GuidId);\r
+  } else {\r
+    CopyGuid (&GuidId, Packages->GuidId);\r
   }\r
   \r
   CopyGuid (&HandleMappingEntry->TagGuid, Packages->GuidId);\r
@@ -373,13 +377,13 @@ UefiRegisterPackageList(
   // that Setup Utility can load the Buffer Storage using this protocol.\r
   //\r
   if (IfrPackNum != 0) {\r
-    InstallDefaultUefiConfigAccessProtocol (Packages, &UefiHiiDriverHandle, HandleMappingEntry);\r
+    InstallDefaultUefiConfigAccessProtocol (Packages, HandleMappingEntry);\r
   }\r
   UefiPackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &GuidId);\r
   Status = mHiiDatabase->NewPackageList (\r
               mHiiDatabase,\r
               UefiPackageListHeader,  \r
-              UefiHiiDriverHandle,\r
+              HandleMappingEntry->UefiHiiDriverHandle,\r
               &HandleMappingEntry->UefiHiiHandle\r
               );\r
   ASSERT_EFI_ERROR (Status);\r
@@ -438,7 +442,6 @@ Done:
   return Status;\r
 }\r
 \r
-BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -468,6 +471,7 @@ Returns:
 {\r
   EFI_STATUS                 Status;\r
   EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  EFI_TPL                    OldTpl;\r
 \r
   if (Handle == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -477,6 +481,8 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+  \r
   //\r
   // We use a simple Global variable to inform NewPackNotify\r
   // that the package list registered here is already registered\r
@@ -495,6 +501,8 @@ Returns:
 \r
   mInFrameworkHiiNewPack = FALSE;\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
@@ -518,41 +526,54 @@ Returns:
   EFI_STATUS                 Status;\r
   EFI_HII_THUNK_PRIVATE_DATA *Private;\r
   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
-  EFI_DEVICE_PATH_PROTOCOL   *Path;\r
+  EFI_TPL                    OldTpl;\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
+\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  mInFrameworkHiiRemovePack = TRUE;\r
 \r
   Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
   HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
 \r
-  if (HandleMapEntry->UefiHiiHandle != NULL) {\r
+  if (HandleMapEntry != NULL) {\r
     Status = mHiiDatabase->RemovePackageList (\r
                                           mHiiDatabase,\r
                                           HandleMapEntry->UefiHiiHandle\r
                                           );\r
     ASSERT_EFI_ERROR (Status);\r
 \r
+    HiiLibDestroyHiiDriverHandle (HandleMapEntry->UefiHiiHandle);\r
+\r
     Status = gBS->HandleProtocol (\r
-                    HandleMapEntry->UefiHiiHandle,\r
-                    &gEfiDevicePathProtocolGuid,\r
-                    &Path\r
+                    HandleMapEntry->UefiHiiDriverHandle,\r
+                    &gEfiHiiConfigAccessProtocolGuid,\r
+                    (VOID **) &ConfigAccess\r
                     );\r
 \r
     if (!EFI_ERROR (Status)) {\r
       Status = gBS->UninstallProtocolInterface (\r
-                      HandleMapEntry->UefiHiiHandle,\r
-                      &gEfiDevicePathProtocolGuid,\r
-                      Path\r
+                      HandleMapEntry->UefiHiiDriverHandle,\r
+                      &gEfiHiiConfigAccessProtocolGuid,\r
+                      ConfigAccess\r
                       );\r
-      if (!EFI_ERROR (Status)) {\r
-        FreePool (Path);\r
-      }\r
+      ASSERT_EFI_ERROR (Status);\r
+    } else {\r
+      Status = EFI_SUCCESS;\r
     }\r
 \r
     RemoveEntryList (&HandleMapEntry->List);\r
 \r
     FreePool (HandleMapEntry);\r
-    return Status;\r
+\r
+  }else {\r
+    Status = EFI_NOT_FOUND;\r
   }\r
 \r
-  return EFI_NOT_FOUND;\r
+  mInFrameworkHiiRemovePack = FALSE;\r
+  \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 }\r