diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c index 82ab82bb34..ad4bc9ac90 100644 --- a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c +++ b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c @@ -322,7 +322,9 @@ ProcessExternedOpcode ( ) { LIST_ENTRY *Link; + LIST_ENTRY *NestLink; FORM_DISPLAY_ENGINE_STATEMENT *Statement; + FORM_DISPLAY_ENGINE_STATEMENT *NestStatement; Link = GetFirstNode (&FormData->StatementListOSF); while (!IsNull (&FormData->StatementListOSF, Link)) { @@ -338,6 +340,15 @@ ProcessExternedOpcode ( Link = GetNextNode (&FormData->StatementListHead, Link); ProcessUserOpcode(Statement->OpCode); + + NestLink = GetFirstNode (&Statement->NestStatementList); + while (!IsNull (&Statement->NestStatementList, NestLink)) { + NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink); + NestLink = GetNextNode (&Statement->NestStatementList, NestLink); + + ProcessUserOpcode(NestStatement->OpCode); + } + } } diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf b/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf index 323fcadb85..6a32221b2b 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf +++ b/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf @@ -54,9 +54,6 @@ gEdkiiFormDisplayEngineProtocolGuid gEdkiiFormBrowserEx2ProtocolGuid -[Guids] - gEfiIfrTianoGuid ## CONSUMES ## GUID - [Depex] gEfiHiiDatabaseProtocolGuid AND gEfiHiiConfigRoutingProtocolGuid AND gEdkiiFormBrowserEx2ProtocolGuid diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c index 4d98fc52a9..7130dffdc3 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c @@ -699,6 +699,13 @@ ConvertStatementToMenu ( NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink); NestLink = GetNextNode (&Statement->NestStatementList, NestLink); + // + // Skip the opcode not recognized by Display core. + // + if (NestStatement->OpCode->OpCode == EFI_IFR_GUID_OP) { + continue; + } + UiAddMenuOption (NestStatement, &MenuItemCount, TRUE); } } diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c index 75947d302e..ed06f1c9cd 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c @@ -17,7 +17,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. UINT16 mStatementIndex; UINT16 mExpressionOpCodeIndex; EFI_QUESTION_ID mUsedQuestionId; -BOOLEAN mInScopeSubtitle; extern LIST_ENTRY gBrowserStorageList; /** Initialize Statement header members. @@ -79,8 +78,6 @@ CreateStatement ( CopyMem (Statement->Expression->Expression, GetConditionalExpressionList(ExpressStatement), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount)); } - Statement->InSubtitle = mInScopeSubtitle; - // // Insert this Statement into current Form // @@ -1039,6 +1036,39 @@ IsExpressionOpCode ( } } +/** + Tell whether this Operand is an Statement OpCode. + + @param Operand Operand of an IFR OpCode. + + @retval TRUE This is an Statement OpCode. + @retval FALSE Not an Statement OpCode. + +**/ +BOOLEAN +IsStatementOpCode ( + IN UINT8 Operand + ) +{ + if ((Operand == EFI_IFR_SUBTITLE_OP) || + (Operand == EFI_IFR_TEXT_OP) || + (Operand == EFI_IFR_RESET_BUTTON_OP) || + (Operand == EFI_IFR_REF_OP) || + (Operand == EFI_IFR_ACTION_OP) || + (Operand == EFI_IFR_NUMERIC_OP) || + (Operand == EFI_IFR_ORDERED_LIST_OP) || + (Operand == EFI_IFR_CHECKBOX_OP) || + (Operand == EFI_IFR_STRING_OP) || + (Operand == EFI_IFR_PASSWORD_OP) || + (Operand == EFI_IFR_DATE_OP) || + (Operand == EFI_IFR_TIME_OP) || + (Operand == EFI_IFR_GUID_OP) || + (Operand == EFI_IFR_ONE_OF_OP)) { + return TRUE; + } else { + return FALSE; + } +} /** Calculate number of Statemens(Questions) and Expression OpCodes. @@ -1100,6 +1130,7 @@ ParseOpCodes ( EFI_STATUS Status; FORM_BROWSER_FORM *CurrentForm; FORM_BROWSER_STATEMENT *CurrentStatement; + FORM_BROWSER_STATEMENT *ParentStatement; EXPRESSION_OPCODE *ExpressionOpCode; FORM_EXPRESSION *CurrentExpression; UINT8 Operand; @@ -1132,7 +1163,6 @@ ParseOpCodes ( BOOLEAN InScopeDisable; INTN ConditionalExprCount; - mInScopeSubtitle = FALSE; SuppressForQuestion = FALSE; SuppressForOption = FALSE; InScopeDisable = FALSE; @@ -1180,6 +1210,7 @@ ParseOpCodes ( CurrentForm = NULL; CurrentStatement = NULL; + ParentStatement = NULL; ResetScopeStack (); @@ -1270,8 +1301,8 @@ ParseOpCodes ( break; case EFI_IFR_THIS_OP: - ASSERT (CurrentStatement != NULL); - ExpressionOpCode->QuestionId = CurrentStatement->QuestionId; + ASSERT (ParentStatement != NULL); + ExpressionOpCode->QuestionId = ParentStatement->QuestionId; break; case EFI_IFR_SECURITY_OP: @@ -1685,9 +1716,6 @@ ParseOpCodes ( CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags; CurrentStatement->FakeQuestionId = mUsedQuestionId++; - if (Scope != 0) { - mInScopeSubtitle = TRUE; - } break; case EFI_IFR_TEXT_OP: @@ -1927,7 +1955,7 @@ ParseOpCodes ( // // Insert to Default Value list of current Question // - InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link); + InsertTailList (&ParentStatement->DefaultListHead, &CurrentDefault->Link); if (Scope != 0) { InScopeDefault = TRUE; @@ -1966,16 +1994,15 @@ ParseOpCodes ( CopyMem (CurrentOption->SuppressExpression->Expression, GetConditionalExpressionList(ExpressOption), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount)); } + ASSERT (ParentStatement != NULL); // // Insert to Option list of current Question // - InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link); - + InsertTailList (&ParentStatement->OptionListHead, &CurrentOption->Link); // // Now we know the Storage width of nested Ordered List // - ASSERT (CurrentStatement != NULL); - if ((CurrentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) && (CurrentStatement->BufferValue == NULL)) { + if ((ParentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) && (ParentStatement->BufferValue == NULL)) { Width = 1; switch (CurrentOption->Value.Type) { case EFI_IFR_TYPE_NUM_SIZE_8: @@ -2001,15 +2028,15 @@ ParseOpCodes ( break; } - CurrentStatement->StorageWidth = (UINT16) (CurrentStatement->MaxContainers * Width); - CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth); - CurrentStatement->ValueType = CurrentOption->Value.Type; - if (CurrentStatement->HiiValue.Type == EFI_IFR_TYPE_BUFFER) { - CurrentStatement->HiiValue.Buffer = CurrentStatement->BufferValue; - CurrentStatement->HiiValue.BufferLen = CurrentStatement->StorageWidth; + ParentStatement->StorageWidth = (UINT16) (ParentStatement->MaxContainers * Width); + ParentStatement->BufferValue = AllocateZeroPool (ParentStatement->StorageWidth); + ParentStatement->ValueType = CurrentOption->Value.Type; + if (ParentStatement->HiiValue.Type == EFI_IFR_TYPE_BUFFER) { + ParentStatement->HiiValue.Buffer = ParentStatement->BufferValue; + ParentStatement->HiiValue.BufferLen = ParentStatement->StorageWidth; } - InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + InitializeRequestElement (FormSet, ParentStatement, CurrentForm); } break; @@ -2026,10 +2053,10 @@ ParseOpCodes ( if (Operand == EFI_IFR_NO_SUBMIT_IF_OP) { CurrentExpression->Type = EFI_HII_EXPRESSION_NO_SUBMIT_IF; - InsertTailList (&CurrentStatement->NoSubmitListHead, &CurrentExpression->Link); + InsertTailList (&ParentStatement->NoSubmitListHead, &CurrentExpression->Link); } else { CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF; - InsertTailList (&CurrentStatement->InconsistentListHead, &CurrentExpression->Link); + InsertTailList (&ParentStatement->InconsistentListHead, &CurrentExpression->Link); } // @@ -2049,7 +2076,7 @@ ParseOpCodes ( CopyMem (&CurrentExpression->Error, &((EFI_IFR_WARNING_IF *) OpCodeData)->Warning, sizeof (EFI_STRING_ID)); CurrentExpression->TimeOut = ((EFI_IFR_WARNING_IF *) OpCodeData)->TimeOut; CurrentExpression->Type = EFI_HII_EXPRESSION_WARNING_IF; - InsertTailList (&CurrentStatement->WarningListHead, &CurrentExpression->Link); + InsertTailList (&ParentStatement->WarningListHead, &CurrentExpression->Link); // // Take a look at next OpCode to see whether current expression consists @@ -2160,8 +2187,8 @@ ParseOpCodes ( // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler. // - ASSERT (CurrentStatement != NULL); - CurrentStatement->ValueExpression = CurrentExpression; + ASSERT (ParentStatement != NULL); + ParentStatement->ValueExpression = CurrentExpression; } // @@ -2199,8 +2226,8 @@ ParseOpCodes ( // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler. // - ASSERT (CurrentStatement != NULL); - CurrentStatement->ReadExpression = CurrentExpression; + ASSERT (ParentStatement != NULL); + ParentStatement->ReadExpression = CurrentExpression; // // Take a look at next OpCode to see whether current expression consists @@ -2221,8 +2248,8 @@ ParseOpCodes ( // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler. // - ASSERT (CurrentStatement != NULL); - CurrentStatement->WriteExpression = CurrentExpression; + ASSERT (ParentStatement != NULL); + ParentStatement->WriteExpression = CurrentExpression; // // Take a look at next OpCode to see whether current expression consists @@ -2264,8 +2291,8 @@ ParseOpCodes ( // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR // file is wrongly generated by tools such as VFR Compiler. // - ASSERT (CurrentStatement != NULL); - ImageId = &CurrentStatement->ImageId; + ASSERT (ParentStatement != NULL); + ImageId = &ParentStatement->ImageId; break; } @@ -2277,16 +2304,16 @@ ParseOpCodes ( // Refresh // case EFI_IFR_REFRESH_OP: - ASSERT (CurrentStatement != NULL); - CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval; + ASSERT (ParentStatement != NULL); + ParentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval; break; // // Refresh guid. // case EFI_IFR_REFRESH_ID_OP: - ASSERT (CurrentStatement != NULL); - CopyMem (&CurrentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *) OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID)); + ASSERT (ParentStatement != NULL); + CopyMem (&ParentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *) OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID)); break; // @@ -2314,8 +2341,8 @@ ParseOpCodes ( break; default: - ASSERT (CurrentStatement != NULL); - CurrentStatement->Locked = TRUE; + ASSERT (ParentStatement != NULL); + ParentStatement->Locked = TRUE; } break; @@ -2335,6 +2362,13 @@ ParseOpCodes ( ResetScopeStack (); return Status; } + + // + // Parent statement end tag found, update ParentStatement info. + // + if (IsStatementOpCode(ScopeOpCode) && ParentStatement->Operand == ScopeOpCode) { + ParentStatement = ParentStatement->ParentStatement; + } switch (ScopeOpCode) { case EFI_IFR_FORM_SET_OP: @@ -2361,10 +2395,6 @@ ParseOpCodes ( CurrentOption = NULL; break; - case EFI_IFR_SUBTITLE_OP: - mInScopeSubtitle = FALSE; - break; - case EFI_IFR_NO_SUBMIT_IF_OP: case EFI_IFR_INCONSISTENT_IF_OP: case EFI_IFR_WARNING_IF_OP: @@ -2456,6 +2486,17 @@ ParseOpCodes ( default: break; } + + if (IsStatementOpCode(Operand)) { + CurrentStatement->ParentStatement = ParentStatement; + if (Scope != 0) { + // + // Scope != 0, other statements or options may nest in this statement. + // Update the ParentStatement info. + // + ParentStatement = CurrentStatement; + } + } } return EFI_SUCCESS; diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c index fb3ff7b266..f8b1d5067e 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c @@ -387,18 +387,17 @@ QuestionCheck ( @param DisplayStatement Pointer to the display Statement data strucure. @param Statement The statement need to check. - @param HostDisplayStatement Pointer to the display Statement data strucure which is an host statement. **/ VOID InitializeDisplayStatement ( IN OUT FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement, - IN FORM_BROWSER_STATEMENT *Statement, - IN FORM_DISPLAY_ENGINE_STATEMENT *HostDisplayStatement + IN FORM_BROWSER_STATEMENT *Statement ) { LIST_ENTRY *Link; QUESTION_OPTION *Option; DISPLAY_QUESTION_OPTION *DisplayOption; + FORM_DISPLAY_ENGINE_STATEMENT *ParentStatement; DisplayStatement->Signature = FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE; DisplayStatement->Version = FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1; @@ -502,8 +501,10 @@ InitializeDisplayStatement ( // If this statement is nest in the subtitle, insert to the host statement. // else insert to the form it belongs to. // - if (Statement->InSubtitle) { - InsertTailList(&HostDisplayStatement->NestStatementList, &DisplayStatement->DisplayLink); + if (Statement->ParentStatement != NULL) { + ParentStatement = GetDisplayStatement(Statement->ParentStatement->OpCode); + ASSERT (ParentStatement != NULL); + InsertTailList(&ParentStatement->NestStatementList, &DisplayStatement->DisplayLink); } else { InsertTailList(&gDisplayFormData.StatementListHead, &DisplayStatement->DisplayLink); } @@ -625,14 +626,12 @@ AddStatementToDisplayForm ( LIST_ENTRY *Link; FORM_BROWSER_STATEMENT *Statement; FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement; - FORM_DISPLAY_ENGINE_STATEMENT *HostDisplayStatement; UINT8 MinRefreshInterval; EFI_EVENT RefreshIntervalEvent; FORM_BROWSER_REFRESH_EVENT_NODE *EventNode; BOOLEAN FormEditable; UINT32 ExtraAttribute; - HostDisplayStatement = NULL; MinRefreshInterval = 0; FormEditable = FALSE; @@ -686,21 +685,13 @@ AddStatementToDisplayForm ( // // Initialize this statement and add it to the display form. // - InitializeDisplayStatement(DisplayStatement, Statement, HostDisplayStatement); + InitializeDisplayStatement(DisplayStatement, Statement); // // Set the extra attribute. // DisplayStatement->Attribute |= ExtraAttribute; - // - // Save the Host statement info. - // Host statement may has nest statement follow it. - // - if (!Statement->InSubtitle) { - HostDisplayStatement = DisplayStatement; - } - if (Statement->Storage != NULL) { FormEditable = TRUE; } diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h index 9cb4653c82..337abb3fb6 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h @@ -288,9 +288,11 @@ typedef enum { ExpressOption } EXPRESS_LEVEL; +typedef struct _FORM_BROWSER_STATEMENT FORM_BROWSER_STATEMENT; + #define FORM_BROWSER_STATEMENT_SIGNATURE SIGNATURE_32 ('F', 'S', 'T', 'A') -typedef struct { +struct _FORM_BROWSER_STATEMENT{ UINTN Signature; LIST_ENTRY Link; @@ -352,7 +354,8 @@ typedef struct { EFI_IMAGE_ID ImageId; // nested EFI_IFR_IMAGE UINT8 RefreshInterval; // nested EFI_IFR_REFRESH, refresh interval(in seconds) for Question value, 0 means no refresh - BOOLEAN InSubtitle; // nesting inside of EFI_IFR_SUBTITLE + + FORM_BROWSER_STATEMENT *ParentStatement; LIST_ENTRY InconsistentListHead;// nested inconsistent expression list (FORM_EXPRESSION) LIST_ENTRY NoSubmitListHead; // nested nosubmit expression list (FORM_EXPRESSION) @@ -361,7 +364,7 @@ typedef struct { FORM_EXPRESSION *ReadExpression; // nested EFI_IFR_READ, provide this question value by read expression. FORM_EXPRESSION *WriteExpression; // nested EFI_IFR_WRITE, evaluate write expression after this question value is set. -} FORM_BROWSER_STATEMENT; +}; #define FORM_BROWSER_STATEMENT_FROM_LINK(a) CR (a, FORM_BROWSER_STATEMENT, Link, FORM_BROWSER_STATEMENT_SIGNATURE)