//\r
// Update the default value array in BlockData.\r
//\r
- DefaultValueArray->Value = DefaultValueData->Value;\r
+ CopyMem (&DefaultValueArray->Value, &DefaultValueData->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
DefaultValueArray->Type = DefaultValueData->Type;\r
DefaultValueArray->Cleaned = DefaultValueData->Cleaned;\r
}\r
EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;\r
EFI_IFR_OP_HEADER *IfrOpHdr;\r
EFI_IFR_ONE_OF *IfrOneOf;\r
+ EFI_IFR_REF4 *IfrRef;\r
EFI_IFR_ONE_OF_OPTION *IfrOneOfOption;\r
EFI_IFR_DEFAULT *IfrDefault;\r
EFI_IFR_ORDERED_LIST *IfrOrderedList;\r
}\r
break;\r
\r
+ case EFI_IFR_REF_OP:\r
+ //\r
+ // Ref question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (VarStorageData->Size == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ //\r
+ // Check whether this question is for the requested varstore.\r
+ //\r
+ IfrRef = (EFI_IFR_REF4 *) IfrOpHdr;\r
+ if (IfrRef->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ break;\r
+ }\r
+ \r
+ //\r
+ // Get Offset/Width by Question header.\r
+ //\r
+ VarOffset = IfrRef->Question.VarStoreInfo.VarOffset;\r
+ VarWidth = (UINT16) (sizeof (EFI_HII_REF));\r
+ //\r
+ // Check whether this question is in requested block array.\r
+ //\r
+ if (!BlockArrayCheck (RequestBlockArray, VarOffset, VarWidth)) {\r
+ //\r
+ // This question is not in the requested string. Skip it.\r
+ //\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Check this var question is in the var storage \r
+ //\r
+ if ((VarOffset + VarWidth) > VarStorageData->Size) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ \r
+ //\r
+ // Set Block Data\r
+ //\r
+ BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));\r
+ if (BlockData == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ BlockData->Offset = VarOffset;\r
+ BlockData->Width = VarWidth;\r
+ BlockData->QuestionId = IfrRef->Question.QuestionId;\r
+ BlockData->OpCode = IfrOpHdr->OpCode;\r
+ BlockData->Scope = IfrOpHdr->Scope;\r
+ InitializeListHead (&BlockData->DefaultValueEntry);\r
+ //\r
+ // Add Block Data into VarStorageData BlockEntry\r
+ //\r
+ InsertBlockData (&VarStorageData->BlockEntry, &BlockData);\r
+ break;\r
+\r
case EFI_IFR_ONE_OF_OP:\r
case EFI_IFR_NUMERIC_OP:\r
//\r
DefaultData.Type = DefaultValueFromDefault;\r
switch (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE) {\r
case EFI_IFR_NUMERIC_SIZE_1:\r
- DefaultData.Value = (UINT64) IfrOneOf->data.u8.MinValue;\r
+ DefaultData.Value.u8 = IfrOneOf->data.u8.MinValue;\r
break;\r
\r
case EFI_IFR_NUMERIC_SIZE_2:\r
- CopyMem (&DefaultData.Value, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));\r
+ CopyMem (&DefaultData.Value.u16, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));\r
break;\r
\r
case EFI_IFR_NUMERIC_SIZE_4:\r
- CopyMem (&DefaultData.Value, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));\r
+ CopyMem (&DefaultData.Value.u32, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));\r
break;\r
\r
case EFI_IFR_NUMERIC_SIZE_8:\r
- CopyMem (&DefaultData.Value, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));\r
+ CopyMem (&DefaultData.Value.u64, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));\r
break;\r
}\r
//\r
//\r
// When flag is set, defautl value is TRUE.\r
//\r
- DefaultData.Type = DefaultValueFromFlag;\r
- DefaultData.Value = 1;\r
+ DefaultData.Type = DefaultValueFromFlag;\r
+ DefaultData.Value.b = TRUE;\r
} else {\r
//\r
// When flag is not set, defautl value is FASLE.\r
//\r
- DefaultData.Type = DefaultValueFromDefault;\r
- DefaultData.Value = 0;\r
+ DefaultData.Type = DefaultValueFromDefault;\r
+ DefaultData.Value.b = FALSE;\r
}\r
//\r
// Add DefaultValue into current BlockData\r
//\r
// When flag is set, defautl value is TRUE.\r
//\r
- DefaultData.Type = DefaultValueFromFlag;\r
- DefaultData.Value = 1;\r
+ DefaultData.Type = DefaultValueFromFlag;\r
+ DefaultData.Value.b = TRUE;\r
} else {\r
//\r
// When flag is not set, defautl value is FASLE.\r
//\r
- DefaultData.Type = DefaultValueFromDefault; \r
- DefaultData.Value = 0;\r
+ DefaultData.Type = DefaultValueFromDefault; \r
+ DefaultData.Value.b = FALSE;\r
}\r
//\r
// Add DefaultValue into current BlockData\r
// Prepare new DefaultValue\r
//\r
DefaultData.Type = DefaultValueFromFlag;\r
- DefaultData.Value = IfrOneOfOption->Value.u64;\r
+ CopyMem (&DefaultData.Value.u64, &IfrOneOfOption->Value.u64, sizeof (UINT64));\r
if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) {\r
DefaultData.DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
InsertDefaultValue (BlockData, &DefaultData);\r
// Prepare new DefaultValue\r
// \r
DefaultData.Type = DefaultValueFromDefault;\r
- DefaultData.Value = IfrOneOfOption->Value.u64; \r
+ CopyMem (&DefaultData.Value.u64, &IfrOneOfOption->Value.u64, sizeof (UINT64)); \r
for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {\r
DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry); \r
DefaultData.DefaultId = DefaultDataPtr->DefaultId;\r
//\r
DefaultData.Type = DefaultValueFromOpcode;\r
DefaultData.DefaultId = VarDefaultId;\r
- DefaultData.Value = IfrDefault->Value.u64; \r
+ CopyMem (&DefaultData.Value, &IfrDefault->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
\r
// If the value field is expression, set the cleaned flag.\r
if (IfrDefault->Type == EFI_IFR_TYPE_OTHER) {\r
)\r
{\r
CHAR16 *StringPtr;\r
+ UINTN StringLen;\r
UINTN BufferSize;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
CHAR16 TemStr[2];\r
\r
Status = EFI_SUCCESS;\r
UpdateFormInfo = TRUE;\r
+ StringPtr = NULL;\r
+ StringLen = 0;\r
\r
+ //\r
+ // Prepare the device path check, get the device path info first.\r
+ //\r
if (Statement->HiiValue.Value.ref.DevicePath != 0) {\r
+ StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);\r
+ if (StringPtr != NULL) {\r
+ StringLen = StrLen (StringPtr);\r
+ }\r
+ }\r
+\r
+ //\r
+ // Check whether the device path string is a valid string.\r
+ //\r
+ if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL && StringLen != 0) {\r
if (Selection->Form->ModalForm) {\r
return Status;\r
}\r
// Goto another Hii Package list\r
//\r
Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-\r
- StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);\r
- if (StringPtr == NULL) {\r
- //\r
- // No device path string not found, exit\r
- //\r
- Selection->Action = UI_ACTION_EXIT;\r
- Selection->Statement = NULL;\r
- return Status;\r
- }\r
BufferSize = StrLen (StringPtr) / 2;\r
DevicePath = AllocatePool (BufferSize);\r
ASSERT (DevicePath != NULL);\r
DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);\r
}\r
}\r
+ FreePool (StringPtr);\r
\r
Selection->Handle = DevicePathToHiiHandle (DevicePath);\r
+ FreePool (DevicePath);\r
+\r
if (Selection->Handle == NULL) {\r
//\r
// If target Hii Handle not found, exit\r
return Status;\r
}\r
\r
- FreePool (StringPtr);\r
- FreePool (DevicePath);\r
-\r
CopyMem (&Selection->FormSetGuid,&Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r