#include <Library/MemoryAllocationLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
\r
+#include "HiiDatabase.h"\r
#include "UefiIfrParser.h"\r
#include "UefiIfrDefault.h"\r
-#include "HiiDatabase.h"\r
\r
//\r
// Extern Variables\r
extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
\r
-extern EFI_GUID gZeroGuid;\r
-\r
-/**\r
- Fetch the Ifr binary data of a FormSet.\r
-\r
- @param Handle PackageList Handle\r
- @param FormSetGuid GUID of a formset. If not specified (NULL or zero\r
- GUID), take the first FormSet found in package\r
- list.\r
- @param BinaryLength The length of the FormSet IFR binary.\r
- @param BinaryData The buffer designed to receive the FormSet.\r
-\r
- @retval EFI_SUCCESS Buffer filled with the requested FormSet.\r
- BufferLength was updated.\r
- @retval EFI_INVALID_PARAMETER The handle is unknown.\r
- @retval EFI_NOT_FOUND A form or FormSet on the requested handle cannot\r
- be found with the requested FormId.\r
-\r
-**/\r
-EFI_STATUS\r
-GetIfrBinaryData (\r
- IN EFI_HII_HANDLE Handle,\r
- IN OUT EFI_GUID *FormSetGuid,\r
- OUT UINTN *BinaryLength,\r
- OUT UINT8 **BinaryData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
- UINTN BufferSize;\r
- UINT8 *Package;\r
- UINT8 *OpCodeData;\r
- UINT32 Offset;\r
- UINT32 Offset2;\r
- BOOLEAN ReturnDefault;\r
- UINT32 PackageListLength;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
-\r
- OpCodeData = NULL;\r
- Package = NULL;\r
- ZeroMem (&PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));;\r
-\r
- //\r
- // if FormSetGuid is NULL or zero GUID, return first FormSet in the package list\r
- //\r
- if (FormSetGuid == NULL || CompareGuid (FormSetGuid, &gZeroGuid)) {\r
- ReturnDefault = TRUE;\r
- } else {\r
- ReturnDefault = FALSE;\r
- }\r
-\r
- //\r
- // Get HII PackageList\r
- //\r
- BufferSize = 0;\r
- HiiPackageList = NULL;\r
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- HiiPackageList = AllocatePool (BufferSize);\r
- ASSERT (HiiPackageList != NULL);\r
-\r
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- }\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Get Form package from this HII package List\r
- //\r
- Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
- Offset2 = 0;\r
- CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\r
-\r
- while (Offset < PackageListLength) {\r
- Package = ((UINT8 *) HiiPackageList) + Offset;\r
- CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
-\r
- if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
- //\r
- // Search FormSet in this Form Package\r
- //\r
- Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
- while (Offset2 < PackageHeader.Length) {\r
- OpCodeData = Package + Offset2;\r
-\r
- if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
- //\r
- // Check whether return default FormSet\r
- //\r
- if (ReturnDefault) {\r
- break;\r
- }\r
-\r
- //\r
- // FormSet GUID is specified, check it\r
- //\r
- if (CompareGuid (FormSetGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
- break;\r
- }\r
- }\r
-\r
- Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
- }\r
-\r
- if (Offset2 < PackageHeader.Length) {\r
- //\r
- // Target formset found\r
- //\r
- break;\r
- }\r
- }\r
-\r
- Offset += PackageHeader.Length;\r
- }\r
-\r
- if (Offset >= PackageListLength) {\r
- //\r
- // Form package not found in this Package List\r
- //\r
- gBS->FreePool (HiiPackageList);\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- if (ReturnDefault && FormSetGuid != NULL) {\r
- //\r
- // Return the default FormSet GUID\r
- //\r
- CopyMem (FormSetGuid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
- }\r
-\r
- //\r
- // To determine the length of a whole FormSet IFR binary, one have to parse all the Opcodes\r
- // in this FormSet; So, here just simply copy the data from start of a FormSet to the end\r
- // of the Form Package.\r
- //\r
- *BinaryLength = PackageHeader.Length - Offset2;\r
- *BinaryData = AllocateCopyPool (*BinaryLength, OpCodeData);\r
-\r
- gBS->FreePool (HiiPackageList);\r
-\r
- if (*BinaryData == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Initialize the internal data structure of a FormSet.\r
-\r
- @param Handle PackageList Handle\r
- @param FormSetGuid GUID of a formset. If not specified (NULL or zero\r
- GUID), take the first FormSet found in package\r
- list.\r
- @param FormSet FormSet data structure.\r
-\r
- @retval EFI_SUCCESS The function completed successfully.\r
- @retval EFI_NOT_FOUND The specified FormSet could not be found.\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeFormSet (\r
- IN EFI_HII_HANDLE Handle,\r
- IN OUT EFI_GUID *FormSetGuid,\r
- OUT FORM_BROWSER_FORMSET *FormSet\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE DriverHandle;\r
-\r
- Status = GetIfrBinaryData (Handle, FormSetGuid, &FormSet->IfrBinaryLength, &FormSet->IfrBinaryData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- FormSet->HiiHandle = Handle;\r
- CopyMem (&FormSet->Guid, FormSetGuid, sizeof (EFI_GUID));\r
-\r
- //\r
- // Retrieve ConfigAccess Protocol associated with this HiiPackageList\r
- //\r
- Status = mHiiDatabase->GetPackageListHandle (mHiiDatabase, Handle, &DriverHandle);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- FormSet->DriverHandle = DriverHandle;\r
- Status = gBS->HandleProtocol (\r
- DriverHandle,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- (VOID **) &FormSet->ConfigAccess\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Configuration Driver don't attach ConfigAccess protocol to its HII package\r
- // list, then there will be no configuration action required\r
- //\r
- FormSet->ConfigAccess = NULL;\r
- }\r
-\r
- //\r
- // Parse the IFR binary OpCodes\r
- //\r
- Status = ParseOpCodes (FormSet);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- return Status;\r
-}\r
-\r
/**\r
Set the data position at Offset with Width in Node->Buffer based \r
the value passed in.\r
/**\r
Reset Question to its default value.\r
\r
+ Note Framework 0.92's HII Implementation does not support for default value for these opcodes:\r
+ EFI_IFR_ORDERED_LIST_OP:\r
+ EFI_IFR_PASSWORD_OP:\r
+ EFI_IFR_STRING_OP:\r
+\r
@param FormSet FormSet data structure.\r
@param DefaultId The Class of the default.\r
\r
Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
\r
if (Default->DefaultId == DefaultId) {\r
- if (Default->ValueExpression != NULL) {\r
- //\r
- // Default is provided by an Expression, evaluate it\r
- //\r
- Status = EvaluateExpression (FormSet, Form, Default->ValueExpression);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- CopyMem (HiiValue, &Default->ValueExpression->Result, sizeof (EFI_HII_VALUE));\r
- } else {\r
- //\r
- // Default value is embedded in EFI_IFR_DEFAULT\r
- //\r
- CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE));\r
- }\r
+ //\r
+ // Default value is embedded in EFI_IFR_DEFAULT\r
+ //\r
+ CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE));\r
\r
SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);\r
return EFI_SUCCESS;\r
**/\r
EFI_STATUS\r
UefiIfrGetBufferTypeDefaults (\r
- IN EFI_HII_HANDLE UefiHiiHandle,\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
OUT LIST_ENTRY **UefiDefaults\r
)\r
{\r
- FORM_BROWSER_FORMSET *FormSet;\r
- EFI_GUID FormSetGuid;\r
LIST_ENTRY *DefaultLink;\r
FORMSET_DEFAULTSTORE *DefaultStore;\r
EFI_STATUS Status;\r
\r
ASSERT (UefiDefaults != NULL);\r
\r
- FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET)); \r
- ASSERT (FormSet != NULL);\r
-\r
- CopyGuid (&FormSetGuid, &gZeroGuid);\r
- Status = InitializeFormSet (UefiHiiHandle, &FormSetGuid, FormSet);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
*UefiDefaults = AllocateZeroPool (sizeof (LIST_ENTRY));\r
ASSERT (UefiDefaults != NULL);\r
InitializeListHead (*UefiDefaults);\r
\r
- DefaultLink = GetFirstNode (&FormSet->DefaultStoreListHead);\r
- while (!IsNull (&FormSet->DefaultStoreListHead, DefaultLink)) {\r
+ DefaultLink = GetFirstNode (&ThunkContext->FormSet->DefaultStoreListHead);\r
+ while (!IsNull (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink)) {\r
DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);\r
\r
- Status = GetBufferTypeDefaultId (DefaultStore, FormSet, *UefiDefaults);\r
+ Status = GetBufferTypeDefaultId (DefaultStore, ThunkContext->FormSet, *UefiDefaults);\r
ASSERT_EFI_ERROR (Status);\r
\r
- DefaultLink = GetNextNode (&FormSet->DefaultStoreListHead, DefaultLink); \r
+ DefaultLink = GetNextNode (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink); \r
}\r
\r
- DestroyFormSet (FormSet);\r
- \r
return EFI_SUCCESS;\r
}\r
\r
UefiDefaultsToFwDefaults (\r
IN LIST_ENTRY *ListHead,\r
IN UINTN DefaultMask,\r
+ IN EFI_VARSTORE_ID UefiFormSetDefaultVarStoreId,\r
OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
)\r
{\r
//\r
// In UEFI, 0 is defined to be invalid for EFI_IFR_VARSTORE.VarStoreId.\r
// So the default storage of Var Store in VFR from a Framework module \r
- // should be translated to 0x0001 (RESERVED_VARSTORE_ID).\r
+ // should be translated to 0x0001 (FRAMEWORK_RESERVED_VARSTORE_ID).\r
//\r
- if (Node->StoreId == RESERVED_VARSTORE_ID) {\r
+ if (Node->StoreId == UefiFormSetDefaultVarStoreId) {\r
Pack->VariableId = 0;\r
} else {\r
Pack->VariableId = Node->StoreId;\r