return EFI_SUCCESS;\r
}\r
\r
+EFI_QUESTION_ID\r
+AssignQuestionId (\r
+ IN UINT16 FwQuestionId\r
+ )\r
+{\r
+ if (FwQuestionId == 0) {\r
+ //\r
+ // In UEFI IFR, the Question ID can't be zero. Zero means no storage.\r
+ // So use 0xABBA as a Question ID.\r
+ //\r
+ return 0xABBA;\r
+ } else {\r
+ return FwQuestionId;\r
+ }\r
+}\r
\r
\r
EFI_STATUS\r
if (UOpcode.Question.QuestionId == 0) {\r
Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
if (EFI_ERROR (Status)) {\r
- UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+ UOpcode.Question.QuestionId = AssignQuestionId (FwOneOfOp->Key);\r
}\r
\r
OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
break;\r
case 2:\r
OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_16;\r
+ break;\r
default:\r
ASSERT (FALSE);\r
break;\r
//\r
Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
if (EFI_ERROR (Status)) {\r
- UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+ UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId);\r
}\r
}\r
\r
if (UOpcode.Question.QuestionId == 0) {\r
Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
if (EFI_ERROR (Status)) {\r
- UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+ UOpcode.Question.QuestionId = AssignQuestionId (FwOneOfOp->Key);\r
}\r
\r
}\r
if (UOpcode.Question.QuestionId == 0) {\r
Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
if (EFI_ERROR (Status)) {\r
- UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+ UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId);\r
}\r
}\r
\r
//\r
// Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
//\r
- UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+ UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId);\r
}\r
} else {\r
UOpcode.Question.QuestionId = FwOpcode->Key;\r
//\r
// Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
//\r
- UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+ UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId);\r
}\r
} else {\r
UOpcode.Question.QuestionId = FwOpcode->Key;\r
// We need to create a nested default value for the UEFI Numeric Opcode.\r
// So turn on the scope.\r
//\r
- if (FwOpcode->Default != 0) {\r
- UOpcode.Header.Scope = 1;\r
- }\r
+ UOpcode.Header.Scope = 1;\r
\r
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
UOpcode.Question.Header.Help = FwOpcode->Help;\r
\r
- UOpcode.Question.QuestionId = FwOpcode->Key;\r
UOpcode.Question.VarStoreId = VarStoreId;\r
UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
\r
switch (FwOpcode->Width) {\r
case 1: \r
{\r
- UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC; \r
+ UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC; \r
break;\r
} \r
case 2: \r
{\r
- UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC; \r
+ UOpcode.Flags = EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC; \r
break;\r
}\r
default: \r
//\r
// We need to create a default value.\r
//\r
- if (FwOpcode->Default != 0) {\r
- ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));\r
- UOpcodeDefault.Header.Length = sizeof (UOpcodeDefault);\r
- UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
+ ZeroMem (&UOpcodeDefault, sizeof (UOpcodeDefault));\r
+ UOpcodeDefault.Header.Length = sizeof (UOpcodeDefault);\r
+ UOpcodeDefault.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
\r
- UOpcodeDefault.DefaultId = 0;\r
+ UOpcodeDefault.DefaultId = 0;\r
\r
- switch (FwOpcode->Width) {\r
- case 1: \r
- {\r
- UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
- break;\r
- } \r
- case 2: \r
- {\r
- UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
- break;\r
- }\r
+ switch (FwOpcode->Width) {\r
+ case 1: \r
+ {\r
+ UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ break;\r
+ } \r
+ case 2: \r
+ {\r
+ UOpcodeDefault.Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
+ break;\r
}\r
+ }\r
\r
- CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
+ CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
\r
- Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- Status = UCreateEndOfOpcode (UefiData);\r
+ Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
}\r
+ Status = UCreateEndOfOpcode (UefiData);\r
\r
return Status;\r
}\r
DataCount = 1;\r
break;\r
\r
+ case FRAMEWORK_EFI_IFR_NUMERIC_OP:\r
+ Status = F2UCreateNumericOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode, UefiOpCode);\r
+ DataCount = 1;\r
+ break;\r
+\r
default:\r
ASSERT (FALSE);\r
return EFI_UNSUPPORTED;\r
//\r
EFI_STATUS\r
UefiRegisterPackageList(\r
+ IN EFI_HII_PROTOCOL *This,\r
IN HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_PACKAGES *Packages,\r
OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
return EFI_UNSUPPORTED;\r
}\r
\r
- ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
- if (ThunkContext == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
- \r
if (Packages->GuidId == NULL) {\r
//\r
// UEFI HII Database require Package List GUID must be unique.\r
ASSERT (StringPackageCount >=1 && IfrPackageCount == 1);\r
GenerateRandomGuid (&GuidId);\r
} else {\r
+ ThunkContext = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);\r
+ \r
+ if (IfrPackageCount > 0 && \r
+ StringPackageCount > 0 && \r
+ (ThunkContext!= NULL)) {\r
+ DEBUG((EFI_D_WARN, "Framework code registers HII package list with the same GUID more than once.\n"));\r
+ DEBUG((EFI_D_WARN, "This package list should be already registered. Just return successfully.\n"));\r
+ HiiRemovePack (This, ThunkContext->FwHiiHandle);\r
+ }\r
CopyGuid (&GuidId, Packages->GuidId);\r
}\r
\r
+ ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
+ if (ThunkContext == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
+ \r
//\r
// Record the Package List GUID, it is used as a name for the package list by Framework HII.\r
//\r
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
Status = UefiRegisterPackageList (\r
+ This,\r
Private,\r
Packages,\r
Handle\r
UninstallDefaultConfigAccessProtocol (ThunkContext);\r
}\r
\r
- RemoveEntryList (&ThunkContext->Link);\r
DestroyThunkContext (ThunkContext);\r
}else {\r
Status = EFI_NOT_FOUND;\r