4 Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include "VfrFormPkg.h"
20 #include "VfrUtilityLib.h"
30 #include "PBlackBox.h"
31 #include "DLexerBase.h"
35 #define GET_LINENO(Obj) ((Obj)->getLine())
36 #define SET_LINE_INFO(Obj, L) do {(Obj).SetLineNo((L)->getLine());} while (0)
37 #define CRT_END_OP(Obj) do {CIfrEnd EObj; if (Obj != NULL) EObj.SetLineNo ((Obj)->getLine());} while (0)
39 typedef ANTLRCommonToken ANTLRToken;
41 class CVfrDLGLexer : public VfrLexer
44 CVfrDLGLexer (DLGFileInput *F) : VfrLexer (F) {};
45 INT32 errstd (char *Text)
47 printf ("unrecognized input '%s'\n", Text);
54 IN INPUT_INFO_TO_SYNTAX *InputInfo
57 ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File);
58 VfrParser.parser()->SetCompatibleMode (InputInfo->CompatibleMode);
59 VfrParser.parser()->SetOverrideClassGuid (InputInfo->OverrideClassGuid);
60 return VfrParser.parser()->vfrProgram();
65 // Define a lexical class for parsing quoted strings. Basically
66 // starts with a double quote, and ends with a double quote that
67 // is not preceeded with a backslash.
69 #lexclass QUOTED_STRING
70 #token TheString "~[\"]*\"" << mode (START); >>
73 // Define a lexclass for skipping over C++ style comments
76 #token "~[\n]*" << skip (); >>
77 #token "\n" << skip (); mode (START); newline (); >>
80 // Standard lexclass is START
85 // Find start of C++ style comments
87 #token "//" << skip (); mode (CPP_COMMENT); >>
92 #token "[\ \t]" << skip (); >>
95 // Skip over newlines, but count them
97 #token "\n" << skip (); newline (); >>
100 // Skip over 'extern' in any included .H file
102 #token "extern" << skip (); mode (CPP_COMMENT); >>
105 // Tokens for the different keywords. Syntax is:
106 // TokenName("ErrorMessageText") "TokenString"
108 // TokenName is the token name (must be capitalized) that is used in the rules
109 // ErrorMessageText is the string the compiler emits when it detects a syntax error
110 // TokenString is the actual matching string used in the user script
112 #token FormPkgType("formpkgtype") "formpkgtype"
113 #token OpenBrace("{") "\{"
114 #token CloseBrace("}") "\}"
115 #token OpenParen("(") "\("
116 #token CloseParen(")") "\)"
117 #token OpenBracket("[") "\["
118 #token CloseBracket("]") "\]"
120 #token LineDefinition "#line\ [0-9]+\ \"~[\"]+\"[\ \t]*\n" << gCVfrErrorHandle.ParseFileScopeRecord (begexpr (), line ()); skip (); newline (); >>
121 #token DevicePath("devicepath") "devicepath"
122 #token FormSet("formset") "formset"
123 #token FormSetId("formsetid") "formsetid"
124 #token EndFormSet("endformset") "endformset"
125 #token Title("title") "title"
126 #token FormId("formid") "formid"
127 #token OneOf("oneof") "oneof"
128 #token EndOneOf("endoneof") "endoneof"
129 #token Prompt("prompt") "prompt"
130 #token OrderedList("orderedlist") "orderedlist"
131 #token MaxContainers("maxcontainers") "maxcontainers"
132 #token EndList("endlist") "endlist"
133 #token EndForm("endform") "endform"
134 #token Form("form") "form"
135 #token FormMap("formmap") "formmap"
136 #token MapTitle("maptitle") "maptitle"
137 #token MapGuid("mapguid") "mapguid"
138 #token Subtitle("subtitle") "subtitle"
139 #token EndSubtitle("endsubtitle") "endsubtitle"
140 #token Help("help") "help"
141 #token Text("text") "text"
142 #token Option("option") "option"
143 #token FLAGS("flags") "flags"
144 #token Date("date") "date"
145 #token EndDate("enddate") "enddate"
146 #token Year("year") "year"
147 #token Month("month") "month"
148 #token Day("day") "day"
149 #token Time("time") "time"
150 #token EndTime("endtime") "endtime"
151 #token Hour("hour") "hour"
152 #token Minute("minute") "minute"
153 #token Second("second") "second"
154 #token GrayOutIf("grayoutif") "grayoutif"
155 #token Label("label") "label"
156 #token Timeout("timeout") "timeout"
157 #token Inventory("inventory") "inventory"
158 #token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"
159 #token Struct("struct") "struct"
160 #token Union("union") "union"
161 #token Boolean("BOOLEAN") "BOOLEAN"
162 #token Uint64("UINT64") "UINT64"
163 #token Uint32("UINT32") "UINT32"
164 #token Uint16("UINT16") "UINT16"
165 #token Char16("CHAR16") "CHAR16"
166 #token Uint8("UINT8") "UINT8"
167 #token Uuid("guid") "guid"
168 #token CheckBox("checkbox") "checkbox"
169 #token EndCheckBox("endcheckbox") "endcheckbox"
170 #token Numeric("numeric") "numeric"
171 #token EndNumeric("endnumeric") "endnumeric"
172 #token Minimum("minimum") "minimum"
173 #token Maximum("maximum") "maximum"
174 #token STEP("step") "step"
175 #token Default("default") "default"
176 #token Password("password") "password"
177 #token EndPassword("endpassword") "endpassword"
178 #token String("string") "string"
179 #token EndString("endstring") "endstring"
180 #token MinSize("minsize") "minsize"
181 #token MaxSize("maxsize") "maxsize"
182 #token Encoding("encoding") "encoding"
183 #token SuppressIf("suppressif") "suppressif"
184 #token DisableIf("disableif") "disableif"
185 #token Hidden("hidden") "hidden"
186 #token Goto("goto") "goto"
187 #token FormSetGuid("formsetguid") "formsetguid"
188 #token InconsistentIf("inconsistentif") "inconsistentif"
189 #token WarningIf("warningif") "warningif"
190 #token NoSubmitIf("nosubmitif") "nosubmitif"
191 #token EndIf("endif") "endif"
192 #token Key("key") "key"
193 #token DefaultFlag("DEFAULT") "DEFAULT"
194 #token ManufacturingFlag("MANUFACTURING") "MANUFACTURING"
195 #token InteractiveFlag("INTERACTIVE") "INTERACTIVE"
196 #token NVAccessFlag("NV_ACCESS") "NV_ACCESS"
197 #token ResetRequiredFlag("RESET_REQUIRED") "RESET_REQUIRED"
198 #token ReconnectRequiredFlag("RECONNECT_REQUIRED") "RECONNECT_REQUIRED"
199 #token LateCheckFlag("LATE_CHECK") "LATE_CHECK"
200 #token ReadOnlyFlag("READ_ONLY") "READ_ONLY"
201 #token OptionOnlyFlag("OPTIONS_ONLY") "OPTIONS_ONLY"
202 #token Class("class") "class"
203 #token Subclass("subclass") "subclass"
204 #token ClassGuid("classguid") "classguid"
205 #token TypeDef("typedef") "typedef"
206 #token Restore("restore") "restore"
207 #token Save("save") "save"
208 #token Defaults("defaults") "defaults"
209 #token Banner("banner") "banner"
210 #token Align("align") "align"
211 #token Left("left") "left"
212 #token Right("right") "right"
213 #token Center("center") "center"
214 #token Line("line") "line"
215 #token Name("name") "name"
217 #token VarId("varid") "varid"
218 #token Question("question") "question"
219 #token QuestionId("questionid") "questionid"
220 #token Image("image") "image"
221 #token Locked("locked") "locked"
222 #token Rule("rule") "rule"
223 #token EndRule("endrule") "endrule"
224 #token Value("value") "value"
225 #token Read("read") "read"
226 #token Write("write") "write"
227 #token ResetButton("resetbutton") "resetbutton"
228 #token EndResetButton("endresetbutton") "endresetbutton"
229 #token DefaultStore("defaultstore") "defaultstore"
230 #token Attribute("attribute") "attribute"
231 #token Varstore("varstore") "varstore"
232 #token Efivarstore("efivarstore") "efivarstore"
233 #token VarSize("varsize") "varsize"
234 #token NameValueVarStore("namevaluevarstore") "namevaluevarstore"
235 #token Action("action") "action"
236 #token Config("config") "config"
237 #token EndAction("endaction") "endaction"
238 #token Refresh("refresh") "refresh"
239 #token Interval("interval") "interval"
240 #token VarstoreDevice("varstoredevice") "varstoredevice"
241 #token GuidOp("guidop") "guidop"
242 #token EndGuidOp("endguidop") "endguidop"
243 #token DataType("datatype") "datatype"
244 #token Data("data") "data"
245 #token Modal("modal") "modal"
248 // Define the class and subclass tokens
250 #token ClassNonDevice("NONDEVICE") "NON_DEVICE"
251 #token ClassDiskDevice("DISK_DEVICE") "DISK_DEVICE"
252 #token ClassVideoDevice("VIDEO_DEVICE") "VIDEO_DEVICE"
253 #token ClassNetworkDevice("NETWORK_DEVICE") "NETWORK_DEVICE"
254 #token ClassInputDevice("INPUT_DEVICE") "INPUT_DEVICE"
255 #token ClassOnBoardDevice("ONBOARD_DEVICE") "ONBOARD_DEVICE"
256 #token ClassOtherDevice("OTHER_DEVICE") "OTHER_DEVICE"
258 #token SubclassSetupApplication("SETUP_APPLICATION") "SETUP_APPLICATION"
259 #token SubclassGeneralApplication("GENERAL_APPLICATION") "GENERAL_APPLICATION"
260 #token SubclassFrontPage("FRONT_PAGE") "FRONT_PAGE"
261 #token SubclassSingleUse("SINGLE_USE") "SINGLE_USE"
264 // This is the overall definition of a VFR form definition script.
267 vfrProgram > [UINT8 Return] :
271 mConstantOnlyInExpression = FALSE;
274 vfrPragmaPackDefinition
275 | vfrDataStructDefinition
276 | vfrDataUnionDefinition
279 << $Return = mParserStatus; >>
283 L:"show" << gCVfrVarDataTypeDB.Pack (L->getLine(), VFR_PACK_SHOW); >>
290 CHAR8 *Identifier = NULL;
291 UINT32 PackNumber = DEFAULT_PACK_ALIGN;
294 L1:"push" << LineNum = L1->getLine(); PackAction = VFR_PACK_PUSH; >>
295 | L2:"pop" << LineNum = L2->getLine(); PackAction = VFR_PACK_POP; >>
298 "," ID:StringIdentifier << Identifier = ID->getText(); >>
301 "," N:Number << PackAction |= VFR_PACK_ASSIGN; PackNumber = _STOU32(N->getText(), N->getLine()); >>
303 << gCVfrVarDataTypeDB.Pack (LineNum, PackAction, Identifier, PackNumber); >>
309 UINT32 PackNumber = DEFAULT_PACK_ALIGN;
311 N:Number << LineNum = N->getLine(); PackNumber = _STOU32(N->getText(), N->getLine()); >>
312 << gCVfrVarDataTypeDB.Pack (LineNum, VFR_PACK_ASSIGN, NULL, PackNumber); >>
315 vfrPragmaPackDefinition :
316 "\#pragma" "pack" "\("
325 vfrDataUnionDefinition :
326 { TypeDef } Union << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
329 N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
332 vfrDataStructFields[TRUE]
335 N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
337 ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd ();>>
340 vfrDataStructDefinition :
341 { TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
344 N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
347 vfrDataStructFields[FALSE]
350 N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
352 ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>
355 vfrDataStructFields [BOOLEAN FieldInUnion]:
357 dataStructField64 [FieldInUnion] |
358 dataStructField32 [FieldInUnion] |
359 dataStructField16 [FieldInUnion] |
360 dataStructField8 [FieldInUnion] |
361 dataStructFieldBool [FieldInUnion] |
362 dataStructFieldString [FieldInUnion]|
363 dataStructFieldDate [FieldInUnion] |
364 dataStructFieldTime [FieldInUnion] |
365 dataStructFieldRef [FieldInUnion] |
366 dataStructFieldUser [FieldInUnion]
370 dataStructField64 [BOOLEAN FieldInUnion]:
371 << UINT32 ArrayNum = 0; >>
375 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
377 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
380 dataStructField32 [BOOLEAN FieldInUnion]:
381 << UINT32 ArrayNum = 0; >>
385 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
387 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
390 dataStructField16 [BOOLEAN FieldInUnion]:
394 ("UINT16" | "CHAR16")
397 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
399 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, FieldInUnion), N); >>
402 dataStructField8 [BOOLEAN FieldInUnion]:
403 << UINT32 ArrayNum = 0; >>
407 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
409 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
412 dataStructFieldBool [BOOLEAN FieldInUnion]:
413 << UINT32 ArrayNum = 0; >>
417 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
419 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
422 dataStructFieldString [BOOLEAN FieldInUnion]:
423 << UINT32 ArrayNum = 0; >>
427 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
429 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
432 dataStructFieldDate [BOOLEAN FieldInUnion]:
433 << UINT32 ArrayNum = 0; >>
437 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
439 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
442 dataStructFieldTime [BOOLEAN FieldInUnion]:
443 << UINT32 ArrayNum = 0; >>
447 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
449 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
452 dataStructFieldRef [BOOLEAN FieldInUnion]:
453 << UINT32 ArrayNum = 0; >>
457 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
459 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
462 dataStructFieldUser [BOOLEAN FieldInUnion]:
463 << UINT32 ArrayNum = 0; >>
467 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
469 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnion), T); >>
472 //*****************************************************************************
474 // the syntax of GUID definition
476 guidSubDefinition [EFI_GUID &Guid] :
477 G4:Number "," G5:Number "," G6:Number "," G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number
479 Guid.Data4[0] = _STOU8(G4->getText(), G4->getLine());
480 Guid.Data4[1] = _STOU8(G5->getText(), G5->getLine());
481 Guid.Data4[2] = _STOU8(G6->getText(), G6->getLine());
482 Guid.Data4[3] = _STOU8(G7->getText(), G7->getLine());
483 Guid.Data4[4] = _STOU8(G8->getText(), G8->getLine());
484 Guid.Data4[5] = _STOU8(G9->getText(), G9->getLine());
485 Guid.Data4[6] = _STOU8(G10->getText(), G10->getLine());
486 Guid.Data4[7] = _STOU8(G11->getText(), G11->getLine());
490 guidDefinition [EFI_GUID &Guid] :
492 G1:Number "," G2:Number "," G3:Number ","
494 Guid.Data1 = _STOU32 (G1->getText(), G1->getLine());
495 Guid.Data2 = _STOU16 (G2->getText(), G2->getLine());
496 Guid.Data3 = _STOU16 (G3->getText(), G3->getLine());
499 OpenBrace guidSubDefinition[Guid] CloseBrace
500 | guidSubDefinition[Guid]
505 //*****************************************************************************
507 // the syntax of form set definition
509 vfrFormSetDefinition :
512 EFI_GUID DefaultClassGuid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID;
513 EFI_GUID ClassGuid1, ClassGuid2, ClassGuid3;
514 UINT8 ClassGuidNum = 0;
515 CIfrFormSet *FSObj = NULL;
517 CHAR8* InsertOpcodeAddr = NULL;
520 Uuid "=" guidDefinition[Guid] ","
521 Title "=" "STRING_TOKEN" "\(" S1:Number "\)" ","
522 Help "=" "STRING_TOKEN" "\(" S2:Number "\)" ","
524 ClassGuid "=" guidDefinition[ClassGuid1] << ++ClassGuidNum; >>
526 "\|" guidDefinition[ClassGuid2] << ++ClassGuidNum; >>
528 "\|" guidDefinition[ClassGuid3] << ++ClassGuidNum; >>
534 if (mOverrideClassGuid != NULL && ClassGuidNum >= 3) {
535 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Already has 3 class guids, can't add extra class guid!");
537 switch (ClassGuidNum) {
539 if (mOverrideClassGuid != NULL) {
544 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));
545 FSObj->SetClassGuid(&DefaultClassGuid);
546 if (mOverrideClassGuid != NULL) {
547 FSObj->SetClassGuid(mOverrideClassGuid);
551 if (mOverrideClassGuid != NULL) {
554 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));
555 FSObj->SetClassGuid(&ClassGuid1);
556 if (mOverrideClassGuid != NULL) {
557 FSObj->SetClassGuid(mOverrideClassGuid);
561 if (mOverrideClassGuid != NULL) {
564 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));
565 FSObj->SetClassGuid(&ClassGuid1);
566 FSObj->SetClassGuid(&ClassGuid2);
567 if (mOverrideClassGuid != NULL) {
568 FSObj->SetClassGuid(mOverrideClassGuid);
572 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID));
573 FSObj->SetClassGuid(&ClassGuid1);
574 FSObj->SetClassGuid(&ClassGuid2);
575 FSObj->SetClassGuid(&ClassGuid3);
581 SET_LINE_INFO (*FSObj, L);
582 FSObj->SetGuid (&Guid);
584 // for framework vfr to store formset guid used by varstore and efivarstore
586 if (mCompatibleMode) {
587 memcpy (&mFormsetGuid, &Guid, sizeof (EFI_GUID));
589 FSObj->SetFormSetTitle (_STOSID(S1->getText(), S1->getLine()));
590 FSObj->SetHelp (_STOSID(S2->getText(), S2->getLine()));
593 FC:Class "=" classDefinition[C] "," << {CIfrClass CObj;SET_LINE_INFO (CObj, FC); CObj.SetClass(C);} >>
596 FSC:Subclass "=" subclassDefinition[SC] "," << {CIfrSubClass SCObj; SET_LINE_INFO (SCObj, FSC); SCObj.SetSubClass(SC);} >>
599 _DeclareStandardDefaultStorage (GET_LINENO (L));
603 if (mCompatibleMode) {
605 // declare all undefined varstore and efivarstore
607 _DeclareDefaultFrameworkVarStore (GET_LINENO(E));
611 // Declare undefined Question so that they can be used in expression.
613 if (gCFormPkg.HavePendingUnassigned()) {
614 mParserStatus += gCFormPkg.DeclarePendingQuestion (
622 gNeedAdjustOpcode = TRUE;
628 // Adjust the pending question position.
629 // Move the position from current to before the end of the last form in the form set.
631 if (gNeedAdjustOpcode) {
632 gCFormPkg.AdjustDynamicInsertOpcode (
649 vfrFormMapDefinition |
651 vfrStatementVarStoreLinear |
652 vfrStatementVarStoreEfi |
653 vfrStatementVarStoreNameValue |
654 vfrStatementDefaultStore |
655 vfrStatementDisableIfFormSet |
656 vfrStatementSuppressIfFormSet |
657 vfrStatementExtension
661 vfrStatementExtension:
664 CIfrGuid *GuidObj = NULL;
665 CHAR8 *TypeName = NULL;
667 UINT8 *DataBuff = NULL;
671 BOOLEAN IsStruct = FALSE;
675 Uuid "=" guidDefinition[Guid]
678 U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText(), AN1->getLine());>>}
679 << TypeName = U64->getText(); LineNum = U64->getLine(); >>
680 | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText(), AN2->getLine());>>}
681 << TypeName = U32->getText(); LineNum = U32->getLine(); >>
682 | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText(), AN3->getLine());>>}
683 << TypeName = U16->getText(); LineNum = U16->getLine(); >>
684 | U8:"UINT8" {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText(), AN4->getLine());>>}
685 << TypeName = U8->getText(); LineNum = U8->getLine(); >>
686 | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText(), AN5->getLine());>>}
687 << TypeName = BL->getText(); LineNum = BL->getLine(); >>
688 | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText(), AN6->getLine());>>}
689 << TypeName = SI->getText(); LineNum = SI->getLine(); >>
690 | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText(), AN7->getLine());>>}
691 << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>>
692 | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText(), AN8->getLine());>>}
693 << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>>
694 | R:"EFI_HII_REF" {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText(), AN9->getLine());>>}
695 << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>>
696 | TN:StringIdentifier {OpenBracket AN10:Number CloseBracket <<ArrayNum = _STOU32(AN10->getText(), AN10->getLine());>>}
697 << TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>>
700 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &TypeSize), LineNum);
702 Size = TypeSize*ArrayNum;
706 if (Size > (128 - sizeof (EFI_IFR_GUID))) return;
707 DataBuff = (UINT8 *)malloc(Size);
708 for (Idx = 0; Idx < Size; Idx++) {
712 vfrExtensionData [DataBuff, Size, TypeName, TypeSize, IsStruct, ArrayNum]
716 GuidObj = new CIfrGuid(Size);
717 if (GuidObj != NULL) {
718 GuidObj->SetLineNo(L->getLine());
719 GuidObj->SetGuid (&Guid);
722 if (TypeName != NULL) {
723 GuidObj->SetData(DataBuff, Size);
728 vfrStatementExtension
730 E:EndGuidOp << GuidObj->SetScope(1); CRT_END_OP (E); >>
733 if (GuidObj != NULL) delete GuidObj;
734 if (DataBuff != NULL) free(DataBuff);
739 vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, BOOLEAN IsStruct, UINT32 ArrayNum]:
741 CHAR8 *TFName = NULL;
751 EFI_STRING_ID Data_SID = 0;
752 BOOLEAN IsArray = FALSE;
753 UINT8 *ByteOffset = NULL;
756 ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>}
759 if (IsArray == TRUE) {
760 ArrayIdx = _STOU8(IDX1->getText(), IDX1->getLine());
761 if (ArrayIdx >= ArrayNum) return;
764 ByteOffset = DataBuff + (ArrayIdx * TypeSize);
765 if (IsStruct == TRUE) {
766 _STRCAT(&TFName, TypeName);
769 ("." FN:StringIdentifier
771 if (IsStruct == TRUE) {
772 _STRCAT(&TFName, ".");
773 _STRCAT(&TFName, FN->getText());
777 OpenBracket IDX2:Number CloseBracket
779 if (IsStruct == TRUE) {
780 _STRCAT(&TFName, "[");
781 _STRCAT(&TFName, IDX2->getText());
782 _STRCAT(&TFName, "]");
789 if (IsStruct == FALSE) {
790 if (strcmp ("UINT64", TypeName) == 0) {
791 Data_U64 = _STOU64(RD->getText(), RD->getLine());
792 memcpy (ByteOffset, &Data_U64, TypeSize);
793 }else if (strcmp ("UINT32", TypeName) == 0) {
794 Data_U32 = _STOU32(RD->getText(), RD->getLine());
795 memcpy (ByteOffset, &Data_U32, TypeSize);
796 }else if (strcmp ("UINT16", TypeName) == 0) {
797 Data_U16 = _STOU16(RD->getText(), RD->getLine());
798 memcpy (ByteOffset, &Data_U16, TypeSize);
799 }else if (strcmp ("UINT8", TypeName) == 0) {
800 Data_U8 = _STOU8(RD->getText(), RD->getLine());
801 memcpy (ByteOffset, &Data_U8, TypeSize);
802 }else if (strcmp ("BOOLEAN", TypeName)== 0) {
803 Data_BL = _STOU8(RD->getText(), RD->getLine());
804 memcpy (ByteOffset, &Data_BL, TypeSize);
805 }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) {
806 Data_SID = _STOSID(RD->getText(), RD->getLine());
807 memcpy (ByteOffset, &Data_SID, TypeSize);
810 gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize);
812 case EFI_IFR_TYPE_NUM_SIZE_8:
813 Data_U8 = _STOU8(RD->getText(), RD->getLine());
814 memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize);
816 case EFI_IFR_TYPE_NUM_SIZE_16:
817 Data_U16 = _STOU16(RD->getText(), RD->getLine());
818 memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize);
820 case EFI_IFR_TYPE_NUM_SIZE_32:
821 Data_U32 = _STOU32(RD->getText(), RD->getLine());
822 memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize);
824 case EFI_IFR_TYPE_NUM_SIZE_64:
825 Data_U64 = _STOU64(RD->getText(), RD->getLine());
826 memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize);
828 case EFI_IFR_TYPE_BOOLEAN:
829 Data_BL = _STOU8(RD->getText(), RD->getLine());
830 memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize);
832 case EFI_IFR_TYPE_STRING:
833 Data_SID = _STOSID(RD->getText(), RD->getLine());
834 memcpy (ByteOffset + FieldOffset, &Data_SID, FieldSize);
840 if (TFName != NULL) { delete TFName; TFName = NULL; }
847 vfrStatementDefaultStore :
848 << UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>
849 D:DefaultStore N:StringIdentifier ","
850 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)"
852 "," Attribute "=" A:Number << DefaultId = _STOU16(A->getText(), A->getLine()); >>
855 if (gCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {
856 CIfrDefaultStore DSObj;
857 _PCATCH(gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine();
858 DSObj.SetLineNo(D->getLine());
859 DSObj.SetDefaultName (_STOSID(S->getText(), S->getLine()));
860 DSObj.SetDefaultId (DefaultId);
862 _PCATCH(gCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine();
868 vfrStatementVarStoreLinear :
875 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;
878 V:Varstore << VSObj.SetLineNo(V->getLine()); >>
880 TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>
881 | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>
882 | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>
883 | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>
884 | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >>
885 | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>
886 | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>
887 | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>
888 | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >>
890 { Key "=" FID:Number "," << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR
891 if (mCompatibleMode) {
892 VarStoreId = _STOU16(FID->getText(), FID->getLine());
897 VarId "=" ID:Number "," <<
899 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,
902 "varid 0 is not allowed."
906 Name "=" SN:StringIdentifier ","
907 Uuid "=" guidDefinition[Guid]
909 if (mCompatibleMode) {
910 StoreName = TypeName;
912 StoreName = SN->getText();
914 _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (
921 VSObj.SetGuid (&Guid);
922 _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);
923 VSObj.SetVarStoreId (VarStoreId);
924 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);
925 VSObj.SetSize ((UINT16) Size);
926 VSObj.SetName (SN->getText());
931 vfrStatementVarStoreEfi :
933 BOOLEAN IsUEFI23EfiVarstore = TRUE;
935 CIfrVarStoreEfi VSEObj;
936 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;
941 CHAR8 *StoreName = NULL;
942 BOOLEAN CustomizedName = FALSE;
944 E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >>
946 TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; >>
947 | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >>
948 | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >>
949 | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >>
950 | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >>
951 | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >>
952 | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >>
953 | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >>
954 | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >>
957 VarId "=" ID:Number "," <<
959 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,
962 "varid 0 is not allowed."
966 Attribute "=" vfrVarStoreEfiAttr[Attr] ( "\|" vfrVarStoreEfiAttr[Attr] )* ","
967 << VSEObj.SetAttributes (Attr); >>
970 Name "=" SN:StringIdentifier "," << StoreName = SN->getText(); >>
972 Name "=" "STRING_TOKEN" "\(" VN:Number "\)" ","
973 VarSize "=" N:Number "," <<
974 IsUEFI23EfiVarstore = FALSE;
975 StoreName = gCVfrStringDB.GetVarStoreNameFormStringId(_STOSID(VN->getText(), VN->getLine()));
976 if (StoreName == NULL) {
977 _PCATCH (VFR_RETURN_UNSUPPORTED, VN->getLine(), "Can't get varstore name for this StringId!");
979 if (!CustomizedName) {
980 _PCATCH (VFR_RETURN_UNSUPPORTED, E->getLine(), "Old style efivarstore must have String Identifier!");
983 Size = _STOU32(N->getText(), N->getLine());
986 TypeName = (CHAR8 *) "UINT8";
989 TypeName = (CHAR8 *) "UINT16";
992 TypeName = (CHAR8 *) "UINT32";
995 TypeName = (CHAR8 *) "UINT64";
998 _PCATCH (VFR_RETURN_UNSUPPORTED, N);
1004 Uuid "=" guidDefinition[Guid] <<
1005 if (IsUEFI23EfiVarstore) {
1006 _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (
1009 &gCVfrVarDataTypeDB,
1013 _PCATCH(gCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN);
1014 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);
1016 _PCATCH(gCVfrDataStorage.DeclareBufferVarStore (
1019 &gCVfrVarDataTypeDB,
1023 _PCATCH(gCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN);
1024 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine());
1026 VSEObj.SetGuid (&Guid);
1027 VSEObj.SetVarStoreId (VarStoreId);
1029 VSEObj.SetSize ((UINT16) Size);
1030 VSEObj.SetName (StoreName);
1031 if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) {
1038 vfrVarStoreEfiAttr [UINT32 & Attr] :
1039 N:Number << $Attr |= _STOU32(N->getText(), N->getLine()); >>
1042 vfrStatementVarStoreNameValue :
1045 CIfrVarStoreNameValue VSNVObj;
1046 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;
1047 BOOLEAN Created = FALSE;
1049 L:NameValueVarStore << VSNVObj.SetLineNo(L->getLine()); >>
1050 SN:StringIdentifier ","
1052 VarId "=" ID:Number "," <<
1054 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0,
1057 "varid 0 is not allowed."
1062 Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," <<
1064 _PCATCH(gCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN);
1067 _PCATCH(gCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN);
1070 Uuid "=" guidDefinition[Guid] << _PCATCH(gCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>
1072 VSNVObj.SetGuid (&Guid);
1073 _PCATCH(gCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN);
1074 VSNVObj.SetVarStoreId (VarStoreId);
1080 // keep classDeinition and validClassNames for compatibility but not generate
1083 classDefinition[UINT16 & Class] :
1085 validClassNames[$Class] ( "\|" validClassNames[$Class] )*
1088 validClassNames[UINT16 & Class] :
1089 ClassNonDevice << $Class |= EFI_NON_DEVICE_CLASS; >>
1090 | ClassDiskDevice << $Class |= EFI_DISK_DEVICE_CLASS; >>
1091 | ClassVideoDevice << $Class |= EFI_VIDEO_DEVICE_CLASS; >>
1092 | ClassNetworkDevice << $Class |= EFI_NETWORK_DEVICE_CLASS; >>
1093 | ClassInputDevice << $Class |= EFI_INPUT_DEVICE_CLASS; >>
1094 | ClassOnBoardDevice << $Class |= EFI_ON_BOARD_DEVICE_CLASS; >>
1095 | ClassOtherDevice << $Class |= EFI_OTHER_DEVICE_CLASS; >>
1096 | N:Number << $Class |= _STOU16(N->getText(), N->getLine()); >>
1099 subclassDefinition[UINT16 & SubClass] :
1100 << $SubClass = 0; >>
1101 SubclassSetupApplication << $SubClass |= EFI_SETUP_APPLICATION_SUBCLASS; >>
1102 | SubclassGeneralApplication << $SubClass |= EFI_GENERAL_APPLICATION_SUBCLASS; >>
1103 | SubclassFrontPage << $SubClass |= EFI_FRONT_PAGE_SUBCLASS; >>
1104 | SubclassSingleUse << $SubClass |= EFI_SINGLE_USE_SUBCLASS; >>
1105 | N:Number << $SubClass |= _STOU16(N->getText(), N->getLine()); >>
1108 vfrStatementDisableIfFormSet :
1110 CIfrDisableIf DIObj;
1111 mConstantOnlyInExpression = TRUE;
1113 D:DisableIf << DIObj.SetLineNo(D->getLine()); >>
1114 vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >>
1116 E:EndIf << CRT_END_OP (E); >>
1120 vfrStatementSuppressIfFormSet :
1121 << CIfrSuppressIf SIObj;>>
1123 if (mCompatibleMode) {
1124 _PCATCH (VFR_RETURN_UNSUPPORTED, L);
1126 SIObj.SetLineNo(L->getLine());
1128 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
1129 vfrStatementExpression[0] ";"
1132 ";" << CRT_END_OP (E); >>
1135 //*****************************************************************************
1137 // the syntax of question header and statement header
1139 vfrStatementHeader[CIfrStatementHeader *SHObj] :
1140 Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText(), S1->getLine())); >>
1141 Help "=" "STRING_TOKEN" "\(" S2:Number "\)" << $SHObj->SetHelp (_STOSID(S2->getText(), S2->getLine())); >>
1144 vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:
1146 EFI_VARSTORE_INFO Info;
1147 Info.mVarType = EFI_IFR_TYPE_OTHER;
1148 Info.mVarTotalSize = 0;
1149 Info.mInfo.mVarOffset = EFI_VAROFFSET_INVALID;
1150 Info.mVarStoreId = EFI_VARSTORE_ID_INVALID;
1151 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
1152 CHAR8 *QName = NULL;
1153 CHAR8 *VarIdStr = NULL;
1154 mUsedDefaultCount = 0;
1157 Name "=" QN:StringIdentifier "," <<
1158 QName = QN->getText();
1159 _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");
1162 { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }
1164 QuestionId "=" ID:Number "," <<
1165 QId = _STOQID(ID->getText(), ID->getLine());
1166 _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");
1171 case QUESTION_NORMAL:
1172 mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);
1175 mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);
1178 mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);
1182 // VarIdStr != NULL stand for question with storagae.
1184 if (VarIdStr != NULL) {
1185 mCVfrQuestionDB.RegisterRefQuestion (QName, VarIdStr, QId);
1187 mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);
1191 _PCATCH(VFR_RETURN_FATAL_ERROR);
1193 $QHObj.SetQuestionId (QId);
1194 if (VarIdStr != NULL) {
1195 $QHObj.SetVarStoreInfo (&Info);
1198 vfrStatementHeader[&$QHObj]
1200 if (VarIdStr != NULL) {
1203 _SAVE_CURRQEST_VARINFO (Info);
1207 questionheaderFlagsField[UINT8 & Flags] :
1208 ReadOnlyFlag << $Flags |= 0x01; >>
1209 | InteractiveFlag << $Flags |= 0x04; >>
1210 | ResetRequiredFlag << $Flags |= 0x10; >>
1211 | ReconnectRequiredFlag << $Flags |= 0x40; >>
1212 | O:OptionOnlyFlag <<
1213 if (mCompatibleMode) {
1216 gCVfrErrorHandle.HandleWarning (
1217 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,
1224 if (!mCompatibleMode) {
1225 gCVfrErrorHandle.HandleWarning (
1226 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,
1232 | L:LateCheckFlag <<
1233 if (!mCompatibleMode) {
1234 gCVfrErrorHandle.HandleWarning (
1235 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,
1243 vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFlag = TRUE] :
1247 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;
1248 CHAR8 *VarIdStr = NULL;
1249 CHAR8 *VarStr = NULL;
1250 CHAR8 *SName = NULL;
1251 CHAR8 *TName = NULL;
1252 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;
1253 EFI_IFR_TYPE_VALUE Dummy = gZeroEfiIfrTypeValue;
1254 EFI_GUID *VarGuid = NULL;
1257 SN1:StringIdentifier << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>
1258 OpenBracket I1:Number CloseBracket <<
1259 Idx = _STOU32(I1->getText(), I1->getLine());
1260 _STRCAT(&VarIdStr, "[");
1261 _STRCAT(&VarIdStr, I1->getText());
1262 _STRCAT(&VarIdStr, "]");
1265 VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);
1266 if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {
1267 gCVfrDataStorage.DeclareBufferVarStore (
1270 &gCVfrVarDataTypeDB,
1272 EFI_VARSTORE_ID_INVALID,
1275 VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);
1277 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {
1278 _PCATCH(VfrReturnCode, SN1);
1279 _PCATCH(gCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);
1282 QuestVarIdStr = VarIdStr;
1287 SN2:StringIdentifier << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>
1289 VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId);
1290 if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) {
1291 gCVfrDataStorage.DeclareBufferVarStore (
1294 &gCVfrVarDataTypeDB,
1296 EFI_VARSTORE_ID_INVALID,
1299 VfrReturnCode = gCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid);
1301 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {
1302 _PCATCH(VfrReturnCode, SN2);
1303 VarStoreType = gCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId);
1304 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {
1305 _PCATCH(gCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2);
1306 _STRCAT(&VarStr, TName);
1313 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) {
1314 _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);
1316 _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");
1318 SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>
1320 OpenBracket I2:Number CloseBracket <<
1321 Idx = _STOU32(I2->getText(), I2->getLine());
1322 if (mCompatibleMode) Idx --;
1325 // Idx == 0, [0] can be ignored.
1326 // Array[0] is same to Array for unify the varid name to cover [0]
1328 _STRCAT(&VarIdStr, "[");
1329 _STRCAT(&VarIdStr, I2->getText());
1330 _STRCAT(&VarIdStr, "]");
1332 _STRCAT(&VarStr, "[");
1333 _STRCAT(&VarStr, I2->getText());
1334 _STRCAT(&VarStr, "]");
1338 switch (VarStoreType) {
1339 case EFI_VFR_VARSTORE_EFI:
1340 _PCATCH(gCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);
1342 case EFI_VFR_VARSTORE_BUFFER:
1343 _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr);
1344 VarGuid = gCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId);
1345 _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register (
1350 _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Write (
1356 $Info.mInfo.mVarOffset,
1357 $Info.mVarTotalSize,
1360 _PCATCH(gCVfrDataStorage.AddBufferVarStoreFieldInfo(&$Info ),SN2->getLine());
1362 case EFI_VFR_VARSTORE_NAME:
1366 QuestVarIdStr = VarIdStr;
1367 if (VarStr != NULL) {delete VarStr;}
1372 vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr, UINT32 &LineNo] :
1375 VarIdStr = NULL; LineNo = 0;
1378 SN1:StringIdentifier << _STRCAT(&VarIdStr, SN1->getText()); LineNo = SN1->getLine(); >>
1379 OpenBracket I1:Number CloseBracket <<
1380 _STRCAT(&VarIdStr, "[");
1381 _STRCAT(&VarIdStr, I1->getText());
1382 _STRCAT(&VarIdStr, "]");
1383 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask);
1384 if (mConstantOnlyInExpression) {
1385 _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo);
1391 SN2:StringIdentifier << _STRCAT (&VarIdStr, SN2->getText()); LineNo = SN2->getLine(); >>
1394 _STRCAT (&VarIdStr, ".");
1395 if (mConstantOnlyInExpression) {
1396 _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo);
1399 SF:StringIdentifier << _STRCAT (&VarIdStr, SF->getText()); >>
1401 OpenBracket I2:Number CloseBracket <<
1402 Idx = _STOU32(I2->getText(), I2->getLine());
1403 if (mCompatibleMode) Idx --;
1406 // Idx == 0, [0] can be ignored.
1407 // Array[0] is same to Array
1409 _STRCAT(&VarIdStr, "[");
1410 _STRCAT(&VarIdStr, I2->getText());
1411 _STRCAT(&VarIdStr, "]");
1416 << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>
1420 vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :
1423 BOOLEAN Negative = FALSE;
1424 BOOLEAN IntDecStyle = FALSE;
1425 CIfrNumeric *NumericQst = NULL;
1426 if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {
1427 NumericQst = (CIfrNumeric *) gCurrentQuestion;
1428 IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE;
1430 UINT8 *Type8 = (UINT8 *) &Value;
1431 UINT16 *Type16 = (UINT16 *) &Value;
1432 UINT32 *Type32 = (UINT32 *) &Value;
1433 UINT64 *Type64 = (UINT64 *) &Value;
1438 "\-" << Negative = TRUE; >>
1442 case EFI_IFR_TYPE_NUM_SIZE_8 :
1443 $Value.u8 = _STOU8(N1->getText(), N1->getLine());
1446 if ($Value.u8 > 0x80) {
1447 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");
1450 if ($Value.u8 > 0x7F) {
1451 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");
1456 $Value.u8 = ~$Value.u8 + 1;
1459 case EFI_IFR_TYPE_NUM_SIZE_16 :
1460 $Value.u16 = _STOU16(N1->getText(), N1->getLine());
1463 if ($Value.u16 > 0x8000) {
1464 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");
1467 if ($Value.u16 > 0x7FFF) {
1468 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");
1473 $Value.u16 = ~$Value.u16 + 1;
1476 case EFI_IFR_TYPE_NUM_SIZE_32 :
1477 $Value.u32 = _STOU32(N1->getText(), N1->getLine());
1480 if ($Value.u32 > 0x80000000) {
1481 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");
1484 if ($Value.u32 > 0X7FFFFFFF) {
1485 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");
1490 $Value.u32 = ~$Value.u32 + 1;
1493 case EFI_IFR_TYPE_NUM_SIZE_64 :
1494 $Value.u64 = _STOU64(N1->getText(), N1->getLine());
1497 if ($Value.u64 > 0x8000000000000000) {
1498 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");
1501 if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) {
1502 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");
1507 $Value.u64 = ~$Value.u64 + 1;
1510 case EFI_IFR_TYPE_BOOLEAN :
1511 $Value.b = _STOU8(N1->getText(), N1->getLine());
1513 case EFI_IFR_TYPE_STRING :
1514 $Value.string = _STOU16(N1->getText(), N1->getLine());
1516 case EFI_IFR_TYPE_TIME :
1517 case EFI_IFR_TYPE_DATE :
1518 case EFI_IFR_TYPE_REF :
1523 | B1:True << $Value.b = TRUE; >>
1524 | B2:False << $Value.b = FALSE; >>
1525 | O1:One << $Value.u8 = _STOU8(O1->getText(), O1->getLine()); >>
1526 | O2:Ones << $Value.u64 = _STOU64(O2->getText(), O2->getLine()); >>
1527 | Z:Zero << $Value.u8 = _STOU8(Z->getText(), Z->getLine()); >>
1528 | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(),SECOND->getText(), HOUR->getLine()); >>
1529 | YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText(), YEAR->getLine()); >>
1530 | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)"
1531 << $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>
1532 | "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>
1533 | "\{" << ListType = TRUE; >>
1536 case EFI_IFR_TYPE_NUM_SIZE_8 :
1537 Type8[Index] = _STOU8(L1->getText(), L1->getLine());
1539 case EFI_IFR_TYPE_NUM_SIZE_16 :
1540 Type16[Index] = _STOU16(L1->getText(), L1->getLine());
1542 case EFI_IFR_TYPE_NUM_SIZE_32 :
1543 Type32[Index] = _STOU32(L1->getText(), L1->getLine());
1545 case EFI_IFR_TYPE_NUM_SIZE_64 :
1546 Type64[Index] = _STOU64(L1->getText(), L1->getLine());
1557 case EFI_IFR_TYPE_NUM_SIZE_8 :
1558 Type8[Index] = _STOU8(L2->getText(), L2->getLine());
1560 case EFI_IFR_TYPE_NUM_SIZE_16 :
1561 Type16[Index] = _STOU16(L2->getText(), L2->getLine());
1563 case EFI_IFR_TYPE_NUM_SIZE_32 :
1564 Type32[Index] = _STOU32(L2->getText(), L2->getLine());
1566 case EFI_IFR_TYPE_NUM_SIZE_64 :
1567 Type64[Index] = _STOU64(L2->getText(), L2->getLine());
1578 //*****************************************************************************
1580 // the syntax of form definition
1583 << CIfrForm FObj; >>
1584 F:Form << FObj.SetLineNo(F->getLine()); >>
1585 FormId "=" S1:Number "," << _PCATCH(FObj.SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>
1586 Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";" << FObj.SetFormTitle (_STOSID(S2->getText(), S2->getLine())); >>
1589 vfrStatementLocked |
1591 vfrStatementDefault |
1593 vfrStatementQuestions |
1594 vfrStatementConditional |
1596 vfrStatementBanner |
1597 // Just for framework vfr compatibility
1598 vfrStatementInvalid |
1599 vfrStatementExtension |
1601 vfrStatementRefreshEvent ";"
1604 if (mCompatibleMode) {
1606 // Add Label for Framework Vfr
1609 LObj1.SetLineNo(E->getLine());
1610 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff
1612 LObj2.SetLineNo(E->getLine());
1613 LObj2.SetNumber (0x0); //add dummy label for UEFI, label number hardcode 0x0
1615 LObj3.SetLineNo(E->getLine());
1616 LObj3.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff
1619 {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();}
1624 vfrFormMapDefinition :
1626 CIfrFormMap *FMapObj = NULL;
1627 UINT32 FormMapMethodNumber = 0;
1630 F:FormMap << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >>
1631 FormId "=" S1:Number "," << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >>
1633 MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"
1634 MapGuid "=" guidDefinition[Guid] ";" << FMapObj->SetFormMapMethod (_STOFID(S2->getText(), S2->getLine()), &Guid); FormMapMethodNumber ++; >>
1635 )* << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>>
1638 vfrStatementLocked |
1640 vfrStatementDefault |
1642 vfrStatementQuestions |
1643 vfrStatementConditional |
1645 vfrStatementBanner |
1646 vfrStatementExtension |
1648 vfrStatementRefreshEvent ";"
1650 E:EndForm << CRT_END_OP (E); >>
1655 << CIfrRule RObj; >>
1656 R:Rule << RObj.SetLineNo(R->getLine()); >>
1657 S1:StringIdentifier "," <<
1658 mCVfrRulesDB.RegisterRule (S1->getText());
1659 RObj.SetRuleId (mCVfrRulesDB.GetRuleId(S1->getText()));
1661 vfrStatementExpression[0]
1662 E:EndRule << CRT_END_OP (E); >>
1666 vfrStatementDefault :
1668 BOOLEAN IsExp = FALSE;
1669 UINT64 ValueList[EFI_IFR_MAX_LENGTH] = {0,};
1670 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;
1671 CIfrDefault *DObj = NULL;
1672 CIfrDefault2 *DObj2 = NULL;
1673 EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
1674 CHAR8 *VarStoreName = NULL;
1675 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;
1677 EFI_GUID *VarGuid = NULL;
1678 BOOLEAN ArrayType = FALSE;
1679 UINT8 *Type8 = (UINT8 *) ValueList;
1680 UINT16 *Type16 = (UINT16 *) ValueList;
1681 UINT32 *Type32 = (UINT32 *) ValueList;
1682 UINT64 *Type64 = (UINT64 *) ValueList;
1683 CIfrNumeric *NumericQst = NULL;
1689 "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","
1691 if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {
1692 //check default value is valid for Numeric Opcode
1693 NumericQst = (CIfrNumeric *) gCurrentQuestion;
1694 if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0) {
1695 switch (_GET_CURRQEST_DATATYPE()) {
1696 case EFI_IFR_TYPE_NUM_SIZE_8:
1697 if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) ||
1698 ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {
1699 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");
1702 case EFI_IFR_TYPE_NUM_SIZE_16:
1703 if (((INT16) Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) ||
1704 ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {
1705 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");
1708 case EFI_IFR_TYPE_NUM_SIZE_32:
1709 if (((INT32) Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) ||
1710 ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {
1711 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");
1714 case EFI_IFR_TYPE_NUM_SIZE_64:
1715 if (((INT64) Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) ||
1716 ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {
1717 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");
1724 if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {
1725 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");
1729 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {
1730 _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");
1731 Size = sizeof (EFI_IFR_TYPE_VALUE);
1732 } else if (ArrayType) {
1733 switch (_GET_CURRQEST_DATATYPE()) {
1734 case EFI_IFR_TYPE_NUM_SIZE_8 :
1735 while (Type8[Size] != 0) {
1739 case EFI_IFR_TYPE_NUM_SIZE_16 :
1740 while (Type16[Size] != 0) {
1743 Size *= sizeof (UINT16);
1746 case EFI_IFR_TYPE_NUM_SIZE_32 :
1747 while (Type32[Size] != 0) {
1750 Size *= sizeof (UINT32);
1753 case EFI_IFR_TYPE_NUM_SIZE_64 :
1754 while (Type64[Size] != 0) {
1757 Size *= sizeof (UINT64);
1764 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());
1766 Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);
1767 DObj = new CIfrDefault ((UINT8)Size);
1768 DObj->SetLineNo(D->getLine());
1770 DObj->SetType (EFI_IFR_TYPE_BUFFER);
1771 } else if (gIsStringOp) {
1772 DObj->SetType (EFI_IFR_TYPE_STRING);
1774 DObj->SetType (_GET_CURRQEST_DATATYPE());
1776 DObj->SetValue(*Val);
1778 | << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>
1779 vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>
1782 DefaultStore "=" SN:StringIdentifier "," <<
1783 _PCATCH(gCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN);
1785 DObj->SetDefaultId (DefaultId);
1788 if (DObj2 != NULL) {
1789 DObj2->SetDefaultId (DefaultId);
1794 CheckDuplicateDefaultValue (DefaultId, D);
1795 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
1796 _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());
1797 VarGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);
1798 VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);
1799 if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {
1800 _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (
1802 _GET_CURRQEST_VARTINFO(),
1805 _GET_CURRQEST_DATATYPE (),
1811 if (DObj != NULL) {delete DObj;}
1812 if (DObj2 != NULL) {delete DObj2;}
1818 vfrStatementSubTitle |
1819 vfrStatementStaticText |
1820 vfrStatementCrossReference
1823 vfrStatementQuestions :
1824 vfrStatementBooleanType |
1826 vfrStatementNumericType |
1827 vfrStatementStringType |
1828 vfrStatementOrderedList |
1832 vfrStatementConditional :
1833 vfrStatementDisableIfStat |
1834 vfrStatementSuppressIfStat | //enhance to be compatible for framework endif
1835 vfrStatementGrayOutIfStat |
1836 vfrStatementInconsistentIfStat //to be compatible for framework
1839 vfrStatementConditionalNew :
1840 vfrStatementDisableIfStat |
1841 vfrStatementSuppressIfStatNew |
1842 vfrStatementGrayOutIfStatNew |
1843 vfrStatementInconsistentIfStat //to be compatible for framework
1846 vfrStatementSuppressIfStat :
1847 <<mCompatibleMode>>? vfrStatementSuppressIfStatOld
1848 | vfrStatementSuppressIfStatNew
1851 vfrStatementGrayOutIfStat :
1852 <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld
1853 | vfrStatementGrayOutIfStatNew
1856 vfrStatementInvalid :
1858 vfrStatementInvalidHidden |
1859 vfrStatementInvalidInventory |
1860 vfrStatementInvalidSaveRestoreDefaults
1862 << _CRT_OP (TRUE); >>
1871 | ReconnectRequiredFlag
1873 if (!mCompatibleMode) {
1874 gCVfrErrorHandle.HandleWarning (
1875 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,
1881 | L:LateCheckFlag <<
1882 if (!mCompatibleMode) {
1883 gCVfrErrorHandle.HandleWarning (
1884 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,
1893 << CIfrValue VObj; >>
1894 V:Value << VObj.SetLineNo(V->getLine()); >>
1895 "=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >>
1899 << CIfrRead RObj; >>
1900 R:Read << RObj.SetLineNo(R->getLine()); >>
1901 vfrStatementExpression[0] ";"
1905 << CIfrWrite WObj; >>
1906 W:Write << WObj.SetLineNo(W->getLine()); >>
1907 vfrStatementExpression[0] ";"
1910 vfrStatementSubTitle :
1911 << CIfrSubtitle SObj; >>
1912 L:Subtitle << SObj.SetLineNo(L->getLine()); >>
1913 Text "=" "STRING_TOKEN" "\(" S:Number "\)" << SObj.SetPrompt (_STOSID(S->getText(), S->getLine())); >>
1915 "," FLAGS "=" vfrSubtitleFlags[SObj]
1918 {vfrStatementStatTagList "," }
1919 E:";" << CRT_END_OP (E); >>
1921 { "," vfrStatementStatTagList}
1922 { "," (vfrStatementStat | vfrStatementQuestions)*}
1923 D: EndSubtitle ";" << CRT_END_OP (D); >>
1927 vfrSubtitleFlags [CIfrSubtitle & SObj] :
1928 << UINT8 LFlags = 0; >>
1929 subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )*
1930 << _PCATCH(SObj.SetFlags (LFlags)); >>
1933 subtitleFlagsField [UINT8 & Flags] :
1934 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>
1935 | "HORIZONTAL" << $Flags |= 0x01; >>
1938 vfrStatementStaticText :
1941 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
1942 EFI_STRING_ID TxtTwo = EFI_STRING_ID_INVALID;
1945 Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","
1946 Text "=" "STRING_TOKEN" "\(" S2:Number "\)"
1948 "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)" << TxtTwo = _STOSID(S3->getText(), S3->getLine()); >>
1951 "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*
1952 "," Key "=" KN:Number
1955 if (Flags & EFI_IFR_FLAG_CALLBACK) {
1956 if (TxtTwo != EFI_STRING_ID_INVALID) {
1957 gCVfrErrorHandle.HandleWarning (
1958 VFR_WARNING_ACTION_WITH_TEXT_TWO,
1964 mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);
1965 AObj.SetLineNo (F->getLine());
1966 AObj.SetQuestionId (QId);
1967 AObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));
1968 AObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));
1969 _PCATCH(AObj.SetFlags (Flags), F->getLine());
1970 AssignQuestionKey (AObj, KN);
1974 TObj.SetLineNo (T->getLine());
1975 TObj.SetHelp (_STOSID(S1->getText(), S1->getLine()));
1976 TObj.SetPrompt (_STOSID(S2->getText(), S2->getLine()));
1977 TObj.SetTextTwo (TxtTwo);
1980 { "," vfrStatementStatTagList }
1984 staticTextFlagsField[UINT8 & HFlags] :
1985 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
1986 | questionheaderFlagsField[HFlags]
1989 vfrStatementCrossReference :
1991 vfrStatementResetButton
1997 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;
1998 EFI_GUID FSId = {0,};
2000 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
2002 CIfrQuestionHeader *QHObj = NULL;
2003 CIfrOpHeader *OHObj = NULL;
2004 CIfrRef *R1Obj = NULL;
2005 CIfrRef2 *R2Obj = NULL;
2006 CIfrRef3 *R3Obj = NULL;
2007 CIfrRef4 *R4Obj = NULL;
2008 CIfrRef5 *R5Obj = NULL;
2013 DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","
2014 FormSetGuid "=" guidDefinition[FSId] ","
2015 FormId "=" F1:Number ","
2016 Question "=" QN1:Number ","
2019 DevPath = _STOSID(P->getText(), P->getLine());
2020 FId = _STOFID(F1->getText(), F1->getLine());
2021 QId = _STOQID(QN1->getText(), QN1->getLine());
2026 FormSetGuid "=" guidDefinition[FSId] ","
2027 FormId "=" F2:Number ","
2028 Question "=" QN2:Number ","
2031 FId = _STOFID(F2->getText(), F2->getLine());
2032 QId = _STOQID(QN2->getText(), QN2->getLine());
2037 FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >>
2040 QN3:StringIdentifier "," <<
2041 mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask);
2042 if (QId == EFI_QUESTION_ID_INVALID) {
2043 _PCATCH(VFR_RETURN_UNDEFINED, QN3);
2046 | QN4:Number "," << QId = _STOQID(QN4->getText(), QN4->getLine()); >>
2053 FId = _STOFID(F4->getText(), F4->getLine());
2061 R5Obj = new CIfrRef5;
2064 R5Obj->SetLineNo(G->getLine());
2069 R4Obj = new CIfrRef4;
2072 R4Obj->SetLineNo(G->getLine());
2073 R4Obj->SetDevicePath (DevPath);
2074 R4Obj->SetFormSetId (FSId);
2075 R4Obj->SetFormId (FId);
2076 R4Obj->SetQuestionId (QId);
2081 R3Obj = new CIfrRef3;
2084 R3Obj->SetLineNo(G->getLine());
2085 R3Obj->SetFormSetId (FSId);
2086 R3Obj->SetFormId (FId);
2087 R3Obj->SetQuestionId (QId);
2092 R2Obj = new CIfrRef2;
2095 R2Obj->SetLineNo(G->getLine());
2096 R2Obj->SetFormId (FId);
2097 R2Obj->SetQuestionId (QId);
2102 R1Obj = new CIfrRef;
2105 R1Obj->SetLineNo(G->getLine());
2106 R1Obj->SetFormId (FId);
2112 vfrQuestionHeader[*QHObj, QUESTION_REF] <<
2113 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {
2114 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF;
2117 { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }
2119 "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>
2123 vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>>
2125 ";" << if (R1Obj != NULL) {delete R1Obj;} if (R2Obj != NULL) {delete R2Obj;} if (R3Obj != NULL) {delete R3Obj;} if (R4Obj != NULL) {delete R4Obj;} if (R5Obj != NULL) {delete R5Obj;}>>
2128 vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :
2129 << UINT8 HFlags = 0; >>
2130 gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*
2131 << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>
2134 gotoFlagsField[UINT8 & HFlags] :
2135 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
2136 | questionheaderFlagsField[HFlags]
2145 vfrStatementResetButton :
2147 CIfrResetButton RBObj;
2150 L:ResetButton << RBObj.SetLineNo(L->getLine()); >>
2152 "=" N:StringIdentifier "," <<
2153 _PCATCH(gCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());
2154 RBObj.SetDefaultId (DefaultId);
2156 vfrStatementHeader[&RBObj] ","
2157 { vfrStatementStatTagList "," }
2158 E:EndResetButton << CRT_END_OP (E); >>
2162 vfrStatementBooleanType :
2163 vfrStatementCheckBox |
2167 //*****************************************************
2168 // Syntax of checkbox
2172 // varid = MySTestData.mField1,
2173 // prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT),
2174 // help = STRING_TOKEN(STR_CHECK_BOX_HELP),
2175 // flags = CHECKBOX_DEFAULT | CALLBACK,
2176 // default value = TRUE, defaultstore = MyDefaultStore,
2179 vfrStatementCheckBox :
2182 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;
2183 CHAR8 *VarStoreName = NULL;
2184 UINT32 DataTypeSize;
2185 EFI_GUID *VarStoreGuid = NULL;
2187 L:CheckBox << CBObj.SetLineNo(L->getLine()); >>
2188 vfrQuestionHeader[CBObj] "," << //check data type
2189 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {
2190 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN;
2192 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
2193 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type");
2194 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {
2195 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array");
2196 } else if ((gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) &&
2197 (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) {
2198 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type");
2203 F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] ","
2205 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
2206 _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name");
2207 VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);
2209 if (CBObj.GetFlags () & 0x01) {
2210 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);
2212 gCVfrDefaultStore.BufferVarStoreAltConfigAdd (
2213 EFI_HII_DEFAULT_CLASS_STANDARD,
2214 _GET_CURRQEST_VARTINFO(),
2217 _GET_CURRQEST_DATATYPE (),
2222 "No standard default storage found"
2225 if (CBObj.GetFlags () & 0x02) {
2226 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);
2228 gCVfrDefaultStore.BufferVarStoreAltConfigAdd (
2229 EFI_HII_DEFAULT_CLASS_MANUFACTURING,
2230 _GET_CURRQEST_VARTINFO(),
2233 _GET_CURRQEST_DATATYPE (),
2238 "No manufacturing default storage found"
2245 Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>
2247 vfrStatementQuestionOptionList
2248 E:EndCheckBox << CRT_END_OP (E); >>
2252 vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :
2257 checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*
2258 << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>
2261 checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :
2263 if (mCompatibleMode) {
2265 // set question flag
2267 $LFlags |= _STOU8(N->getText(), N->getLine());
2269 _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine());
2273 if (mCompatibleMode) {
2275 // set question Default flag
2279 _PCATCH (VFR_RETURN_UNSUPPORTED, D);
2282 | M:"MANUFACTURING" <<
2283 if (mCompatibleMode) {
2285 // set question MFG flag
2289 _PCATCH (VFR_RETURN_UNSUPPORTED, M);
2292 | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>
2293 | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>
2294 | questionheaderFlagsField[HFlags]
2297 //*****************************************************
2302 // prompt = STRING_TOKEN(STR_ACTION_PROMPT),
2303 // help = STRING_TOKEN(STR_ACTION_HELP),
2304 // flags = CALLBACK,
2305 // config = STRING_TOKEN(STR_ACTION_CONFIG),
2308 vfrStatementAction :
2309 << CIfrAction AObj; >>
2310 L:Action << AObj.SetLineNo(L->getLine()); >>
2311 vfrQuestionHeader[AObj] ","
2312 { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }
2313 Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText(), S->getLine())); >>
2314 vfrStatementQuestionTagList
2315 E:EndAction << CRT_END_OP (E); >>
2319 vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :
2320 << UINT8 HFlags = 0; >>
2321 actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*
2322 << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>
2325 actionFlagsField[UINT8 & HFlags] :
2326 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
2327 | questionheaderFlagsField[HFlags]
2332 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
2333 CHAR8 *VarIdStr[3] = {NULL, };
2335 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;
2336 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE);
2338 L:Date << DObj.SetLineNo(L->getLine()); >>
2341 vfrQuestionHeader[DObj, QUESTION_DATE] "," <<
2342 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {
2343 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE;
2346 { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }
2347 vfrStatementQuestionOptionList
2351 Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","
2352 << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>
2353 Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","
2354 Help "=" "STRING_TOKEN" "\(" YH:Number "\)" ","
2355 minMaxDateStepDefault[Val.date, 0]
2357 Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","
2358 << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>
2359 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","
2360 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","
2361 minMaxDateStepDefault[Val.date, 1]
2363 Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","
2364 << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>
2365 Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","
2366 Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","
2367 minMaxDateStepDefault[Val.date, 2]
2368 { G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," }
2370 mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);
2371 DObj.SetQuestionId (QId);
2372 DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);
2373 DObj.SetPrompt (_STOSID(YP->getText(), YP->getLine()));
2374 DObj.SetHelp (_STOSID(YH->getText(), YH->getLine()));
2375 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }
2377 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >>
2379 ( vfrStatementInconsistentIf )*
2381 E:EndDate << CRT_END_OP (E); >>
2385 minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :
2386 Minimum "=" MinN:Number ","
2387 Maximum "=" MaxN:Number ","
2388 { "step" "=" Number "," }
2390 "default" "=" N:Number "," <<
2393 D.Year = _STOU16(N->getText(), N->getLine());
2394 if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) {
2395 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year.");
2399 D.Month = _STOU8(N->getText(), N->getLine());
2400 if (D.Month < 1 || D.Month > 12) {
2401 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12.");
2405 D.Day = _STOU8(N->getText(), N->getLine());
2406 if (D.Day < 1 || D.Day > 31) {
2407 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31.");
2415 vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :
2416 << UINT8 LFlags = 0; >>
2417 dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*
2418 << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>
2421 dateFlagsField [UINT8 & Flags] :
2422 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>
2423 | "YEAR_SUPPRESS" << $Flags |= 0x01; >>
2424 | "MONTH_SUPPRESS" << $Flags |= 0x02; >>
2425 | "DAY_SUPPRESS" << $Flags |= 0x04; >>
2426 | "STORAGE_NORMAL" << $Flags |= 0x00; >>
2427 | "STORAGE_TIME" << $Flags |= 0x10; >>
2428 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>
2431 vfrStatementNumericType :
2432 vfrStatementNumeric |
2436 vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
2438 UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;
2439 UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;
2440 UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;
2441 UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;
2442 BOOLEAN IntDecStyle = FALSE;
2443 CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj);
2444 if ((NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0)) {
2447 BOOLEAN MinNegative = FALSE;
2448 BOOLEAN MaxNegative = FALSE;
2452 "\-" << MinNegative = TRUE; >>
2455 if (!IntDecStyle && MinNegative) {
2456 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");
2458 switch (_GET_CURRQEST_DATATYPE()) {
2459 case EFI_IFR_TYPE_NUM_SIZE_64 :
2460 MinU8 = _STOU64(I->getText(), I->getLine());
2463 if (MinU8 > 0x8000000000000000) {
2464 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");
2467 if (MinU8 > 0x7FFFFFFFFFFFFFFF) {
2468 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");
2476 case EFI_IFR_TYPE_NUM_SIZE_32 :
2477 MinU4 = _STOU32(I->getText(), I->getLine());
2480 if (MinU4 > 0x80000000) {
2481 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");
2484 if (MinU4 > 0x7FFFFFFF) {
2485 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");
2493 case EFI_IFR_TYPE_NUM_SIZE_16 :
2494 MinU2 = _STOU16(I->getText(), I->getLine());
2497 if (MinU2 > 0x8000) {
2498 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");
2501 if (MinU2 > 0x7FFF) {
2502 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");
2510 case EFI_IFR_TYPE_NUM_SIZE_8 :
2511 MinU1 = _STOU8(I->getText(), I->getLine());
2515 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");
2519 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");
2531 "\-" << MaxNegative = TRUE; >>
2534 if (!IntDecStyle && MaxNegative) {
2535 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");
2538 switch (_GET_CURRQEST_DATATYPE()) {
2539 case EFI_IFR_TYPE_NUM_SIZE_64 :
2540 MaxU8 = _STOU64(A->getText(), A->getLine());
2543 if (MaxU8 > 0x8000000000000000) {
2544 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");
2547 if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {
2548 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");
2556 if ((INT64) MaxU8 < (INT64) MinU8) {
2557 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
2560 if (MaxU8 < MinU8) {
2561 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
2565 case EFI_IFR_TYPE_NUM_SIZE_32 :
2566 MaxU4 = _STOU32(A->getText(), A->getLine());
2569 if (MaxU4 > 0x80000000) {
2570 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");
2573 if (MaxU4 > 0x7FFFFFFF) {
2574 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");
2582 if ((INT32) MaxU4 < (INT32) MinU4) {
2583 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
2586 if (MaxU4 < MinU4) {
2587 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
2591 case EFI_IFR_TYPE_NUM_SIZE_16 :
2592 MaxU2 = _STOU16(A->getText(), A->getLine());
2595 if (MaxU2 > 0x8000) {
2596 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");
2599 if (MaxU2 > 0x7FFF) {
2600 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");
2608 if ((INT16) MaxU2 < (INT16) MinU2) {
2609 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
2612 if (MaxU2 < MinU2) {
2613 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
2617 case EFI_IFR_TYPE_NUM_SIZE_8 :
2618 MaxU1 = _STOU8(A->getText(), A->getLine());
2622 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");
2626 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");
2634 if ((INT8) MaxU1 < (INT8) MinU1) {
2635 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
2638 if (MaxU1 < MinU1) {
2639 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
2646 STEP "=" S:Number ","
2648 switch (_GET_CURRQEST_DATATYPE()) {
2649 case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break;
2650 case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break;
2651 case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break;
2652 case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break;
2657 switch (_GET_CURRQEST_DATATYPE()) {
2658 case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;
2659 case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;
2660 case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;
2661 case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;
2666 vfrStatementNumeric :
2669 UINT32 DataTypeSize;
2670 BOOLEAN IsSupported = TRUE;
2671 UINT8 ShrinkSize = 0;
2673 L:Numeric << NObj.SetLineNo(L->getLine()); >>
2674 vfrQuestionHeader[NObj] "," << // check data type
2675 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
2676 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type");
2677 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {
2678 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array");
2680 _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());
2683 { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }
2685 Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>
2687 vfrSetMinMaxStep[NObj] <<
2688 switch (_GET_CURRQEST_DATATYPE()) {
2690 // Base on the type to know the actual used size,shrink the buffer
2691 // size allocate before.
2693 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;
2694 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;
2695 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;
2696 case EFI_IFR_TYPE_NUM_SIZE_64:break;
2698 IsSupported = FALSE;
2701 NObj.ShrinkBinSize (ShrinkSize);
2703 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type.");
2706 vfrStatementQuestionOptionList
2713 vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :
2715 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;
2717 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;
2718 BOOLEAN IsSetType = FALSE;
2719 BOOLEAN IsDisplaySpecified = FALSE;
2721 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )*
2723 //check data type flag
2724 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
2725 VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);
2726 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {
2727 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {
2728 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");
2731 // update data type for name/value store
2732 UINT32 DataTypeSize;
2733 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;
2734 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);
2735 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;
2737 } else if (IsSetType){
2738 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;
2740 _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum);
2744 numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] :
2745 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
2746 | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>>
2747 | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>>
2748 | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>>
2749 | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>>
2750 | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>>
2751 | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>>
2752 | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>>
2753 | questionheaderFlagsField[HFlags]
2759 UINT32 DataTypeSize;
2760 BOOLEAN IsSupported = TRUE;
2761 UINT8 ShrinkSize = 0;
2763 L:OneOf << OObj.SetLineNo(L->getLine()); >>
2764 vfrQuestionHeader[OObj] "," << //check data type
2765 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
2766 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type");
2767 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) {
2768 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array");
2770 _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine());
2773 { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }
2775 vfrSetMinMaxStep[OObj]
2778 switch (_GET_CURRQEST_DATATYPE()) {
2780 // Base on the type to know the actual used size,shrink the buffer
2781 // size allocate before.
2783 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break;
2784 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break;
2785 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break;
2786 case EFI_IFR_TYPE_NUM_SIZE_64:break;
2788 IsSupported = FALSE;
2791 OObj.ShrinkBinSize (ShrinkSize);
2793 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type.");
2796 vfrStatementQuestionOptionList
2803 vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :
2805 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE;
2807 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;
2808 BOOLEAN IsSetType = FALSE;
2809 BOOLEAN IsDisplaySpecified = FALSE;
2811 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )*
2813 //check data type flag
2814 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
2815 VarStoreType = gCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId);
2816 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) {
2817 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) {
2818 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type");
2821 // update data type for Name/Value store
2822 UINT32 DataTypeSize;
2823 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;
2824 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize);
2825 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize;
2827 } else if (IsSetType){
2828 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE;
2830 _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum);
2834 vfrStatementStringType :
2835 vfrStatementString |
2836 vfrStatementPassword
2839 vfrStatementString :
2842 UINT32 VarArraySize;
2843 UINT8 StringMinSize;
2844 UINT8 StringMaxSize;
2846 L:String << SObj.SetLineNo(L->getLine()); gIsStringOp = TRUE;>>
2847 vfrQuestionHeader[SObj] ","
2848 { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }
2850 Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>
2852 MinSize "=" MIN:Number "," <<
2853 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();
2854 StringMinSize = _STOU8(MIN->getText(), MIN->getLine());
2855 if (_STOU64(MIN->getText(), MIN->getLine()) > StringMinSize) {
2856 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF.");
2857 } else if (VarArraySize != 0 && StringMinSize > VarArraySize) {
2858 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array.");
2860 SObj.SetMinSize (StringMinSize);
2862 MaxSize "=" MAX:Number "," <<
2863 StringMaxSize = _STOU8(MAX->getText(), MAX->getLine());
2864 if (_STOU64(MAX->getText(), MAX->getLine()) > StringMaxSize) {
2865 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF.");
2866 } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) {
2867 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array.");
2868 } else if (StringMaxSize < StringMinSize) {
2869 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize.");
2871 SObj.SetMaxSize (StringMaxSize);
2873 vfrStatementQuestionOptionList
2874 E:EndString << CRT_END_OP (E); gIsStringOp = FALSE;>>
2878 vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :
2883 stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*
2884 << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>
2887 stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
2888 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
2889 | "MULTI_LINE" << $LFlags = 0x01; >>
2890 | questionheaderFlagsField[HFlags]
2893 vfrStatementPassword :
2896 UINT32 VarArraySize;
2897 UINT16 PasswordMinSize;
2898 UINT16 PasswordMaxSize;
2900 L:Password << PObj.SetLineNo(L->getLine()); >>
2901 vfrQuestionHeader[PObj] ","
2902 { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }
2904 Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>
2906 MinSize "=" MIN:Number "," <<
2907 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();
2908 PasswordMinSize = _STOU16(MIN->getText(), MIN->getLine());
2909 if (_STOU64(MIN->getText(), MIN->getLine()) > PasswordMinSize) {
2910 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF.");
2911 } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) {
2912 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array.");
2914 PObj.SetMinSize (PasswordMinSize);
2916 MaxSize "=" MAX:Number "," <<
2917 PasswordMaxSize = _STOU16(MAX->getText(), MAX->getLine());
2918 if (_STOU64(MAX->getText(), MAX->getLine()) > PasswordMaxSize) {
2919 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF.");
2920 } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) {
2921 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array.");
2922 } else if (PasswordMaxSize < PasswordMinSize) {
2923 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize.");
2925 PObj.SetMaxSize (PasswordMaxSize);
2927 { Encoding "=" Number "," }
2928 vfrStatementQuestionOptionList
2929 E:EndPassword << CRT_END_OP (E); >>
2933 vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :
2934 << UINT8 HFlags = 0; >>
2935 passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*
2936 << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>
2939 passwordFlagsField [UINT8 & HFlags] :
2940 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
2941 | questionheaderFlagsField[HFlags]
2944 vfrStatementOrderedList :
2946 CIfrOrderedList OLObj;
2947 UINT32 VarArraySize;
2949 L:OrderedList << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>
2950 vfrQuestionHeader[OLObj] ","
2952 VarArraySize = _GET_CURRQEST_ARRAY_SIZE();
2953 OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize));
2956 MaxContainers "=" M:Number "," <<
2957 if (_STOU64(M->getText(), M->getLine()) > _STOU8(M->getText(), M->getLine())) {
2958 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF.");
2959 } else if (VarArraySize != 0 && _STOU8(M->getText(), M->getLine()) > VarArraySize) {
2960 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array.");
2962 OLObj.SetMaxContainers (_STOU8(M->getText(), M->getLine()));
2965 { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}
2966 vfrStatementQuestionOptionList
2967 E:EndList << CRT_END_OP (E); gIsOrderedList = FALSE;>>
2971 vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :
2976 orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*
2977 << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>
2980 orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
2981 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
2982 | "UNIQUE" << $LFlags |= 0x01; >>
2983 | "NOEMPTY" << $LFlags |= 0x02; >>
2984 | questionheaderFlagsField[HFlags]
2989 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
2990 CHAR8 *VarIdStr[3] = {NULL, };
2992 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue;
2993 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME);
2995 L:Time << TObj.SetLineNo(L->getLine()); >>
2998 vfrQuestionHeader[TObj, QUESTION_TIME] "," <<
2999 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {
3000 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME;
3003 { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }
3004 vfrStatementQuestionOptionList
3008 Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","
3009 << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>
3010 Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","
3011 Help "=" "STRING_TOKEN" "\(" HH:Number "\)" ","
3012 minMaxTimeStepDefault[Val.time, 0]
3014 Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","
3015 << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>
3016 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","
3017 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","
3018 minMaxTimeStepDefault[Val.time, 1]
3020 Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","
3021 << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>
3022 Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","
3023 Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","
3024 minMaxTimeStepDefault[Val.time, 2]
3025 { G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," }
3027 mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);
3028 TObj.SetQuestionId (QId);
3029 TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);
3030 TObj.SetPrompt (_STOSID(HP->getText(), HP->getLine()));
3031 TObj.SetHelp (_STOSID(HH->getText(), HH->getLine()));
3032 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }
3034 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >>
3036 ( vfrStatementInconsistentIf )*
3038 E:EndTime << CRT_END_OP (E); >>
3042 minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :
3043 Minimum "=" Number ","
3044 Maximum "=" Number ","
3045 { "step" "=" Number "," }
3047 "default" "=" N:Number "," <<
3050 T.Hour = _STOU8(N->getText(), N->getLine());
3052 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23.");
3056 T.Minute = _STOU8(N->getText(), N->getLine());
3057 if (T.Minute > 59) {
3058 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59.");
3062 T.Second = _STOU8(N->getText(), N->getLine());
3063 if (T.Second > 59) {
3064 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59.");
3072 vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :
3073 << UINT8 LFlags = 0; >>
3074 timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*
3075 << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>
3078 timeFlagsField [UINT8 & Flags] :
3079 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>
3080 | "HOUR_SUPPRESS" << $Flags |= 0x01; >>
3081 | "MINUTE_SUPPRESS" << $Flags |= 0x02; >>
3082 | "SECOND_SUPPRESS" << $Flags |= 0x04; >>
3083 | "STORAGE_NORMAL" << $Flags |= 0x00; >>
3084 | "STORAGE_TIME" << $Flags |= 0x10; >>
3085 | "STORAGE_WAKEUP" << $Flags |= 0x20; >>
3088 vfrStatementQuestionTag :
3089 vfrStatementStatTag "," |
3090 vfrStatementInconsistentIf |
3091 vfrStatementNoSubmitIf |
3092 vfrStatementDisableIfQuest |
3093 vfrStatementRefresh |
3094 vfrStatementVarstoreDevice |
3095 vfrStatementExtension |
3096 vfrStatementRefreshEvent "," |
3097 vfrStatementWarningIf
3100 vfrStatementQuestionTagList :
3101 ( vfrStatementQuestionTag )*
3104 vfrStatementQuestionOptionTag :
3105 vfrStatementSuppressIfQuest |
3106 vfrStatementGrayOutIfQuest |
3108 vfrStatementDefault |
3114 vfrStatementQuestionOptionList :
3116 vfrStatementQuestionTag |
3117 vfrStatementQuestionOptionTag
3121 vfrStatementStatList :
3123 vfrStatementQuestions |
3124 vfrStatementConditionalNew |
3126 vfrStatementExtension |
3127 // Just for framework vfr compatibility
3131 vfrStatementStatListOld :
3133 vfrStatementQuestions |
3135 // Just for framework vfr compatibility
3139 vfrStatementDisableIfStat :
3141 CIfrDisableIf DIObj;
3143 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>
3144 vfrStatementExpression[0] ";"
3145 ( vfrStatementStatList )*
3146 E:EndIf << CRT_END_OP (E); >>
3150 vfrStatementInconsistentIfStat :
3151 << CIfrInconsistentIf IIObj; >>
3153 if (!mCompatibleMode) {
3154 _PCATCH (VFR_RETURN_UNSUPPORTED, L);
3156 IIObj.SetLineNo(L->getLine());
3158 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>
3159 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3160 vfrStatementExpression[0]
3161 E:EndIf << CRT_END_OP (E); >>
3166 // Compatible for framework vfr file
3168 vfrStatementgrayoutIfSuppressIf:
3169 << CIfrSuppressIf SIObj; >>
3170 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>
3171 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3172 vfrStatementExpression[0]
3176 vfrStatementsuppressIfGrayOutIf:
3177 << CIfrGrayOutIf GOIObj; >>
3178 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>
3179 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3180 vfrStatementExpression[0]
3184 vfrStatementSuppressIfStatNew :
3185 << CIfrSuppressIf SIObj;>>
3186 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>
3187 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3188 vfrStatementExpression[0]
3190 ( vfrStatementStatList )*
3191 E: EndIf ";" << CRT_END_OP (E); >>
3194 vfrStatementGrayOutIfStatNew :
3195 << CIfrGrayOutIf GOIObj;>>
3196 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>
3197 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3198 vfrStatementExpression[0]
3200 ( vfrStatementStatList )*
3201 E: EndIf ";" << CRT_END_OP (E); >>
3204 vfrStatementSuppressIfStatOld :
3206 CIfrSuppressIf SIObj;
3207 BOOLEAN GrayOutExist = FALSE;
3209 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>
3210 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3211 vfrStatementExpression[0]
3214 vfrStatementsuppressIfGrayOutIf
3215 << GrayOutExist = TRUE; >>
3217 ( vfrStatementStatListOld )*
3218 E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>>
3221 vfrStatementGrayOutIfStatOld :
3223 CIfrGrayOutIf GOIObj;
3224 BOOLEAN SuppressExist = FALSE;
3226 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>
3227 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3228 vfrStatementExpression[0]
3231 vfrStatementgrayoutIfSuppressIf
3232 << SuppressExist = TRUE; >>
3234 ( vfrStatementStatListOld )*
3235 E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >>
3239 << CIfrImage IObj; >>
3240 L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >>
3244 << CIfrLocked LObj; >>
3245 L:Locked << LObj.SetLineNo(L->getLine()); >>
3249 << CIfrModal MObj; >>
3250 L:Modal << MObj.SetLineNo(L->getLine()); >>
3253 vfrStatementStatTag :
3258 vfrStatementStatTagList :
3259 vfrStatementStatTag ( "," vfrStatementStatTag )*
3272 vfrStatementLocked :
3277 vfrStatementInconsistentIf :
3278 << CIfrInconsistentIf IIObj; >>
3279 L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >>
3280 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >>
3281 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3282 vfrStatementExpression[0]
3283 E:EndIf {";"} << CRT_END_OP (E); >>
3286 vfrStatementNoSubmitIf :
3287 << CIfrNoSubmitIf NSIObj; >>
3288 L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >>
3289 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >>
3290 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3291 vfrStatementExpression[0]
3292 E:EndIf {";"} << CRT_END_OP (E); >>
3295 vfrStatementWarningIf :
3296 << CIfrWarningIf WIObj; >>
3297 L:WarningIf << WIObj.SetLineNo(L->getLine()); >>
3298 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << WIObj.SetWarning (_STOSID(S->getText(), S->getLine())); >>
3299 {Timeout "=" T:Number "," << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>}
3300 vfrStatementExpression[0]
3301 E:EndIf {";"} << CRT_END_OP (E); >>
3304 vfrStatementDisableIfQuest :
3306 CIfrDisableIf DIObj;
3308 L:DisableIf << DIObj.SetLineNo(L->getLine()); >>
3309 vfrStatementExpression[0] ";"
3310 vfrStatementQuestionOptionList
3311 E:EndIf {";"} << CRT_END_OP (E); >>
3314 vfrStatementRefresh :
3315 << CIfrRefresh RObj; >>
3316 L:Refresh << RObj.SetLineNo(L->getLine()); >>
3317 Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText(), I->getLine())); >>
3320 vfrStatementRefreshEvent :
3322 CIfrRefreshId RiObj;
3325 L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >>
3326 "=" guidDefinition[Guid] << RiObj.SetRefreshEventGroutId (&Guid); >>
3329 vfrStatementVarstoreDevice :
3330 << CIfrVarStoreDevice VDObj; >>
3331 L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>
3332 "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText(), S->getLine())); >>
3335 vfrStatementSuppressIfQuest :
3336 << CIfrSuppressIf SIObj; >>
3337 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>
3338 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3339 vfrStatementExpression[0] ";"
3340 vfrStatementQuestionOptionList
3341 E:EndIf {";"} << CRT_END_OP (E); >>
3344 vfrStatementGrayOutIfQuest :
3345 << CIfrGrayOutIf GOIObj; >>
3346 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>
3347 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3348 vfrStatementExpression[0] ";"
3349 vfrStatementQuestionOptionList
3350 E:EndIf {";"} << CRT_END_OP (E); >>
3353 vfrStatementOptions :
3354 vfrStatementOneOfOption
3357 vfrStatementOneOfOption :
3359 UINT8 ValueList[EFI_IFR_MAX_LENGTH] = {0,};
3360 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList;
3361 CHAR8 *VarStoreName = NULL;
3363 BOOLEAN TypeError = FALSE;
3364 EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS;
3365 EFI_GUID *VarStoreGuid = NULL;
3366 BOOLEAN ArrayType = FALSE;
3367 CIfrOneOfOption *OOOObj;
3368 UINT8 *Type8 = (UINT8 *) ValueList;
3369 UINT16 *Type16 = (UINT16 *) ValueList;
3370 UINT32 *Type32 = (UINT32 *) ValueList;
3371 UINT64 *Type64 = (UINT64 *) ValueList;
3374 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {
3375 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");
3379 Text "=" "STRING_TOKEN" "\(" S:Number "\)" ","
3380 Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","
3382 if (gCurrentMinMaxData != NULL) {
3383 //set min/max value for oneof opcode
3384 UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());
3385 switch (_GET_CURRQEST_DATATYPE()) {
3386 case EFI_IFR_TYPE_NUM_SIZE_64:
3387 gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);
3389 case EFI_IFR_TYPE_NUM_SIZE_32:
3390 gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);
3392 case EFI_IFR_TYPE_NUM_SIZE_16:
3393 gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);
3395 case EFI_IFR_TYPE_NUM_SIZE_8:
3396 gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);
3402 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {
3403 Size = sizeof (EFI_IFR_TYPE_VALUE);
3404 } else if (ArrayType) {
3405 switch (_GET_CURRQEST_DATATYPE()) {
3406 case EFI_IFR_TYPE_NUM_SIZE_8 :
3407 while (Type8[Size] != 0) {
3411 case EFI_IFR_TYPE_NUM_SIZE_16 :
3412 while (Type16[Size] != 0) {
3415 Size *= sizeof (UINT16);
3417 case EFI_IFR_TYPE_NUM_SIZE_32 :
3418 while (Type32[Size] != 0) {
3421 Size *= sizeof (UINT32);
3423 case EFI_IFR_TYPE_NUM_SIZE_64 :
3424 while (Type64[Size] != 0) {
3427 Size *= sizeof (UINT64);
3433 ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);
3435 if (ReturnCode != VFR_RETURN_SUCCESS) {
3436 _PCATCH (ReturnCode, L->getLine());
3439 Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);
3440 OOOObj = new CIfrOneOfOption((UINT8)Size);
3441 OOOObj->SetLineNo(L->getLine());
3442 OOOObj->SetOption (_STOSID(S->getText(), S->getLine()));
3444 OOOObj->SetType (EFI_IFR_TYPE_BUFFER);
3446 OOOObj->SetType (_GET_CURRQEST_DATATYPE());
3448 OOOObj->SetValue (*Val);
3450 F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]
3453 // Array type only for default type OneOfOption.
3455 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {
3456 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");
3460 // Clear the default flag if the option not use array value but has default flag.
3462 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {
3463 OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));
3466 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
3467 _PCATCH(gCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());
3468 VarStoreGuid = gCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);
3469 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {
3470 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);
3471 _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (
3472 EFI_HII_DEFAULT_CLASS_STANDARD,
3473 _GET_CURRQEST_VARTINFO(),
3476 _GET_CURRQEST_DATATYPE (),
3480 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {
3481 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);
3482 _PCATCH(gCVfrDefaultStore.BufferVarStoreAltConfigAdd (
3483 EFI_HII_DEFAULT_CLASS_MANUFACTURING,
3484 _GET_CURRQEST_VARTINFO(),
3487 _GET_CURRQEST_DATATYPE (),
3494 "," Key "=" KN:Number <<
3495 if (!mCompatibleMode) {
3496 _PCATCH (VFR_RETURN_UNSUPPORTED, KN);
3501 CIfrOptionKey IfrOptionKey (
3502 gCurrentQuestion->QUESTION_ID(),
3504 _STOQID(KN->getText(), KN->getLine())
3506 SET_LINE_INFO (IfrOptionKey, KN);
3510 T:"," vfrImageTag << OOOObj->SetScope (1); CRT_END_OP (T); >>
3512 ";" << if (OOOObj != NULL) {delete OOOObj;} >>
3515 vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :
3517 UINT8 LFlags = _GET_CURRQEST_DATATYPE();
3520 oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*
3521 << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>
3522 << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>
3525 oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
3526 N:Number << $LFlags |= _STOU8(N->getText(), N->getLine()); >>
3527 | "OPTION_DEFAULT" << $LFlags |= 0x10; >>
3528 | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>
3529 | InteractiveFlag << $HFlags |= 0x04; >>
3530 | ResetRequiredFlag << $HFlags |= 0x10; >>
3531 | ReconnectRequiredFlag << $HFlags |= 0x40; >>
3532 | ManufacturingFlag << $LFlags |= 0x20; >>
3533 | DefaultFlag << $LFlags |= 0x10; >>
3535 if (mCompatibleMode) {
3538 gCVfrErrorHandle.HandleWarning (
3539 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,
3545 | L:LateCheckFlag <<
3546 if (mCompatibleMode) {
3549 gCVfrErrorHandle.HandleWarning (
3550 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE,
3561 if (mCompatibleMode) {
3563 // Add end Label for Framework Vfr
3566 LObj1.SetLineNo(L->getLine());
3567 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff
3572 LObj2.SetLineNo(L->getLine());
3573 LObj2.SetNumber (_STOU16(N->getText(), N->getLine()));
3579 vfrStatementBanner :
3580 << CIfrBanner BObj; >>
3581 B:Banner { "," } << BObj.SetLineNo(B->getLine()); >>
3582 Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText(), S->getLine())); >>
3585 Line L:Number "," << BObj.SetLine (_STOU16(L->getText(), L->getLine())); >>
3588 Left << BObj.SetAlign (0); >>
3589 | Center << BObj.SetAlign (1); >>
3590 | Right << BObj.SetAlign (2); >>
3595 Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText(), T->getLine()));} >>
3600 //******************************************************************************
3602 // keep some syntax for compatibility but not generate any IFR object
3604 vfrStatementInvalidHidden :
3606 if (!mCompatibleMode) {
3607 _PCATCH (VFR_RETURN_UNSUPPORTED, L);
3610 Value "=" Number ","
3614 vfrStatementInvalidInconsistentIf :
3616 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","
3617 { FLAGS "=" flagsField ( "\|" flagsField )* "," }
3618 vfrStatementExpression[0]
3623 vfrStatementInvalidInventory :
3625 if (!mCompatibleMode) {
3626 _PCATCH (VFR_RETURN_UNSUPPORTED, L);
3629 Help "=" "STRING_TOKEN" "\(" Number "\)" ","
3630 Text "=" "STRING_TOKEN" "\(" Number "\)" ","
3632 Text "=" "STRING_TOKEN" "\(" Number "\)"
3637 vfrStatementInvalidSaveRestoreDefaults :
3640 if (!mCompatibleMode) {
3641 _PCATCH (VFR_RETURN_UNSUPPORTED, L);
3646 if (!mCompatibleMode) {
3647 _PCATCH (VFR_RETURN_UNSUPPORTED, K);
3652 FormId "=" Number ","
3653 Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","
3654 Help "=" "STRING_TOKEN" "\(" Number "\)"
3655 { "," FLAGS "=" flagsField ( "\|" flagsField )* }
3656 { "," Key "=" Number }
3660 //******************************************************************************
3662 // The syntax of expression
3664 #token Dup("dup") "dup"
3665 #token VarEqVal("vareqval") "vareqval"
3666 #token Var("var") "var"
3667 #token IdEqVal("ideqval") "ideqval"
3668 #token IdEqId("ideqid") "ideqid"
3669 #token IdEqValList("ideqvallist") "ideqvallist"
3670 #token QuestionRef("questionref") "questionref"
3671 #token RuleRef("ruleref") "ruleref"
3672 #token StringRef("stringref") "stringref"
3673 #token PushThis("pushthis") "pushthis"
3674 #token Security("security") "security"
3675 #token Get("get") "get"
3676 #token True("TRUE") "TRUE"
3677 #token False("FALSE") "FALSE"
3678 #token One("ONE") "ONE"
3679 #token Ones("ONES") "ONES"
3680 #token Zero("ZERO") "ZERO"
3681 #token Undefined("UNDEFINED") "UNDEFINED"
3682 #token Version("VERSION") "VERSION"
3683 #token Length("length") "length"
3684 #token AND("AND") "AND"
3685 #token OR("OR") "OR"
3686 #token NOT("NOT") "NOT"
3687 #token Set("set") "set"
3688 #token BitWiseNot("~") "\~"
3689 #token BoolVal("boolval") "boolval"
3690 #token StringVal("stringval") "stringval"
3691 #token UnIntVal("unintval") "unintval"
3692 #token ToUpper("toupper") "toupper"
3693 #token ToLower("tolower") "tolower"
3694 #token Match("match") "match"
3695 #token Match2("match2") "match2"
3696 #token Catenate("catenate") "catenate"
3697 #token QuestionRefVal("questionrefval") "questionrefval"
3698 #token StringRefVal("stringrefval") "stringrefval"
3699 #token Map("map") "map"
3700 #token RefreshGuid("refreshguid") "refreshguid"
3703 // Root expression extension function called by other function.
3705 vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :
3706 << if ($RootLevel == 0) {mCIfrOpHdrIndex ++; if (mCIfrOpHdrIndex >= MAX_IFR_EXPRESSION_DEPTH) _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, "The depth of expression exceeds the max supported level 8!"); _CLEAR_SAVED_OPHDR ();} >>
3707 andTerm[$RootLevel, $ExpOpCount]
3709 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>
3713 // Extend OpCode Scope only for the root expression.
3715 if ($ExpOpCount > 1 && $RootLevel == 0) {
3716 if (_SET_SAVED_OPHDR_SCOPE()) {
3718 if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) {
3719 EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]);
3724 if ($RootLevel == 0) {
3731 // Add new sub function for the sub expression extension to remember the ExpOpCount
3732 // This funciton is only called by sub expression.
3734 vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] :
3735 andTerm[$RootLevel, $ExpOpCount]
3737 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>
3741 andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :
3742 bitwiseorTerm[$RootLevel, $ExpOpCount]
3744 L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>
3748 bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3749 bitwiseandTerm[$RootLevel, $ExpOpCount]
3751 L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>
3755 bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3756 equalTerm[$RootLevel, $ExpOpCount]
3758 L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>
3762 equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3763 compareTerm[$RootLevel, $ExpOpCount]
3766 L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>
3770 L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>
3775 compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3776 shiftTerm[$RootLevel, $ExpOpCount]
3779 L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>
3783 L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>
3787 L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>
3791 L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>
3796 shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3797 addMinusTerm[$RootLevel, $ExpOpCount]
3800 L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>
3804 L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>
3809 addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3810 multdivmodTerm[$RootLevel, $ExpOpCount]
3813 L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>
3817 L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>
3822 multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3823 castTerm[$RootLevel, $ExpOpCount]
3826 L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>
3830 L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>
3834 L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>
3839 castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3840 << UINT8 CastType = 0xFF; >>
3844 Boolean << CastType = 0; >>
3845 | Uint64 << CastType = 1; >>
3846 | Uint32 << CastType = 1; >>
3847 | Uint16 << CastType = 1; >>
3848 | Uint8 << CastType = 1; >>
3852 atomTerm[$RootLevel, $ExpOpCount]
3855 case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break;
3856 case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break;
3861 atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3862 vfrExpressionCatenate[$RootLevel, $ExpOpCount]
3863 | vfrExpressionMatch[$RootLevel, $ExpOpCount]
3864 | vfrExpressionMatch2[$RootLevel, $ExpOpCount]
3865 | vfrExpressionParen[$RootLevel, $ExpOpCount]
3866 | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]
3867 | vfrExpressionConstant[$RootLevel, $ExpOpCount]
3868 | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]
3869 | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]
3870 | vfrExpressionMap[$RootLevel, $ExpOpCount]
3873 atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>
3877 vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3880 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
3882 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
3883 "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>
3886 vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3889 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
3891 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
3892 "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>
3895 vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3901 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
3903 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
3905 guidDefinition[Guid]
3906 "\)" << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >>
3909 vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:
3911 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
3915 vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :
3916 dupExp[$RootLevel, $ExpOpCount]
3917 | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval
3918 | ideqvalExp[$RootLevel, $ExpOpCount]
3919 | ideqidExp[$RootLevel, $ExpOpCount]
3920 | ideqvallistExp[$RootLevel, $ExpOpCount]
3921 | questionref1Exp[$RootLevel, $ExpOpCount]
3922 | rulerefExp[$RootLevel, $ExpOpCount]
3923 | stringref1Exp[$RootLevel, $ExpOpCount]
3924 | pushthisExp[$RootLevel, $ExpOpCount]
3925 | securityExp[$RootLevel, $ExpOpCount]
3926 | getExp[$RootLevel, $ExpOpCount]
3929 dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
3930 L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>
3933 vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
3935 EFI_QUESTION_ID QId;
3940 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS;
3941 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;
3944 if (!mCompatibleMode) {
3945 _PCATCH (VFR_RETURN_UNSUPPORTED, L);
3951 VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText());
3952 VfrReturnCode = gCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId);
3953 if (VfrReturnCode == VFR_RETURN_UNDEFINED) {
3954 _PCATCH (gCVfrDataStorage.DeclareEfiVarStore (
3957 _STOSID(VN->getText(), VN->getLine()),
3958 0x2, //default type is UINT16
3962 _PCATCH (VfrReturnCode, VN);
3964 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask);
3965 LineNo = GET_LINENO(VN);
3971 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>
3974 CIfrEqIdVal EIVObj (L->getLine());
3975 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());
3976 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);
3977 EIVObj.SetValue (ConstVal);
3980 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);
3987 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>
3988 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>
3993 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>
3994 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>
3999 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>
4000 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>
4005 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>
4006 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>
4011 ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
4013 EFI_QUESTION_ID QId;
4020 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]
4024 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >>
4027 CIfrEqIdVal EIVObj (L->getLine());
4028 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine());
4029 EIVObj.SetQuestionId (QId, VarIdStr, LineNo);
4030 EIVObj.SetValue (ConstVal);
4033 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);
4040 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >>
4041 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>
4046 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >>
4047 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>
4052 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >>
4053 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>
4058 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >>
4059 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>
4064 ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4066 EFI_QUESTION_ID QId[2];
4072 vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]
4076 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
4078 if (Mask[0] & Mask[1]) {
4079 IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);
4081 CIfrEqIdId EIIObj(L->getLine());
4082 _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine());
4083 EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);
4084 EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);
4092 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
4093 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>
4098 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
4099 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>
4104 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
4105 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>
4110 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
4111 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>
4116 ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4119 EFI_QUESTION_ID QId;
4121 UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};
4126 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]
4129 V:Number << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >>
4133 IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);
4136 CIfrEqIdList EILObj(L->getLine());
4137 if (QId != EFI_QUESTION_ID_INVALID) {
4138 EILObj.SetQuestionId (QId, VarIdStr, LineNo);
4140 EILObj.SetListLength (ListLen);
4141 for (Index = 0; Index < ListLen; Index++) {
4142 EILObj.SetValueList (Index, ValueList[Index]);
4145 EILObj.UpdateIfrBuffer();
4146 _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine());
4148 if (QId == EFI_QUESTION_ID_INVALID) {
4149 EILObj.SetQuestionId (QId, VarIdStr, LineNo);
4156 questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4158 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
4160 CHAR8 *QName = NULL;
4166 QN:StringIdentifier <<
4167 QName = QN->getText();
4168 LineNo = QN->getLine();
4169 mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);
4171 | ID:Number << QId = _STOQID(ID->getText(), ID->getLine()); >>
4175 { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>
4178 rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4180 "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>
4183 //******************************************************
4185 // stringref (STR_FORM_SET_TITLE)
4187 stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4189 EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID;
4196 S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >>
4198 | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >>
4200 "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >>
4203 pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4204 L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >>
4207 securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4212 "\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >>
4215 numericVarStoreType [UINT8 & VarType] :
4216 "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >>
4217 | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >>
4218 | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >>
4219 | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >>
4222 getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4224 EFI_VARSTORE_INFO Info;
4225 CHAR8 *VarIdStr = NULL;
4226 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
4228 EFI_QUESION_TYPE QType = QUESTION_NORMAL;
4229 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;
4231 Info.mVarStoreId = 0;
4235 vfrStorageVarId[Info, VarIdStr, FALSE]
4236 {"\|" FLAGS "=" numericVarStoreType [VarType] }
4239 if (Info.mVarStoreId == 0) {
4240 // support Date/Time question
4241 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);
4242 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {
4243 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");
4245 if (QType == QUESTION_DATE) {
4246 Info.mVarType = EFI_IFR_TYPE_DATE;
4247 } else if (QType == QUESTION_TIME) {
4248 Info.mVarType = EFI_IFR_TYPE_TIME;
4251 case DATE_YEAR_BITMASK:
4252 Info.mInfo.mVarOffset = 0;
4254 case DATE_DAY_BITMASK:
4255 Info.mInfo.mVarOffset = 3;
4257 case TIME_HOUR_BITMASK:
4258 Info.mInfo.mVarOffset = 0;
4260 case TIME_MINUTE_BITMASK:
4261 Info.mInfo.mVarOffset = 1;
4263 case TIME_SECOND_BITMASK:
4264 Info.mInfo.mVarOffset = 2;
4267 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");
4271 if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {
4272 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");
4274 if (VarType != EFI_IFR_TYPE_UNDEFINED) {
4275 Info.mVarType = VarType;
4276 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");
4277 Info.mVarTotalSize = VarSize;
4279 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");
4280 if (VarSize != Info.mVarTotalSize) {
4281 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");
4284 CIfrGet GObj(L->getLine());
4285 _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine());
4286 GObj.SetVarInfo (&Info);
4293 vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4294 L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >>
4295 | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >>
4296 | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >>
4297 | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >>
4298 | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >>
4299 | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >>
4300 | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >>
4301 | V:Number << CIfrUint64 U64Obj(V->getLine()); U64Obj.SetValue (_STOU64(V->getText(), V->getLine())); _SAVE_OPHDR_COND (U64Obj, ($ExpOpCount == 0), V->getLine()); $ExpOpCount++; >>
4304 vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4305 lengthExp[$RootLevel, $ExpOpCount]
4306 | bitwisenotExp[$RootLevel, $ExpOpCount]
4307 | question23refExp[$RootLevel, $ExpOpCount]
4308 | stringref2Exp[$RootLevel, $ExpOpCount]
4309 | toboolExp[$RootLevel, $ExpOpCount]
4310 | tostringExp[$RootLevel, $ExpOpCount]
4311 | unintExp[$RootLevel, $ExpOpCount]
4312 | toupperExp[$RootLevel, $ExpOpCount]
4313 | tolwerExp[$RootLevel, $ExpOpCount]
4314 | setExp[$RootLevel, $ExpOpCount]
4317 lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4319 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
4320 << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>
4323 bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4325 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
4326 << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>
4329 question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4332 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;
4333 EFI_GUID Guid = {0,};
4338 DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText(), S->getLine()); >>
4341 Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >>
4343 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4347 case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}
4348 case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}
4349 case 0x3: {CIfrQuestionRef3_3 QR3_3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_3Obj, ($ExpOpCount == 0), L->getLine()); QR3_3Obj.SetDevicePath (DevPath); QR3_3Obj.SetGuid (&Guid); break;}
4355 stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4357 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
4358 << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>
4361 toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4363 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
4364 << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>
4367 tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4368 << UINT8 Fmt = 0; >>
4371 Format "=" F:Number "," << Fmt = _STOU8(F->getText(), F->getLine()); >>
4373 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
4374 << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>
4377 unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4379 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
4380 << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>
4383 toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4385 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
4386 << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>
4389 tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4391 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
4392 << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>
4395 setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4397 EFI_VARSTORE_INFO Info;
4398 CHAR8 *VarIdStr = NULL;
4399 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
4401 EFI_QUESION_TYPE QType = QUESTION_NORMAL;
4402 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED;
4404 Info.mVarStoreId = 0;
4408 vfrStorageVarId[Info, VarIdStr, FALSE]
4409 {"\|" FLAG "=" numericVarStoreType [VarType] }
4410 "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4414 if (Info.mVarStoreId == 0) {
4415 // support Date/Time question
4416 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType);
4417 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) {
4418 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");
4420 if (QType == QUESTION_DATE) {
4421 Info.mVarType = EFI_IFR_TYPE_DATE;
4422 } else if (QType == QUESTION_TIME) {
4423 Info.mVarType = EFI_IFR_TYPE_TIME;
4426 case DATE_YEAR_BITMASK:
4427 Info.mInfo.mVarOffset = 0;
4429 case DATE_DAY_BITMASK:
4430 Info.mInfo.mVarOffset = 3;
4432 case TIME_HOUR_BITMASK:
4433 Info.mInfo.mVarOffset = 0;
4435 case TIME_MINUTE_BITMASK:
4436 Info.mInfo.mVarOffset = 1;
4438 case TIME_SECOND_BITMASK:
4439 Info.mInfo.mVarOffset = 2;
4442 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information");
4446 if ((gCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) {
4447 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string");
4449 if (VarType != EFI_IFR_TYPE_UNDEFINED) {
4450 Info.mVarType = VarType;
4451 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");
4452 Info.mVarTotalSize = VarSize;
4454 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size");
4455 if (VarSize != Info.mVarTotalSize) {
4456 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array");
4459 CIfrSet TSObj(L->getLine());
4460 TSObj.SetVarInfo (&Info);
4467 vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4468 conditionalExp[$RootLevel, $ExpOpCount]
4469 | findExp[$RootLevel, $ExpOpCount]
4470 | midExp[$RootLevel, $ExpOpCount]
4471 | tokenExp[$RootLevel, $ExpOpCount]
4472 | spanExp[$RootLevel, $ExpOpCount]
4475 #token Cond("cond") "cond"
4476 #token Find("find") "find"
4477 #token Mid("mid") "mid"
4478 #token Tok("token") "token"
4479 #token Span("span") "span"
4481 conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4483 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4485 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4487 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4488 "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>
4491 findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4494 findFormat[Format] ( "\|" findFormat[Format] )*
4496 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4498 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4500 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4501 "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>
4504 findFormat [UINT8 & Format] :
4505 "SENSITIVE" << $Format = 0x00; >>
4506 | "INSENSITIVE" << $Format = 0x01; >>
4509 midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4511 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4513 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4515 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4516 "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>
4519 tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4521 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4523 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4525 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4526 "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>
4529 spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
4530 << UINT8 Flags = 0; >>
4532 FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*
4534 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4536 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4538 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4539 "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>
4542 vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]:
4545 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
4546 ":" << { CIfrMap MObj(L->getLine()); } >>
4548 vfrStatementExpression[0]
4550 vfrStatementExpression[0]
4553 E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >>
4556 spanFlags [UINT8 & Flags] :
4557 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >>
4558 | "LAST_NON_MATCH" << $Flags |= 0x00; >>
4559 | "FIRST_NON_MATCH" << $Flags |= 0x01; >>
4562 #token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"
4563 #token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"
4565 //******************************************************************************
4567 // Parser class definition.
4569 class EfiVfrParser {
4572 UINT8 mParserStatus;
4573 BOOLEAN mConstantOnlyInExpression;
4575 CVfrQuestionDB mCVfrQuestionDB;
4576 CVfrRulesDB mCVfrRulesDB;
4578 CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH];
4579 UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH];
4580 UINT8 mCIfrOpHdrIndex;
4581 VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0);
4582 VOID _CLEAR_SAVED_OPHDR (VOID);
4583 BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID);
4586 EFI_VARSTORE_INFO mCurrQestVarInfo;
4587 EFI_GUID *mOverrideClassGuid;
4588 CHAR8* mLastFormEndAddr;
4591 // Whether the question already has default value.
4593 UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];
4594 UINT16 mUsedDefaultCount;
4597 // For framework vfr compatibility
4599 BOOLEAN mCompatibleMode;
4600 EFI_GUID mFormsetGuid;
4602 VOID _CRT_OP (IN BOOLEAN);
4604 VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);
4605 EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);
4607 UINT8 _GET_CURRQEST_DATATYPE ();
4608 UINT32 _GET_CURRQEST_VARSIZE ();
4609 UINT32 _GET_CURRQEST_ARRAY_SIZE();
4610 VOID CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);
4613 VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);
4614 VOID _PCATCH (IN EFI_VFR_RETURN_CODE);
4615 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);
4616 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);
4617 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *);
4619 VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);
4621 CHAR8* TrimHex (IN CHAR8 *, OUT BOOLEAN *);
4622 CHAR8* _U32TOS (IN UINT32);
4623 UINT8 _STOU8 (IN CHAR8 *, IN UINT32);
4624 UINT16 _STOU16 (IN CHAR8 *, IN UINT32);
4625 UINT32 _STOU32 (IN CHAR8 *, IN UINT32);
4626 UINT64 _STOU64 (IN CHAR8 *, IN UINT32);
4627 EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);
4628 EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32);
4629 EFI_HII_REF _STOR (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT32);
4631 EFI_STRING_ID _STOSID (IN CHAR8 *, IN UINT32);
4632 EFI_FORM_ID _STOFID (IN CHAR8 *, IN UINT32);
4633 EFI_QUESTION_ID _STOQID (IN CHAR8 *, IN UINT32);
4635 VOID _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *);
4637 VOID _DeclareDefaultLinearVarStore (IN UINT32);
4638 VOID _DeclareStandardDefaultStorage (IN UINT32);
4639 VOID _DeclareDefaultFrameworkVarStore (IN UINT32);
4641 VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);
4643 VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32);
4644 VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);
4645 VOID IdEqIdDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN EFI_COMPARE_TYPE);
4646 VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *);
4647 VOID SetOverrideClassGuid (IN EFI_GUID *);
4649 // For framework vfr compatibility
4651 VOID SetCompatibleMode (IN BOOLEAN);
4657 EfiVfrParser::_SAVE_OPHDR_COND (
4658 IN CIfrOpHeader &OpHdr,
4664 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {
4667 mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr);
4668 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo;
4673 EfiVfrParser::_CLEAR_SAVED_OPHDR (
4677 mCIfrOpHdr[mCIfrOpHdrIndex] = NULL;
4678 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;
4682 EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (
4686 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {
4687 mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1);
4692 // IfrOpHdr is not set, FALSE is return.
4698 EfiVfrParser::_CRT_OP (
4706 EfiVfrParser::_SAVE_CURRQEST_VARINFO (
4707 IN EFI_VARSTORE_INFO &Info
4710 mCurrQestVarInfo = Info;
4714 EfiVfrParser::_GET_CURRQEST_VARTINFO (
4718 return mCurrQestVarInfo;
4722 EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE (
4728 switch (mCurrQestVarInfo.mVarType) {
4729 case EFI_IFR_TYPE_NUM_SIZE_8:
4733 case EFI_IFR_TYPE_NUM_SIZE_16:
4737 case EFI_IFR_TYPE_NUM_SIZE_32:
4741 case EFI_IFR_TYPE_NUM_SIZE_64:
4749 return (mCurrQestVarInfo.mVarTotalSize / Size);
4753 EfiVfrParser::_GET_CURRQEST_DATATYPE (
4757 return mCurrQestVarInfo.mVarType;
4761 EfiVfrParser::_GET_CURRQEST_VARSIZE (
4765 return mCurrQestVarInfo.mVarTotalSize;
4769 EfiVfrParser::_PCATCH (
4772 IN ANTLRTokenPtr Tok,
4773 IN CONST CHAR8 *ErrorMsg
4776 if (ReturnCode != ExpectCode) {
4778 gCVfrErrorHandle.PrintMsg (Tok->getLine(), Tok->getText(), "Error", ErrorMsg);
4783 EfiVfrParser::_PCATCH (
4784 IN EFI_VFR_RETURN_CODE ReturnCode
4787 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode);
4791 EfiVfrParser::_PCATCH (
4792 IN EFI_VFR_RETURN_CODE ReturnCode,
4793 IN ANTLRTokenPtr Tok
4796 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());
4800 EfiVfrParser::_PCATCH (
4801 IN EFI_VFR_RETURN_CODE ReturnCode,
4805 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum);
4809 EfiVfrParser::_PCATCH (
4810 IN EFI_VFR_RETURN_CODE ReturnCode,
4812 IN CONST CHAR8 *ErrorMsg
4815 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg);
4820 ANTLRAbstractToken *Tok,
4823 ANTLRTokenType ETok,
4827 gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());
4833 EfiVfrParser::TrimHex (
4840 while (*Str && *Str == ' ') {
4843 while (*Str && *Str == '0') {
4846 if (*Str && (*Str == 'x' || *Str == 'X')) {
4855 EfiVfrParser::_U32TOS (
4860 Str = new CHAR8[20];
4861 sprintf (Str, "%d", Value);
4866 EfiVfrParser::_STOU8 (
4875 UINT8 PreviousValue;
4876 CHAR8 *OrigString = Str;
4877 CHAR8 ErrorMsg[100];
4879 Str = TrimHex (Str, &IsHex);
4880 for (Value = 0; (c = *Str) != '\0'; Str++) {
4881 PreviousValue = Value;
4882 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
4884 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
4885 Value += (c - 'a' + 10);
4887 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
4888 Value += (c - 'A' + 10);
4890 if (c >= '0' && c <= '9') {
4893 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {
4894 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString);
4895 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);
4903 EfiVfrParser::_STOU16 (
4912 UINT16 PreviousValue;
4913 CHAR8 *OrigString = Str;
4914 CHAR8 ErrorMsg[100];
4916 Str = TrimHex (Str, &IsHex);
4917 for (Value = 0; (c = *Str) != '\0'; Str++) {
4918 PreviousValue = Value;
4919 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
4921 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
4922 Value += (c - 'a' + 10);
4924 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
4925 Value += (c - 'A' + 10);
4927 if (c >= '0' && c <= '9') {
4930 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) {
4931 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString);
4932 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);
4940 EfiVfrParser::_STOU32 (
4949 UINT32 PreviousValue;
4950 CHAR8 *OrigString = Str;
4951 CHAR8 ErrorMsg[100];
4953 Str = TrimHex (Str, &IsHex);
4954 for (Value = 0; (c = *Str) != '\0'; Str++) {
4955 PreviousValue = Value;
4956 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
4958 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
4959 Value += (c - 'a' + 10);
4961 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
4962 Value += (c - 'A' + 10);
4964 if (c >= '0' && c <= '9') {
4967 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) {
4968 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString);
4969 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);
4977 EfiVfrParser::_STOU64 (
4985 UINT64 PreviousValue;
4986 CHAR8 *OrigString = Str;
4987 CHAR8 ErrorMsg[100];
4989 Str = TrimHex (Str, &IsHex);
4990 for (Value = 0; (c = *Str) != '\0'; Str++) {
4991 PreviousValue = Value;
4992 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
4994 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
4995 Value += (c - 'a' + 10);
4997 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
4998 Value += (c - 'A' + 10);
5000 if (c >= '0' && c <= '9') {
5003 if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) {
5004 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString);
5005 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg);
5013 EfiVfrParser::_STOD (
5022 Date.Year = _STOU16 (Year, LineNum);
5023 Date.Month = _STOU8 (Month, LineNum);
5024 Date.Day = _STOU8 (Day, LineNum);
5030 EfiVfrParser::_STOT (
5039 Time.Hour = _STOU8 (Hour, LineNum);
5040 Time.Minute = _STOU8 (Minute, LineNum);
5041 Time.Second = _STOU8 (Second, LineNum);
5047 EfiVfrParser::_STOSID (
5052 return (EFI_STRING_ID)_STOU16(Str, LineNum);
5056 EfiVfrParser::_STOFID (
5061 return (EFI_FORM_ID)_STOU16(Str, LineNum);
5065 EfiVfrParser::_STOQID (
5070 return (EFI_QUESTION_ID)_STOU16(Str, LineNum);
5074 EfiVfrParser::_STRCAT (
5075 IN OUT CHAR8 **Dest,
5082 if ((Dest == NULL) || (Src == NULL)) {
5086 Len = (*Dest == NULL) ? 0 : strlen (*Dest);
5087 Len += strlen (Src);
5088 if ((NewStr = new CHAR8[Len + 1]) == NULL) {
5092 if (*Dest != NULL) {
5093 strcpy (NewStr, *Dest);
5096 strcat (NewStr, Src);
5102 EfiVfrParser::_STOR (
5103 IN CHAR8 *QuestionId,
5105 IN EFI_GUID *FormSetGuid,
5106 IN CHAR8 *DevicePath,
5113 memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID));
5114 Ref.QuestionId = _STOQID (QuestionId, LineNum);
5115 Ref.FormId = _STOFID (FormId, LineNum);
5116 Ref.DevicePath = _STOSID (DevicePath, LineNum);
5122 // framework vfr to default declare varstore for each structure
5125 EfiVfrParser::_DeclareDefaultFrameworkVarStore (
5129 SVfrVarStorageNode *pNode;
5132 CONST CHAR8 VarName[] = "Setup";
5135 pNode = gCVfrDataStorage.GetBufferVarStoreList();
5136 if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) {
5138 // Create the default Buffer Var Store when no VarStore is defined.
5139 // its name should be "Setup"
5141 gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize);
5143 VSObj.SetLineNo (LineNo);
5144 VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store
5145 VSObj.SetSize ((UINT16) TypeSize);
5146 //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName);
5147 VSObj.SetName ((CHAR8 *) VarName);
5148 VSObj.SetGuid (&mFormsetGuid);
5150 printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName);
5153 for (; pNode != NULL; pNode = pNode->mNext) {
5155 // create the default varstore opcode for not declared varstore
5156 // the first varstore name should be "Setup"
5158 if (!pNode->mAssignedFlag) {
5160 VSObj.SetLineNo (LineNo);
5161 VSObj.SetVarStoreId (pNode->mVarStoreId);
5162 VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize);
5164 VSObj.SetName ((CHAR8 *) VarName);
5167 VSObj.SetName (pNode->mVarStoreName);
5169 VSObj.SetGuid (&pNode->mGuid);
5171 printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);
5177 pNode = gCVfrDataStorage.GetEfiVarStoreList();
5178 for (; pNode != NULL; pNode = pNode->mNext) {
5180 // create the default efi varstore opcode for not exist varstore
5182 if (!pNode->mAssignedFlag) {
5183 CIfrVarStoreEfi VSEObj;
5184 VSEObj.SetLineNo (LineNo);
5185 VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute
5186 VSEObj.SetGuid (&pNode->mGuid);
5187 VSEObj.SetVarStoreId (pNode->mVarStoreId);
5188 // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode,
5189 // which is 3 bytes less than new structure define in UEFI Spec 2.3.1.
5190 VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3);
5192 printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId);
5200 EfiVfrParser::_DeclareDefaultLinearVarStore (
5205 CHAR8 **TypeNameList;
5207 CONST CHAR8 DateName[] = "Date";
5208 CONST CHAR8 TimeName[] = "Time";
5209 CONST CHAR8 DateType[] = "EFI_HII_DATE";
5210 CONST CHAR8 TimeType[] = "EFI_HII_TIME";
5212 gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);
5214 for (Index = 0; Index < ListSize; Index++) {
5216 EFI_VARSTORE_ID VarStoreId;
5219 VSObj.SetLineNo (LineNo);
5220 gCVfrDataStorage.DeclareBufferVarStore (
5221 TypeNameList[Index],
5223 &gCVfrVarDataTypeDB,
5224 TypeNameList[Index],
5225 EFI_VARSTORE_ID_INVALID
5227 gCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid);
5228 VSObj.SetVarStoreId (VarStoreId);
5229 gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);
5230 VSObj.SetSize ((UINT16) Size);
5231 VSObj.SetName (TypeNameList[Index]);
5232 VSObj.SetGuid (&mFormsetGuid);
5236 // not required to declare Date and Time VarStore,
5237 // because code to support old format Data and Time
5239 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) {
5241 EFI_VARSTORE_ID VarStoreId;
5244 VSObj.SetLineNo (LineNo);
5245 gCVfrDataStorage.DeclareBufferVarStore (
5248 &gCVfrVarDataTypeDB,
5250 EFI_VARSTORE_ID_INVALID
5252 gCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid);
5253 VSObj.SetVarStoreId (VarStoreId);
5254 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size);
5255 VSObj.SetSize ((UINT16) Size);
5256 VSObj.SetName ((CHAR8 *) DateName);
5257 VSObj.SetGuid (&mFormsetGuid);
5260 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) {
5262 EFI_VARSTORE_ID VarStoreId;
5265 VSObj.SetLineNo (LineNo);
5266 gCVfrDataStorage.DeclareBufferVarStore (
5269 &gCVfrVarDataTypeDB,
5271 EFI_VARSTORE_ID_INVALID
5273 gCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid);
5274 VSObj.SetVarStoreId (VarStoreId);
5275 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size);
5276 VSObj.SetSize ((UINT16) Size);
5277 VSObj.SetName ((CHAR8 *) TimeName);
5278 VSObj.SetGuid (&mFormsetGuid);
5283 EfiVfrParser::_DeclareStandardDefaultStorage (
5288 // Default Store is declared.
5290 CIfrDefaultStore DSObj;
5292 gCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);
5293 DSObj.SetLineNo (LineNo);
5294 DSObj.SetDefaultName (EFI_STRING_ID_INVALID);
5295 DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);
5298 // Default MANUFACTURING Store is declared.
5300 CIfrDefaultStore DSObjMF;
5302 gCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING);
5303 DSObjMF.SetLineNo (LineNo);
5304 DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID);
5305 DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING);
5309 EfiVfrParser::AssignQuestionKey (
5310 IN CIfrQuestionHeader &QHObj,
5311 IN ANTLRTokenPtr KeyTok
5316 if (KeyTok == NULL) {
5320 KeyValue = _STOU16 (KeyTok->getText(), KeyTok->getLine());
5322 if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {
5324 * if the question is not CALLBACK ignore the key.
5326 _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);
5327 QHObj.SetQuestionId (KeyValue);
5332 EfiVfrParser::ConvertIdExpr (
5333 IN UINT32 &ExpOpCount,
5335 IN EFI_QUESTION_ID QId,
5340 CIfrQuestionRef1 QR1Obj(LineNo);
5341 QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);
5342 _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));
5345 CIfrUint32 U32Obj(LineNo);
5346 U32Obj.SetValue (BitMask);
5348 CIfrBitWiseAnd BWAObj(LineNo);
5350 CIfrUint8 U8Obj(LineNo);
5352 case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break;
5353 case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;
5354 case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break;
5355 case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break;
5356 case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;
5359 CIfrShiftRight SRObj(LineNo);
5366 EfiVfrParser::IdEqValDoSpecial (
5367 IN UINT32 &ExpOpCount,
5369 IN EFI_QUESTION_ID QId,
5373 IN EFI_COMPARE_TYPE CompareType
5376 ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);
5378 if (ConstVal > 0xFF) {
5379 CIfrUint16 U16Obj(LineNo);
5380 U16Obj.SetValue (ConstVal);
5382 CIfrUint8 U8Obj(LineNo);
5383 U8Obj.SetValue ((UINT8)ConstVal);
5386 switch (CompareType) {
5389 CIfrEqual EObj(LineNo);
5394 CIfrLessEqual LEObj(LineNo);
5399 CIfrLessThan LTObj(LineNo);
5402 case GREATER_EQUAL :
5404 CIfrGreaterEqual GEObj(LineNo);
5409 CIfrGreaterThan GTObj(LineNo);
5418 EfiVfrParser::IdEqIdDoSpecial (
5419 IN UINT32 &ExpOpCount,
5421 IN EFI_QUESTION_ID QId1,
5422 IN CHAR8 *VarId1Str,
5424 IN EFI_QUESTION_ID QId2,
5425 IN CHAR8 *VarId2Str,
5427 IN EFI_COMPARE_TYPE CompareType
5430 ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);
5431 ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);
5433 switch (CompareType) {
5436 CIfrEqual EObj(LineNo);
5441 CIfrLessEqual LEObj(LineNo);
5446 CIfrLessThan LTObj(LineNo);
5449 case GREATER_EQUAL :
5451 CIfrGreaterEqual GEObj(LineNo);
5456 CIfrGreaterThan GTObj(LineNo);
5465 EfiVfrParser::IdEqListDoSpecial (
5466 IN UINT32 &ExpOpCount,
5468 IN EFI_QUESTION_ID QId,
5472 IN UINT16 *ValueList
5481 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);
5482 for (Index = 1; Index < ListLen; Index++) {
5483 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);
5484 CIfrOr OObj (LineNo);
5490 EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid)
5492 mOverrideClassGuid = OverrideClassGuid;
5496 // For framework vfr compatibility
5499 EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode)
5501 mCompatibleMode = Mode;
5502 mCVfrQuestionDB.SetCompatibleMode (Mode);
5506 EfiVfrParser::CheckDuplicateDefaultValue (
5507 IN EFI_DEFAULT_ID DefaultId,
5508 IN ANTLRTokenPtr Tok
5513 for(Index = 0; Index < mUsedDefaultCount; Index++) {
5514 if (mUsedDefaultArray[Index] == DefaultId) {
5515 gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());
5519 if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {
5520 gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());
5523 mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;