LIST_ENTRY *Link;\r
EFI_STATUS Status;\r
\r
+ Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
+ if (IsNull (&ConfigAccess->BufferStorageListHead, Link)) {\r
+ return NULL;\r
+ }\r
+ \r
IfrDataArray = AllocateZeroPool (0x100);\r
ASSERT (IfrDataArray != NULL);\r
\r
- Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
- ASSERT (!IsNull (&ConfigAccess->BufferStorageListHead, Link));\r
- \r
BufferStorageEntry = BUFFER_STORAGE_ENTRY_FROM_LINK(Link);\r
BrowserDataSize = BufferStorageEntry->Size;\r
\r
IN BOOLEAN NvMapAllocated\r
)\r
{\r
- if (NvMapAllocated) {\r
- FreePool (Array->NvRamMap);\r
- }\r
+ if (Array != NULL) {\r
+ if (NvMapAllocated) {\r
+ FreePool (Array->NvRamMap);\r
+ }\r
\r
- FreePool (Array);\r
+ FreePool (Array);\r
+ }\r
}\r
\r
\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
}\r
\r
+\r
DestroyIfrDataArray (Data, NvMapAllocated);\r
\r
return Status;\r
#\r
\r
[Sources.common]\r
+ HiiHandle.c\r
+ HiiHandle.h\r
ConfigAccess.c\r
ConfigAccess.h\r
OpcodeCreation.c\r
**/\r
\r
#include "HiiDatabase.h"\r
+#include "HiiHandle.h"\r
\r
HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
\r
HiiGetKeyboardLayout\r
},\r
\r
- //\r
- //StaticHiiHandle\r
- //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
- // and increase upwords untill reach the value of StaticPureUefiHiiHandle. \r
- // The code will assert to prevent overflow.\r
- (FRAMEWORK_EFI_HII_HANDLE) 1,\r
-\r
- //\r
- //StaticPureUefiHiiHandle\r
- //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF \r
- // and decrease downwords untill reach the value of StaticHiiHandle. \r
- // The code will assert to prevent overflow.\r
- //\r
- (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF,\r
{\r
NULL, NULL //HiiHandleLinkList\r
},\r
UINTN BufferLength;\r
EFI_HII_HANDLE *Buffer;\r
UINTN Index;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
\r
\r
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
ASSERT (Private != NULL);\r
InitializeListHead (&Private->ThunkContextListHead);\r
\r
+ InitHiiHandleDatabase ();\r
+\r
mHiiThunkPrivateData = Private;\r
\r
Status = gBS->LocateProtocol (\r
Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
if (Status == EFI_SUCCESS) {\r
for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
- CreateThunkContextForUefiHiiHandle (Private, Buffer[Index]);\r
- ASSERT_EFI_ERROR (Status);\r
+ ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]);\r
+ ASSERT (ThunkContext!= NULL);\r
+ \r
+ InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
}\r
\r
FreePool (Buffer);\r
UINTN Signature;\r
EFI_HANDLE Handle;\r
EFI_HII_PROTOCOL Hii;\r
- FRAMEWORK_EFI_HII_HANDLE StaticHiiHandle;\r
- FRAMEWORK_EFI_HII_HANDLE StaticPureUefiHiiHandle;\r
\r
//\r
// The head of link list for all HII_THUNK_CONTEXT.\r
UINTN IfrPackageCount;\r
UINTN StringPackageCount;\r
\r
+ BOOLEAN ByFrameworkHiiNewPack;\r
+\r
//\r
// The field below is only valid if IsPackageListWithOnlyStringPack is TRUE.\r
// The HII 0.92 version of HII data implementation in EDK 1.03 and 1.04 make an the following assumption\r
--- /dev/null
+/**@file\r
+ Framework HII handle database allocation and deallocation functins.\r
+ \r
+Copyright (c) 2008, Intel Corporation\r
+All rights reserved. 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
+\r
+**/\r
+\r
+\r
+#include "HiiHandle.h"\r
+\r
+//\r
+// FRAMEWORK_EFI_HII_HANDLE\r
+//\r
+UINT8 mHandle[1024 * 8] = {0};\r
+\r
+VOID\r
+InitHiiHandleDatabase (\r
+ VOID\r
+ )\r
+{\r
+ //\r
+ // FRAMEWORK_EFI_HII_HANDLE 0 is reserved.\r
+ // Set Bit 0 in mHandle[0] to 1.\r
+ //\r
+ mHandle[0] |= 1 << 0;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+AllocateHiiHandle (\r
+ FRAMEWORK_EFI_HII_HANDLE *Handle\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ for (Index = 0; Index < sizeof (mHandle) * 8; Index++) {\r
+ if ((mHandle[Index / 8] & (1 << (Index % 8))) == 0) {\r
+ mHandle[Index / 8] |= (1 << (Index % 8));\r
+ *Handle = (FRAMEWORK_EFI_HII_HANDLE) Index;\r
+ ASSERT (*Handle != 0);\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+ \r
+ return EFI_OUT_OF_RESOURCES;\r
+}\r
+\r
+VOID\r
+FreeHiiHandle (\r
+ FRAMEWORK_EFI_HII_HANDLE Handle\r
+ )\r
+{\r
+ UINT16 Num;\r
+\r
+ Num = (UINT16) Handle;\r
+\r
+ ASSERT ((mHandle [Num / 8] & (~(1 << (Num % 8)))) != 0);\r
+ mHandle [Num / 8] &= (~(1 << (Num % 8)));\r
+}\r
--- /dev/null
+/**@file\r
+\r
+ This file contains utility functions by HII Thunk Modules.\r
+ \r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. 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
+\r
+**/\r
+\r
+#ifndef _HII_HANDLE_H\r
+#define _HII_HANDLE_H\r
+\r
+#include <FrameworkDxe.h>\r
+#include <Protocol/FrameworkHii.h>\r
+#include <Library/DebugLib.h>\r
+\r
+VOID\r
+InitHiiHandleDatabase (\r
+ VOID\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+AllocateHiiHandle (\r
+ FRAMEWORK_EFI_HII_HANDLE *Handle\r
+);\r
+ \r
+\r
+VOID\r
+FreeHiiHandle (\r
+ FRAMEWORK_EFI_HII_HANDLE Handle\r
+);\r
+\r
+\r
+#endif\r
+\r
\r
\r
#include "HiiDatabase.h"\r
+#include "HiiHandle.h"\r
\r
\r
STATIC BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
\r
}\r
\r
-HII_THUNK_CONTEXT *\r
-CreateThunkContext (\r
- IN HII_THUNK_PRIVATE_DATA *Private,\r
- IN UINTN StringPackageCount,\r
- IN UINTN IfrPackageCount\r
- )\r
-{\r
- EFI_STATUS Status;\r
- HII_THUNK_CONTEXT *ThunkContext;\r
-\r
- ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
- ASSERT (ThunkContext != NULL);\r
- \r
- ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
- ThunkContext->IfrPackageCount = IfrPackageCount;\r
- ThunkContext->StringPackageCount = StringPackageCount;\r
- Status = AssignFrameworkHiiHandle (Private, TRUE, &ThunkContext->FwHiiHandle);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
- InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
-\r
-\r
- return ThunkContext;\r
- \r
-}\r
-\r
-VOID\r
-FreeFrameworkHiiHandle (\r
- IN HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FwHandle\r
- )\r
-{\r
- //\r
- // TODO: \r
- //\r
- \r
- return;\r
-}\r
-\r
-VOID\r
-DestoryOneOfOptionMap (\r
- IN LIST_ENTRY *OneOfOptionMapListHead\r
- )\r
-{\r
- ONE_OF_OPTION_MAP *Map;\r
- ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
- LIST_ENTRY *Link;\r
- LIST_ENTRY *Link2;\r
-\r
- while (!IsListEmpty (OneOfOptionMapListHead)) {\r
- Link = GetFirstNode (OneOfOptionMapListHead);\r
- \r
- Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
-\r
- while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
- Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
- \r
- MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
-\r
- RemoveEntryList (Link2);\r
\r
- FreePool (MapEntry);\r
- }\r
-\r
- RemoveEntryList (Link);\r
- FreePool (Map);\r
- }\r
-}\r
-\r
-VOID\r
-DestroyQuestionIdMap (\r
- IN LIST_ENTRY *QuestionIdMapListHead\r
- )\r
-{\r
- QUESTION_ID_MAP *IdMap;\r
- QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
- LIST_ENTRY *Link;\r
- LIST_ENTRY *Link2;\r
-\r
- while (!IsListEmpty (QuestionIdMapListHead)) {\r
- Link = GetFirstNode (QuestionIdMapListHead);\r
- \r
- IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
-\r
- while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
- Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
- \r
- IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
-\r
- RemoveEntryList (Link2);\r
-\r
- FreePool (IdMapEntry);\r
- }\r
-\r
- RemoveEntryList (Link);\r
- FreePool (IdMap);\r
- }\r
-}\r
-\r
-VOID\r
-DestroyThunkContext (\r
- IN HII_THUNK_PRIVATE_DATA *Private,\r
- IN HII_THUNK_CONTEXT *ThunkContext\r
- )\r
-{\r
- ASSERT (ThunkContext != NULL);\r
-\r
- FreeFrameworkHiiHandle (Private, ThunkContext->FwHiiHandle);\r
-\r
- DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
-\r
- DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
-\r
- FreePool (ThunkContext);\r
-}\r
\r
CONST EFI_GUID mAGuid = \r
{ 0x14f95e01, 0xd562, 0x432e, { 0x84, 0x4a, 0x95, 0xa4, 0x39, 0x5, 0x10, 0x7e } };\r
if (ThunkContext == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
-\r
+ ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
+ \r
if (Packages->GuidId == NULL) {\r
//\r
// UEFI HII Database require Package List GUID must be unique.\r
\r
Done:\r
if (EFI_ERROR (Status)) {\r
- DestroyThunkContext (Private, ThunkContext);\r
+ DestroyThunkContext (ThunkContext);\r
} else {\r
InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
*Handle = ThunkContext->FwHiiHandle;\r
\r
RemoveEntryList (&ThunkContext->Link);\r
\r
- DestroyThunkContext (Private, ThunkContext);\r
+ DestroyThunkContext (ThunkContext);\r
}else {\r
Status = EFI_NOT_FOUND;\r
}\r
//\r
ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
if (ThunkContext == NULL) {\r
- ThunkContext = CreateThunkContextForUefiHiiHandle (Private, Handle);\r
+ ThunkContext = CreateThunkContextForUefiHiiHandle (Handle);\r
ASSERT (ThunkContext != NULL);\r
+\r
+ InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
} \r
\r
\r
\r
ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
\r
- if (ThunkContext->FwHiiHandle > Private->StaticHiiHandle) {\r
+ if (!ThunkContext->ByFrameworkHiiNewPack) {\r
if (IsRemovingLastStringPack (Handle)) {\r
//\r
// If the string package will be removed is the last string package\r
// in the package list, we will remove the HII Thunk entry from the\r
// database.\r
//\r
- Status = DestroyThunkContextForUefiHiiHandle (Private, Handle);\r
+ DestroyThunkContextForUefiHiiHandle (Private, Handle);\r
}\r
}\r
\r
\r
\r
#include "HiiDatabase.h"\r
+#include "HiiHandle.h"\r
\r
EFI_GUID gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
\r
}\r
\r
-BOOLEAN\r
-IsFrameworkHiiDatabaseHandleDepleted (\r
- IN CONST HII_THUNK_PRIVATE_DATA *Private\r
- )\r
-{\r
- return (BOOLEAN) (Private->StaticHiiHandle == (UINTN) Private->StaticPureUefiHiiHandle);\r
-}\r
-\r
-EFI_STATUS\r
-AssignFrameworkHiiHandle (\r
- IN OUT HII_THUNK_PRIVATE_DATA *Private,\r
- IN BOOLEAN FromFwHiiNewPack,\r
- OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
- )\r
-{\r
- ASSERT (Handle != NULL);\r
-\r
- if (FromFwHiiNewPack) {\r
-\r
- *Handle = Private->StaticHiiHandle;\r
- Private->StaticHiiHandle += 1;\r
-\r
- if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
\r
- } else {\r
-\r
- *Handle = Private->StaticPureUefiHiiHandle;\r
- Private->StaticPureUefiHiiHandle -= 1;\r
- \r
- if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
+VOID\r
DestroyThunkContextForUefiHiiHandle (\r
IN HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_HANDLE UefiHiiHandle\r
ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
ASSERT (ThunkContext != NULL);\r
\r
- ASSERT (IsListEmpty (&ThunkContext->OneOfOptionMapListHead));\r
- ASSERT (IsListEmpty (&ThunkContext->QuestionIdMapListHead));\r
- \r
- RemoveEntryList (&ThunkContext->Link);\r
-\r
- FreePool (ThunkContext);\r
- \r
- return EFI_SUCCESS;\r
+ DestroyThunkContext (ThunkContext);\r
}\r
\r
\r
**/\r
HII_THUNK_CONTEXT *\r
CreateThunkContextForUefiHiiHandle (\r
- IN HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_HANDLE UefiHiiHandle\r
)\r
{\r
\r
ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
\r
- Status = AssignFrameworkHiiHandle (Private, FALSE, &ThunkContext->FwHiiHandle);\r
+ Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
if (EFI_ERROR (Status)) {\r
return NULL;\r
}\r
InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
\r
- InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
-\r
return ThunkContext;\r
}\r
\r
}\r
\r
\r
+HII_THUNK_CONTEXT *\r
+CreateThunkContext (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN UINTN StringPackageCount,\r
+ IN UINTN IfrPackageCount\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+ ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
+ ASSERT (ThunkContext != NULL);\r
+ \r
+ ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
+ ThunkContext->IfrPackageCount = IfrPackageCount;\r
+ ThunkContext->StringPackageCount = StringPackageCount;\r
+ Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+\r
+ InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
+ InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+\r
+ return ThunkContext;\r
+ \r
+}\r
+\r
+VOID\r
+DestroyThunkContext (\r
+ IN HII_THUNK_CONTEXT *ThunkContext\r
+ )\r
+{\r
+ ASSERT (ThunkContext != NULL);\r
+\r
+ FreeHiiHandle (ThunkContext->FwHiiHandle);\r
+\r
+ DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
+\r
+ DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+ RemoveEntryList (&ThunkContext->Link);\r
+\r
+ FreePool (ThunkContext);\r
+}\r
+\r
+\r
+VOID\r
+DestroyQuestionIdMap (\r
+ IN LIST_ENTRY *QuestionIdMapListHead\r
+ )\r
+{\r
+ QUESTION_ID_MAP *IdMap;\r
+ QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link2;\r
+\r
+ while (!IsListEmpty (QuestionIdMapListHead)) {\r
+ Link = GetFirstNode (QuestionIdMapListHead);\r
+ \r
+ IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
+\r
+ while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
+ Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
+ \r
+ IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+ RemoveEntryList (Link2);\r
+\r
+ FreePool (IdMapEntry);\r
+ }\r
+\r
+ RemoveEntryList (Link);\r
+ FreePool (IdMap);\r
+ }\r
+}\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+ IN LIST_ENTRY *OneOfOptionMapListHead\r
+ )\r
+{\r
+ ONE_OF_OPTION_MAP *Map;\r
+ ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link2;\r
+\r
+ while (!IsListEmpty (OneOfOptionMapListHead)) {\r
+ Link = GetFirstNode (OneOfOptionMapListHead);\r
+ \r
+ Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+\r
+ while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
+ Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
+ \r
+ MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+ RemoveEntryList (Link2);\r
+\r
+ FreePool (MapEntry);\r
+ }\r
+\r
+ RemoveEntryList (Link);\r
+ FreePool (Map);\r
+ }\r
+}\r
+\r
+\r
+\r
+\r
\r
HII_THUNK_CONTEXT *\r
CreateThunkContextForUefiHiiHandle (\r
- IN HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_HANDLE UefiHiiHandle\r
)\r
;\r
\r
-EFI_STATUS\r
+VOID\r
DestroyThunkContextForUefiHiiHandle (\r
IN HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_HANDLE UefiHiiHandle\r
)\r
;\r
\r
+HII_THUNK_CONTEXT *\r
+CreateThunkContext (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN UINTN StringPackageCount,\r
+ IN UINTN IfrPackageCount\r
+ )\r
+;\r
+\r
+VOID\r
+DestroyThunkContext (\r
+ IN HII_THUNK_CONTEXT *ThunkContext\r
+ )\r
+;\r
+\r
+VOID\r
+DestroyQuestionIdMap (\r
+ IN LIST_ENTRY *QuestionIdMapListHead\r
+ )\r
+;\r
+\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+ IN LIST_ENTRY *OneOfOptionMapListHead\r
+ )\r
+;\r
+\r
#endif\r