Update the logic in browser core, use config routine protocol instead of config access protocol to get/set data with hii drivers.
Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14902 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -355,6 +355,9 @@ OutputConfigBody (
|
||||
}
|
||||
|
||||
Length = TmpPtr - String;
|
||||
if (Length == 0) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
Result = AllocateCopyPool (Length * sizeof (CHAR16), String);
|
||||
if (Result == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@ -1281,6 +1284,13 @@ IsThisVarstore (
|
||||
GuidStr = NULL;
|
||||
TempStr = NULL;
|
||||
|
||||
//
|
||||
// If ConfigHdr has name field and varstore not has name, return FALSE.
|
||||
//
|
||||
if (Name == NULL && StrStr (ConfigHdr, L"NAME=&") == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *)VarstoreGuid, 1, &GuidStr);
|
||||
if (Name != NULL) {
|
||||
GenerateSubStr (L"NAME=", StrLen (Name) * sizeof (CHAR16), (VOID *) Name, 2, &NameStr);
|
||||
@ -1317,6 +1327,130 @@ Done:
|
||||
return RetVal;
|
||||
}
|
||||
|
||||
/**
|
||||
This function parses Form Package to get the efi varstore info according to the request ConfigHdr.
|
||||
|
||||
@param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.
|
||||
@param ConfigHdr Request string ConfigHdr. If it is NULL,
|
||||
the first found varstore will be as ConfigHdr.
|
||||
@retval TRUE This hii package is the reqeust one.
|
||||
@retval FALSE This hii package is not the reqeust one.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsThisPackageList (
|
||||
IN HII_DATABASE_RECORD *DataBaseRecord,
|
||||
IN EFI_STRING ConfigHdr
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN IfrOffset;
|
||||
UINTN PackageOffset;
|
||||
EFI_IFR_OP_HEADER *IfrOpHdr;
|
||||
CHAR16 *VarStoreName;
|
||||
UINT8 *HiiFormPackage;
|
||||
UINTN PackageSize;
|
||||
EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;
|
||||
EFI_HII_PACKAGE_HEADER *PackageHeader;
|
||||
EFI_IFR_VARSTORE *IfrVarStore;
|
||||
EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;
|
||||
BOOLEAN FindVarstore;
|
||||
|
||||
HiiFormPackage = NULL;
|
||||
VarStoreName = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
FindVarstore = FALSE;
|
||||
|
||||
Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);
|
||||
PackageOffset = IfrOffset;
|
||||
PackageHeader = (EFI_HII_PACKAGE_HEADER *) HiiFormPackage;
|
||||
|
||||
while (IfrOffset < PackageSize) {
|
||||
//
|
||||
// More than one form packages exist.
|
||||
//
|
||||
if (PackageOffset >= PackageHeader->Length) {
|
||||
//
|
||||
// Process the new form package.
|
||||
//
|
||||
PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);
|
||||
IfrOffset += PackageOffset;
|
||||
PackageHeader = (EFI_HII_PACKAGE_HEADER *) (HiiFormPackage + IfrOffset);
|
||||
}
|
||||
|
||||
IfrOpHdr = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset);
|
||||
IfrOffset += IfrOpHdr->Length;
|
||||
PackageOffset += IfrOpHdr->Length;
|
||||
|
||||
switch (IfrOpHdr->OpCode) {
|
||||
|
||||
case EFI_IFR_VARSTORE_OP:
|
||||
IfrVarStore = (EFI_IFR_VARSTORE *) IfrOpHdr;
|
||||
|
||||
VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrVarStore->Name) * sizeof (CHAR16));
|
||||
if (VarStoreName == NULL) {
|
||||
goto Done;
|
||||
}
|
||||
AsciiStrToUnicodeStr ((CHAR8 *)IfrVarStore->Name, VarStoreName);
|
||||
|
||||
if (IsThisVarstore((VOID *)&IfrVarStore->Guid, VarStoreName, ConfigHdr)) {
|
||||
FindVarstore = TRUE;
|
||||
goto Done;
|
||||
}
|
||||
break;
|
||||
|
||||
case EFI_IFR_VARSTORE_EFI_OP:
|
||||
IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;
|
||||
VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));
|
||||
if (VarStoreName == NULL) {
|
||||
goto Done;
|
||||
}
|
||||
AsciiStrToUnicodeStr ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName);
|
||||
|
||||
if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {
|
||||
FindVarstore = TRUE;
|
||||
goto Done;
|
||||
}
|
||||
break;
|
||||
|
||||
case EFI_IFR_VARSTORE_NAME_VALUE_OP:
|
||||
IfrNameValueVarStore = (EFI_IFR_VARSTORE_NAME_VALUE *) IfrOpHdr;
|
||||
|
||||
if (IsThisVarstore (&IfrNameValueVarStore->Guid, NULL, ConfigHdr)) {
|
||||
FindVarstore = TRUE;
|
||||
goto Done;
|
||||
}
|
||||
break;
|
||||
|
||||
case EFI_IFR_FORM_OP:
|
||||
case EFI_IFR_FORM_MAP_OP:
|
||||
//
|
||||
// No matched varstore is found and directly return.
|
||||
//
|
||||
goto Done;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Done:
|
||||
if (HiiFormPackage != NULL) {
|
||||
FreePool (HiiFormPackage);
|
||||
}
|
||||
|
||||
if (VarStoreName != NULL) {
|
||||
FreePool (VarStoreName);
|
||||
}
|
||||
|
||||
return FindVarstore;
|
||||
}
|
||||
|
||||
/**
|
||||
Check whether the this op code is required.
|
||||
|
||||
@ -2128,14 +2262,26 @@ ParseIfrData (
|
||||
//
|
||||
// End Opcode is for Var question.
|
||||
//
|
||||
if (BlockData != NULL && BlockData->Scope > 0) {
|
||||
BlockData->Scope--;
|
||||
if (BlockData != NULL) {
|
||||
if (BlockData->Scope > 0) {
|
||||
BlockData->Scope--;
|
||||
}
|
||||
if (BlockData->Scope == 0) {
|
||||
BlockData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
if (BlockData != NULL && BlockData->Scope > 0) {
|
||||
BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope);
|
||||
if (BlockData != NULL) {
|
||||
if (BlockData->Scope > 0) {
|
||||
BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope);
|
||||
}
|
||||
|
||||
if (BlockData->Scope == 0) {
|
||||
BlockData = NULL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -3200,10 +3346,11 @@ GetConfigRespFromEfiVarStore (
|
||||
UINT8 *VarStore;
|
||||
UINTN BufferSize;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
BufferSize = 0;
|
||||
VarStore = NULL;
|
||||
VarStoreName = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
BufferSize = 0;
|
||||
VarStore = NULL;
|
||||
VarStoreName = NULL;
|
||||
*AccessProgress = Request;
|
||||
|
||||
VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16));
|
||||
if (VarStoreName == NULL) {
|
||||
@ -3537,6 +3684,7 @@ HiiConfigRoutingExtractConfig (
|
||||
BOOLEAN IsEfiVarStore;
|
||||
EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo;
|
||||
EFI_STRING ErrorPtr;
|
||||
UINTN DevicePathSize;
|
||||
|
||||
if (This == NULL || Progress == NULL || Results == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -3622,11 +3770,8 @@ HiiConfigRoutingExtractConfig (
|
||||
Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);
|
||||
if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {
|
||||
CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);
|
||||
if (CompareMem (
|
||||
DevicePath,
|
||||
CurrentDevicePath,
|
||||
GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)
|
||||
) == 0) {
|
||||
DevicePathSize = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath);
|
||||
if ((CompareMem (DevicePath,CurrentDevicePath,DevicePathSize) == 0) && IsThisPackageList(Database, Request)) {
|
||||
DriverHandle = Database->DriverHandle;
|
||||
HiiHandle = Database->Handle;
|
||||
break;
|
||||
@ -4060,6 +4205,7 @@ HiiConfigRoutingRouteConfig (
|
||||
EFI_STRING AccessProgress;
|
||||
EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo;
|
||||
BOOLEAN IsEfiVarstore;
|
||||
UINTN DevicePathSize;
|
||||
|
||||
if (This == NULL || Progress == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -4131,11 +4277,8 @@ HiiConfigRoutingRouteConfig (
|
||||
|
||||
if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {
|
||||
CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);
|
||||
if (CompareMem (
|
||||
DevicePath,
|
||||
CurrentDevicePath,
|
||||
GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)
|
||||
) == 0) {
|
||||
DevicePathSize = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath);
|
||||
if ((CompareMem (DevicePath,CurrentDevicePath,DevicePathSize) == 0) && IsThisPackageList(Database, Configuration)) {
|
||||
DriverHandle = Database->DriverHandle;
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user