1 /*++ @file 2 Vfr Syntax 3 4 Copyright (c) 2004 - 2015, 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 9 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. 12 13 --*/ 14 15 #header<< 16 17 #include "EfiVfr.h" 18 #include "VfrFormPkg.h" 19 #include "VfrError.h" 20 #include "VfrUtilityLib.h" 21 #include "AToken.h" 22 #include "ATokPtr.h" 23 >> 24 25 << 26 #include "stdio.h" 27 #include "PBlackBox.h" 28 #include "DLexerBase.h" 29 #include "VfrLexer.h" 30 #include "AToken.h" 31 32 #define GET_LINENO(Obj) ((Obj)->getLine()) 33 #define SET_LINE_INFO(Obj, L) {(Obj).SetLineNo((L)->getLine());} while (0) 34 #define CRT_END_OP(Obj) {CIfrEnd EObj; if (Obj != NULL) EObj.SetLineNo ((Obj)->getLine());} while (0) 35 36 typedef ANTLRCommonToken ANTLRToken; 37 38 class CVfrDLGLexer : public VfrLexer 39 { 40 public: 41 CVfrDLGLexer (DLGFileInput *F) : VfrLexer (F) {}; 42 INT32 errstd (char *Text) 43 { 44 printf ("unrecognized input '%s'\n", Text); 45 } 46 }; 47 48 UINT8 49 VfrParserStart ( 50 IN FILE *File, 51 IN INPUT_INFO_TO_SYNTAX *InputInfo 52 ) 53 { 54 ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File); 55 VfrParser.parser()->SetCompatibleMode (InputInfo->CompatibleMode); 56 VfrParser.parser()->SetOverrideClassGuid (InputInfo->OverrideClassGuid); 57 return VfrParser.parser()->vfrProgram(); 58 } 59 >> 60 61 // 62 // Define a lexical class for parsing quoted strings. Basically 63 // starts with a double quote, and ends with a double quote that 64 // is not preceeded with a backslash. 65 // 66 #lexclass QUOTED_STRING 67 #token TheString "~[\"]*\"" << mode (START); >> 68 69 // 70 // Define a lexclass for skipping over C++ style comments 71 // 72 #lexclass CPP_COMMENT 73 #token "~[\n]*" << skip (); >> 74 #token "\n" << skip (); mode (START); newline (); >> 75 76 // 77 // Standard lexclass is START 78 // 79 #lexclass START 80 81 // 82 // Find start of C++ style comments 83 // 84 #token "//" << skip (); mode (CPP_COMMENT); >> 85 86 // 87 // Skip whitespace 88 // 89 #token "[\ \t]" << skip (); >> 90 91 // 92 // Skip over newlines, but count them 93 // 94 #token "\n" << skip (); newline (); >> 95 96 // 97 // Skip over 'extern' in any included .H file 98 // 99 #token "extern" << skip (); mode (CPP_COMMENT); >> 100 101 // 102 // Tokens for the different keywords. Syntax is: 103 // TokenName("ErrorMessageText") "TokenString" 104 // where: 105 // TokenName is the token name (must be capitalized) that is used in the rules 106 // ErrorMessageText is the string the compiler emits when it detects a syntax error 107 // TokenString is the actual matching string used in the user script 108 // 109 #token FormPkgType("formpkgtype") "formpkgtype" 110 #token OpenBrace("{") "\{" 111 #token CloseBrace("}") "\}" 112 #token OpenParen("(") "\(" 113 #token CloseParen(")") "\)" 114 #token OpenBracket("[") "\[" 115 #token CloseBracket("]") "\]" 116 117 #token LineDefinition "#line\ [0-9]+\ \"~[\"]+\"[\ \t]*\n" << gCVfrErrorHandle.ParseFileScopeRecord (begexpr (), line ()); skip (); newline (); >> 118 #token DevicePath("devicepath") "devicepath" 119 #token FormSet("formset") "formset" 120 #token FormSetId("formsetid") "formsetid" 121 #token EndFormSet("endformset") "endformset" 122 #token Title("title") "title" 123 #token FormId("formid") "formid" 124 #token OneOf("oneof") "oneof" 125 #token EndOneOf("endoneof") "endoneof" 126 #token Prompt("prompt") "prompt" 127 #token OrderedList("orderedlist") "orderedlist" 128 #token MaxContainers("maxcontainers") "maxcontainers" 129 #token EndList("endlist") "endlist" 130 #token EndForm("endform") "endform" 131 #token Form("form") "form" 132 #token FormMap("formmap") "formmap" 133 #token MapTitle("maptitle") "maptitle" 134 #token MapGuid("mapguid") "mapguid" 135 #token Subtitle("subtitle") "subtitle" 136 #token EndSubtitle("endsubtitle") "endsubtitle" 137 #token Help("help") "help" 138 #token Text("text") "text" 139 #token Option("option") "option" 140 #token FLAGS("flags") "flags" 141 #token Date("date") "date" 142 #token EndDate("enddate") "enddate" 143 #token Year("year") "year" 144 #token Month("month") "month" 145 #token Day("day") "day" 146 #token Time("time") "time" 147 #token EndTime("endtime") "endtime" 148 #token Hour("hour") "hour" 149 #token Minute("minute") "minute" 150 #token Second("second") "second" 151 #token GrayOutIf("grayoutif") "grayoutif" 152 #token Label("label") "label" 153 #token Timeout("timeout") "timeout" 154 #token Inventory("inventory") "inventory" 155 #token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP" 156 #token Struct("struct") "struct" 157 #token Boolean("BOOLEAN") "BOOLEAN" 158 #token Uint64("UINT64") "UINT64" 159 #token Uint32("UINT32") "UINT32" 160 #token Uint16("UINT16") "UINT16" 161 #token Char16("CHAR16") "CHAR16" 162 #token Uint8("UINT8") "UINT8" 163 #token Uuid("guid") "guid" 164 #token CheckBox("checkbox") "checkbox" 165 #token EndCheckBox("endcheckbox") "endcheckbox" 166 #token Numeric("numeric") "numeric" 167 #token EndNumeric("endnumeric") "endnumeric" 168 #token Minimum("minimum") "minimum" 169 #token Maximum("maximum") "maximum" 170 #token STEP("step") "step" 171 #token Default("default") "default" 172 #token Password("password") "password" 173 #token EndPassword("endpassword") "endpassword" 174 #token String("string") "string" 175 #token EndString("endstring") "endstring" 176 #token MinSize("minsize") "minsize" 177 #token MaxSize("maxsize") "maxsize" 178 #token Encoding("encoding") "encoding" 179 #token SuppressIf("suppressif") "suppressif" 180 #token DisableIf("disableif") "disableif" 181 #token Hidden("hidden") "hidden" 182 #token Goto("goto") "goto" 183 #token FormSetGuid("formsetguid") "formsetguid" 184 #token InconsistentIf("inconsistentif") "inconsistentif" 185 #token WarningIf("warningif") "warningif" 186 #token NoSubmitIf("nosubmitif") "nosubmitif" 187 #token EndIf("endif") "endif" 188 #token Key("key") "key" 189 #token DefaultFlag("DEFAULT") "DEFAULT" 190 #token ManufacturingFlag("MANUFACTURING") "MANUFACTURING" 191 #token InteractiveFlag("INTERACTIVE") "INTERACTIVE" 192 #token NVAccessFlag("NV_ACCESS") "NV_ACCESS" 193 #token ResetRequiredFlag("RESET_REQUIRED") "RESET_REQUIRED" 194 #token ReconnectRequiredFlag("RECONNECT_REQUIRED") "RECONNECT_REQUIRED" 195 #token LateCheckFlag("LATE_CHECK") "LATE_CHECK" 196 #token ReadOnlyFlag("READ_ONLY") "READ_ONLY" 197 #token OptionOnlyFlag("OPTIONS_ONLY") "OPTIONS_ONLY" 198 #token Class("class") "class" 199 #token Subclass("subclass") "subclass" 200 #token ClassGuid("classguid") "classguid" 201 #token TypeDef("typedef") "typedef" 202 #token Restore("restore") "restore" 203 #token Save("save") "save" 204 #token Defaults("defaults") "defaults" 205 #token Banner("banner") "banner" 206 #token Align("align") "align" 207 #token Left("left") "left" 208 #token Right("right") "right" 209 #token Center("center") "center" 210 #token Line("line") "line" 211 #token Name("name") "name" 212 213 #token VarId("varid") "varid" 214 #token Question("question") "question" 215 #token QuestionId("questionid") "questionid" 216 #token Image("image") "image" 217 #token Locked("locked") "locked" 218 #token Rule("rule") "rule" 219 #token EndRule("endrule") "endrule" 220 #token Value("value") "value" 221 #token Read("read") "read" 222 #token Write("write") "write" 223 #token ResetButton("resetbutton") "resetbutton" 224 #token EndResetButton("endresetbutton") "endresetbutton" 225 #token DefaultStore("defaultstore") "defaultstore" 226 #token Attribute("attribute") "attribute" 227 #token Varstore("varstore") "varstore" 228 #token Efivarstore("efivarstore") "efivarstore" 229 #token VarSize("varsize") "varsize" 230 #token NameValueVarStore("namevaluevarstore") "namevaluevarstore" 231 #token Action("action") "action" 232 #token Config("config") "config" 233 #token EndAction("endaction") "endaction" 234 #token Refresh("refresh") "refresh" 235 #token Interval("interval") "interval" 236 #token VarstoreDevice("varstoredevice") "varstoredevice" 237 #token GuidOp("guidop") "guidop" 238 #token EndGuidOp("endguidop") "endguidop" 239 #token DataType("datatype") "datatype" 240 #token Data("data") "data" 241 #token Modal("modal") "modal" 242 243 // 244 // Define the class and subclass tokens 245 // 246 #token ClassNonDevice("NONDEVICE") "NON_DEVICE" 247 #token ClassDiskDevice("DISK_DEVICE") "DISK_DEVICE" 248 #token ClassVideoDevice("VIDEO_DEVICE") "VIDEO_DEVICE" 249 #token ClassNetworkDevice("NETWORK_DEVICE") "NETWORK_DEVICE" 250 #token ClassInputDevice("INPUT_DEVICE") "INPUT_DEVICE" 251 #token ClassOnBoardDevice("ONBOARD_DEVICE") "ONBOARD_DEVICE" 252 #token ClassOtherDevice("OTHER_DEVICE") "OTHER_DEVICE" 253 254 #token SubclassSetupApplication("SETUP_APPLICATION") "SETUP_APPLICATION" 255 #token SubclassGeneralApplication("GENERAL_APPLICATION") "GENERAL_APPLICATION" 256 #token SubclassFrontPage("FRONT_PAGE") "FRONT_PAGE" 257 #token SubclassSingleUse("SINGLE_USE") "SINGLE_USE" 258 259 // 260 // This is the overall definition of a VFR form definition script. 261 // 262 263 vfrProgram > [UINT8 Return] : 264 << 265 mParserStatus = 0; 266 mCIfrOpHdrIndex = 0; 267 mConstantOnlyInExpression = FALSE; 268 >> 269 ( 270 vfrPragmaPackDefinition 271 | vfrDataStructDefinition 272 )* 273 vfrFormSetDefinition 274 << $Return = mParserStatus; >> 275 ; 276 277 pragmaPackShowDef : 278 L:"show" << gCVfrVarDataTypeDB.Pack (L->getLine(), VFR_PACK_SHOW); >> 279 ; 280 281 pragmaPackStackDef : 282 << 283 UINT32 LineNum; 284 UINT8 PackAction; 285 CHAR8 *Identifier = NULL; 286 UINT32 PackNumber = DEFAULT_PACK_ALIGN; 287 >> 288 ( 289 L1:"push" << LineNum = L1->getLine(); PackAction = VFR_PACK_PUSH; >> 290 | L2:"pop" << LineNum = L2->getLine(); PackAction = VFR_PACK_POP; >> 291 ) 292 { 293 "," ID:StringIdentifier << Identifier = ID->getText(); >> 294 } 295 { 296 "," N:Number << PackAction |= VFR_PACK_ASSIGN; PackNumber = _STOU32(N->getText(), N->getLine()); >> 297 } 298 << gCVfrVarDataTypeDB.Pack (LineNum, PackAction, Identifier, PackNumber); >> 299 ; 300 301 pragmaPackNumber : 302 << 303 UINT32 LineNum; 304 UINT32 PackNumber = DEFAULT_PACK_ALIGN; 305 >> 306 N:Number << LineNum = N->getLine(); PackNumber = _STOU32(N->getText(), N->getLine()); >> 307 << gCVfrVarDataTypeDB.Pack (LineNum, VFR_PACK_ASSIGN, NULL, PackNumber); >> 308 ; 309 310 vfrPragmaPackDefinition : 311 "\#pragma" "pack" "\(" 312 { 313 pragmaPackShowDef 314 | pragmaPackStackDef 315 | pragmaPackNumber 316 } 317 "\)" 318 ; 319 320 vfrDataStructDefinition : 321 { TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >> 322 { NonNvDataMap } 323 { 324 N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >> 325 } 326 OpenBrace 327 vfrDataStructFields 328 CloseBrace 329 { 330 N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >> 331 } 332 ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >> 333 ; 334 335 vfrDataStructFields : 336 ( 337 dataStructField64 | 338 dataStructField32 | 339 dataStructField16 | 340 dataStructField8 | 341 dataStructFieldBool | 342 dataStructFieldString | 343 dataStructFieldDate | 344 dataStructFieldTime | 345 dataStructFieldRef | 346 dataStructFieldUser 347 )* 348 ; 349 350 dataStructField64 : 351 << UINT32 ArrayNum = 0; >> 352 D:"UINT64" 353 N:StringIdentifier 354 { 355 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 356 } 357 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> 358 ; 359 360 dataStructField32 : 361 << UINT32 ArrayNum = 0; >> 362 D:"UINT32" 363 N:StringIdentifier 364 { 365 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 366 } 367 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> 368 ; 369 370 dataStructField16 : 371 << 372 UINT32 ArrayNum = 0; 373 >> 374 ("UINT16" | "CHAR16") 375 N:StringIdentifier 376 { 377 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 378 } 379 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >> 380 ; 381 382 dataStructField8 : 383 << UINT32 ArrayNum = 0; >> 384 D:"UINT8" 385 N:StringIdentifier 386 { 387 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 388 } 389 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> 390 ; 391 392 dataStructFieldBool : 393 << UINT32 ArrayNum = 0; >> 394 D:"BOOLEAN" 395 N:StringIdentifier 396 { 397 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 398 } 399 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> 400 ; 401 402 dataStructFieldString : 403 << UINT32 ArrayNum = 0; >> 404 D:"EFI_STRING_ID" 405 N:StringIdentifier 406 { 407 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 408 } 409 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> 410 ; 411 412 dataStructFieldDate : 413 << UINT32 ArrayNum = 0; >> 414 D:"EFI_HII_DATE" 415 N:StringIdentifier 416 { 417 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 418 } 419 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> 420 ; 421 422 dataStructFieldTime : 423 << UINT32 ArrayNum = 0; >> 424 D:"EFI_HII_TIME" 425 N:StringIdentifier 426 { 427 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 428 } 429 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> 430 ; 431 432 dataStructFieldRef : 433 << UINT32 ArrayNum = 0; >> 434 D:"EFI_HII_REF" 435 N:StringIdentifier 436 { 437 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 438 } 439 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >> 440 ; 441 442 dataStructFieldUser : 443 << UINT32 ArrayNum = 0; >> 444 T:StringIdentifier 445 N:StringIdentifier 446 { 447 OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 448 } 449 ";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >> 450 ; 451 452 //***************************************************************************** 453 // 454 // the syntax of GUID definition 455 // 456 guidSubDefinition [EFI_GUID &Guid] : 457 G4:Number "," G5:Number "," G6:Number "," G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number 458 << 459 Guid.Data4[0] = _STOU8(G4->getText(), G4->getLine()); 460 Guid.Data4[1] = _STOU8(G5->getText(), G5->getLine()); 461 Guid.Data4[2] = _STOU8(G6->getText(), G6->getLine()); 462 Guid.Data4[3] = _STOU8(G7->getText(), G7->getLine()); 463 Guid.Data4[4] = _STOU8(G8->getText(), G8->getLine()); 464 Guid.Data4[5] = _STOU8(G9->getText(), G9->getLine()); 465 Guid.Data4[6] = _STOU8(G10->getText(), G10->getLine()); 466 Guid.Data4[7] = _STOU8(G11->getText(), G11->getLine()); 467 >> 468 ; 469 470 guidDefinition [EFI_GUID &Guid] : 471 OpenBrace 472 G1:Number "," G2:Number "," G3:Number "," 473 << 474 Guid.Data1 = _STOU32 (G1->getText(), G1->getLine()); 475 Guid.Data2 = _STOU16 (G2->getText(), G2->getLine()); 476 Guid.Data3 = _STOU16 (G3->getText(), G3->getLine()); 477 >> 478 ( 479 OpenBrace guidSubDefinition[Guid] CloseBrace 480 | guidSubDefinition[Guid] 481 ) 482 CloseBrace 483 ; 484 485 //***************************************************************************** 486 // 487 // the syntax of form set definition 488 // 489 vfrFormSetDefinition : 490 << 491 EFI_GUID Guid; 492 EFI_GUID DefaultClassGuid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID; 493 EFI_GUID ClassGuid1, ClassGuid2, ClassGuid3; 494 UINT8 ClassGuidNum = 0; 495 CIfrFormSet *FSObj = NULL; 496 UINT16 C, SC; 497 CHAR8* InsertOpcodeAddr = NULL; 498 >> 499 L:FormSet 500 Uuid "=" guidDefinition[Guid] "," 501 Title "=" "STRING_TOKEN" "\(" S1:Number "\)" "," 502 Help "=" "STRING_TOKEN" "\(" S2:Number "\)" "," 503 { 504 ClassGuid "=" guidDefinition[ClassGuid1] << ++ClassGuidNum; >> 505 { 506 "\|" guidDefinition[ClassGuid2] << ++ClassGuidNum; >> 507 { 508 "\|" guidDefinition[ClassGuid3] << ++ClassGuidNum; >> 509 } 510 } 511 "," 512 } 513 << 514 if (mOverrideClassGuid != NULL && ClassGuidNum >= 3) { 515 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Already has 3 class guids, can't add extra class guid!"); 516 } 517 switch (ClassGuidNum) { 518 case 0: 519 if (mOverrideClassGuid != NULL) { 520 ClassGuidNum = 2; 521 } else { 522 ClassGuidNum = 1; 523 } 524 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID)); 525 FSObj->SetClassGuid(&DefaultClassGuid); 526 if (mOverrideClassGuid != NULL) { 527 FSObj->SetClassGuid(mOverrideClassGuid); 528 } 529 break; 530 case 1: 531 if (mOverrideClassGuid != NULL) { 532 ClassGuidNum ++; 533 } 534 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID)); 535 FSObj->SetClassGuid(&ClassGuid1); 536 if (mOverrideClassGuid != NULL) { 537 FSObj->SetClassGuid(mOverrideClassGuid); 538 } 539 break; 540 case 2: 541 if (mOverrideClassGuid != NULL) { 542 ClassGuidNum ++; 543 } 544 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID)); 545 FSObj->SetClassGuid(&ClassGuid1); 546 FSObj->SetClassGuid(&ClassGuid2); 547 if (mOverrideClassGuid != NULL) { 548 FSObj->SetClassGuid(mOverrideClassGuid); 549 } 550 break; 551 case 3: 552 FSObj = new CIfrFormSet(sizeof(EFI_IFR_FORM_SET) + ClassGuidNum * sizeof(EFI_GUID)); 553 FSObj->SetClassGuid(&ClassGuid1); 554 FSObj->SetClassGuid(&ClassGuid2); 555 FSObj->SetClassGuid(&ClassGuid3); 556 break; 557 default: 558 break; 559 } 560 561 SET_LINE_INFO (*FSObj, L); 562 FSObj->SetGuid (&Guid); 563 // 564 // for framework vfr to store formset guid used by varstore and efivarstore 565 // 566 if (mCompatibleMode) { 567 memcpy (&mFormsetGuid, &Guid, sizeof (EFI_GUID)); 568 } 569 FSObj->SetFormSetTitle (_STOSID(S1->getText(), S1->getLine())); 570 FSObj->SetHelp (_STOSID(S2->getText(), S2->getLine())); 571 >> 572 { 573 FC:Class "=" classDefinition[C] "," << {CIfrClass CObj;SET_LINE_INFO (CObj, FC); CObj.SetClass(C);} >> 574 } 575 { 576 FSC:Subclass "=" subclassDefinition[SC] "," << {CIfrSubClass SCObj; SET_LINE_INFO (SCObj, FSC); SCObj.SetSubClass(SC);} >> 577 } 578 << 579 _DeclareStandardDefaultStorage (GET_LINENO (L)); 580 >> 581 vfrFormSetList 582 E:EndFormSet << 583 if (mCompatibleMode) { 584 // 585 // declare all undefined varstore and efivarstore 586 // 587 _DeclareDefaultFrameworkVarStore (GET_LINENO(E)); 588 } 589 590 // 591 // Declare undefined Question so that they can be used in expression. 592 // 593 if (gCFormPkg.HavePendingUnassigned()) { 594 mParserStatus += gCFormPkg.DeclarePendingQuestion ( 595 gCVfrVarDataTypeDB, 596 mCVfrDataStorage, 597 mCVfrQuestionDB, 598 &mFormsetGuid, 599 E->getLine(), 600 &InsertOpcodeAddr 601 ); 602 gNeedAdjustOpcode = TRUE; 603 } 604 605 CRT_END_OP (E); 606 607 // 608 // Adjust the pending question position. 609 // Move the position from current to before the end of the last form in the form set. 610 // 611 if (gNeedAdjustOpcode) { 612 gCFormPkg.AdjustDynamicInsertOpcode ( 613 mLastFormEndAddr, 614 InsertOpcodeAddr 615 ); 616 } 617 618 if (FSObj != NULL) { 619 delete FSObj; 620 } 621 >> 622 ";" 623 ; 624 625 vfrFormSetList : 626 ( 627 vfrFormDefinition | 628 vfrFormMapDefinition | 629 vfrStatementImage | 630 vfrStatementVarStoreLinear | 631 vfrStatementVarStoreEfi | 632 vfrStatementVarStoreNameValue | 633 vfrStatementDefaultStore | 634 vfrStatementDisableIfFormSet | 635 vfrStatementSuppressIfFormSet | 636 vfrStatementExtension 637 )* 638 ; 639 640 vfrStatementExtension: 641 << 642 EFI_GUID Guid; 643 CIfrGuid *GuidObj = NULL; 644 CHAR8 *TypeName = NULL; 645 UINT32 TypeSize = 0; 646 UINT8 *DataBuff = NULL; 647 UINT32 Size = 0; 648 UINT8 Idx = 0; 649 UINT32 LineNum; 650 BOOLEAN IsStruct = FALSE; 651 UINT32 ArrayNum = 0; 652 >> 653 L:GuidOp 654 Uuid "=" guidDefinition[Guid] 655 {"," DataType "=" 656 ( 657 U64:"UINT64" {OpenBracket AN1:Number CloseBracket <<ArrayNum = _STOU32(AN1->getText(), AN1->getLine());>>} 658 << TypeName = U64->getText(); LineNum = U64->getLine(); >> 659 | U32:"UINT32" {OpenBracket AN2:Number CloseBracket <<ArrayNum = _STOU32(AN2->getText(), AN2->getLine());>>} 660 << TypeName = U32->getText(); LineNum = U32->getLine(); >> 661 | U16:"UINT16" {OpenBracket AN3:Number CloseBracket <<ArrayNum = _STOU32(AN3->getText(), AN3->getLine());>>} 662 << TypeName = U16->getText(); LineNum = U16->getLine(); >> 663 | U8:"UINT8" {OpenBracket AN4:Number CloseBracket <<ArrayNum = _STOU32(AN4->getText(), AN4->getLine());>>} 664 << TypeName = U8->getText(); LineNum = U8->getLine(); >> 665 | BL:"BOOLEAN" {OpenBracket AN5:Number CloseBracket <<ArrayNum = _STOU32(AN5->getText(), AN5->getLine());>>} 666 << TypeName = BL->getText(); LineNum = BL->getLine(); >> 667 | SI:"EFI_STRING_ID" {OpenBracket AN6:Number CloseBracket <<ArrayNum = _STOU32(AN6->getText(), AN6->getLine());>>} 668 << TypeName = SI->getText(); LineNum = SI->getLine(); >> 669 | D:"EFI_HII_DATE" {OpenBracket AN7:Number CloseBracket <<ArrayNum = _STOU32(AN7->getText(), AN7->getLine());>>} 670 << TypeName = D->getText(); LineNum = D->getLine(); IsStruct = TRUE;>> 671 | T:"EFI_HII_TIME" {OpenBracket AN8:Number CloseBracket <<ArrayNum = _STOU32(AN8->getText(), AN8->getLine());>>} 672 << TypeName = T->getText(); LineNum = T->getLine(); IsStruct = TRUE;>> 673 | R:"EFI_HII_REF" {OpenBracket AN9:Number CloseBracket <<ArrayNum = _STOU32(AN9->getText(), AN9->getLine());>>} 674 << TypeName = R->getText(); LineNum = R->getLine(); IsStruct = TRUE;>> 675 | TN:StringIdentifier {OpenBracket AN10:Number CloseBracket <<ArrayNum = _STOU32(AN10->getText(), AN10->getLine());>>} 676 << TypeName = TN->getText(); LineNum = TN->getLine(); IsStruct = TRUE;>> 677 ) 678 << 679 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &TypeSize), LineNum); 680 if (ArrayNum > 0) { 681 Size = TypeSize*ArrayNum; 682 } else { 683 Size = TypeSize; 684 } 685 if (Size > (128 - sizeof (EFI_IFR_GUID))) return; 686 DataBuff = (UINT8 *)malloc(Size); 687 for (Idx = 0; Idx < Size; Idx++) { 688 DataBuff[Idx] = 0; 689 } 690 >> 691 vfrExtensionData [DataBuff, Size, TypeName, TypeSize, IsStruct, ArrayNum] 692 } 693 << 694 { 695 GuidObj = new CIfrGuid(Size); 696 if (GuidObj != NULL) { 697 GuidObj->SetLineNo(L->getLine()); 698 GuidObj->SetGuid (&Guid); 699 } 700 } 701 if (TypeName != NULL) { 702 GuidObj->SetData(DataBuff, Size); 703 } 704 >> 705 {"," 706 ( 707 vfrStatementExtension 708 )* 709 E:EndGuidOp << GuidObj->SetScope(1); CRT_END_OP (E); >> 710 } 711 << 712 if (GuidObj != NULL) delete GuidObj; 713 if (DataBuff != NULL) free(DataBuff); 714 >> 715 ";" 716 ; 717 718 vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, BOOLEAN IsStruct, UINT32 ArrayNum]: 719 << 720 CHAR8 *TFName = NULL; 721 UINT32 ArrayIdx = 0; 722 UINT16 FieldOffset; 723 UINT8 FieldType; 724 UINT32 FieldSize; 725 UINT64 Data_U64 = 0; 726 UINT32 Data_U32 = 0; 727 UINT16 Data_U16 = 0; 728 UINT8 Data_U8 = 0; 729 BOOLEAN Data_BL = 0; 730 EFI_STRING_ID Data_SID = 0; 731 BOOLEAN IsArray = FALSE; 732 UINT8 *ByteOffset = NULL; 733 >> 734 ( 735 ("," "data" {OpenBracket IDX1:Number CloseBracket <<IsArray = TRUE;>>} 736 << 737 ArrayIdx = 0; 738 if (IsArray == TRUE) { 739 ArrayIdx = _STOU8(IDX1->getText(), IDX1->getLine()); 740 if (ArrayIdx >= ArrayNum) return; 741 IsArray = FALSE; 742 } 743 ByteOffset = DataBuff + (ArrayIdx * TypeSize); 744 if (IsStruct == TRUE) { 745 _STRCAT(&TFName, TypeName); 746 } 747 >> 748 ("." FN:StringIdentifier 749 << 750 if (IsStruct == TRUE) { 751 _STRCAT(&TFName, "."); 752 _STRCAT(&TFName, FN->getText()); 753 } 754 >> 755 { 756 OpenBracket IDX2:Number CloseBracket 757 << 758 if (IsStruct == TRUE) { 759 _STRCAT(&TFName, "["); 760 _STRCAT(&TFName, IDX2->getText()); 761 _STRCAT(&TFName, "]"); 762 } 763 >> 764 } 765 )* 766 "=" RD:Number 767 << 768 if (IsStruct == FALSE) { 769 if (strcmp ("UINT64", TypeName) == 0) { 770 Data_U64 = _STOU64(RD->getText(), RD->getLine()); 771 memcpy (ByteOffset, &Data_U64, TypeSize); 772 }else if (strcmp ("UINT32", TypeName) == 0) { 773 Data_U32 = _STOU32(RD->getText(), RD->getLine()); 774 memcpy (ByteOffset, &Data_U32, TypeSize); 775 }else if (strcmp ("UINT16", TypeName) == 0) { 776 Data_U16 = _STOU16(RD->getText(), RD->getLine()); 777 memcpy (ByteOffset, &Data_U16, TypeSize); 778 }else if (strcmp ("UINT8", TypeName) == 0) { 779 Data_U8 = _STOU8(RD->getText(), RD->getLine()); 780 memcpy (ByteOffset, &Data_U8, TypeSize); 781 }else if (strcmp ("BOOLEAN", TypeName)== 0) { 782 Data_BL = _STOU8(RD->getText(), RD->getLine()); 783 memcpy (ByteOffset, &Data_BL, TypeSize); 784 }else if (strcmp ("EFI_STRING_ID", TypeName) == 0) { 785 Data_SID = _STOSID(RD->getText(), RD->getLine()); 786 memcpy (ByteOffset, &Data_SID, TypeSize); 787 } 788 } else { 789 gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize); 790 switch (FieldType) { 791 case EFI_IFR_TYPE_NUM_SIZE_8: 792 Data_U8 = _STOU8(RD->getText(), RD->getLine()); 793 memcpy (ByteOffset + FieldOffset, &Data_U8, FieldSize); 794 break; 795 case EFI_IFR_TYPE_NUM_SIZE_16: 796 Data_U16 = _STOU16(RD->getText(), RD->getLine()); 797 memcpy (ByteOffset + FieldOffset, &Data_U16, FieldSize); 798 break; 799 case EFI_IFR_TYPE_NUM_SIZE_32: 800 Data_U32 = _STOU32(RD->getText(), RD->getLine()); 801 memcpy (ByteOffset + FieldOffset, &Data_U32, FieldSize); 802 break; 803 case EFI_IFR_TYPE_NUM_SIZE_64: 804 Data_U64 = _STOU64(RD->getText(), RD->getLine()); 805 memcpy (ByteOffset + FieldOffset, &Data_U64, FieldSize); 806 break; 807 case EFI_IFR_TYPE_BOOLEAN: 808 Data_BL = _STOU8(RD->getText(), RD->getLine()); 809 memcpy (ByteOffset + FieldOffset, &Data_BL, FieldSize); 810 break; 811 case EFI_IFR_TYPE_STRING: 812 Data_SID = _STOSID(RD->getText(), RD->getLine()); 813 memcpy (ByteOffset + FieldOffset, &Data_SID, FieldSize); 814 break; 815 default: 816 break; 817 } 818 } 819 if (TFName != NULL) { delete TFName; TFName = NULL; } 820 >> 821 )* 822 ) 823 ; 824 825 826 vfrStatementDefaultStore : 827 << UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >> 828 D:DefaultStore N:StringIdentifier "," 829 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" 830 { 831 "," Attribute "=" A:Number << DefaultId = _STOU16(A->getText(), A->getLine()); >> 832 } 833 << 834 if (mCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) { 835 CIfrDefaultStore DSObj; 836 _PCATCH(mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText(), S->getLine()), DefaultId)), D->getLine(); 837 DSObj.SetLineNo(D->getLine()); 838 DSObj.SetDefaultName (_STOSID(S->getText(), S->getLine())); 839 DSObj.SetDefaultId (DefaultId); 840 } else { 841 _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText(), S->getLine()))), D->getLine(); 842 } 843 >> 844 ";" 845 ; 846 847 vfrStatementVarStoreLinear : 848 << 849 EFI_GUID Guid; 850 CIfrVarStore VSObj; 851 CHAR8 *TypeName; 852 CHAR8 *StoreName; 853 UINT32 LineNum; 854 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID; 855 UINT32 Size; 856 >> 857 V:Varstore << VSObj.SetLineNo(V->getLine()); >> 858 ( 859 TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >> 860 | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >> 861 | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >> 862 | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >> 863 | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >> 864 | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >> 865 | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >> 866 | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >> 867 | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >> 868 ) 869 { Key "=" FID:Number "," << // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR 870 if (mCompatibleMode) { 871 VarStoreId = _STOU16(FID->getText(), FID->getLine()); 872 } 873 >> 874 } 875 { 876 VarId "=" ID:Number "," << 877 _PCATCH( 878 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0, 879 (INTN)TRUE, 880 ID, 881 "varid 0 is not allowed." 882 ); 883 >> 884 } 885 Name "=" SN:StringIdentifier "," 886 Uuid "=" guidDefinition[Guid] 887 << 888 if (mCompatibleMode) { 889 StoreName = TypeName; 890 } else { 891 StoreName = SN->getText(); 892 } 893 _PCATCH(mCVfrDataStorage.DeclareBufferVarStore ( 894 StoreName, 895 &Guid, 896 &gCVfrVarDataTypeDB, 897 TypeName, 898 VarStoreId 899 ), LineNum); 900 VSObj.SetGuid (&Guid); 901 _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN); 902 VSObj.SetVarStoreId (VarStoreId); 903 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum); 904 VSObj.SetSize ((UINT16) Size); 905 VSObj.SetName (SN->getText()); 906 >> 907 ";" 908 ; 909 910 vfrStatementVarStoreEfi : 911 << 912 BOOLEAN IsUEFI23EfiVarstore = TRUE; 913 EFI_GUID Guid; 914 CIfrVarStoreEfi VSEObj; 915 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID; 916 UINT32 Attr = 0; 917 UINT32 Size; 918 CHAR8 *TypeName; 919 UINT32 LineNum; 920 CHAR8 *StoreName = NULL; 921 BOOLEAN CustomizedName = FALSE; 922 >> 923 E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >> 924 ( 925 TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); CustomizedName = TRUE; >> 926 | U8:"UINT8" "," << TypeName = U8->getText(); LineNum = U8->getLine(); >> 927 | U16:"UINT16" "," << TypeName = U16->getText(); LineNum = U16->getLine(); >> 928 | C16:"CHAR16" "," << TypeName = (CHAR8 *) "UINT16"; LineNum = C16->getLine(); >> 929 | U32:"UINT32" "," << TypeName = U32->getText(); LineNum = U32->getLine(); >> 930 | U64:"UINT64" "," << TypeName = U64->getText(); LineNum = U64->getLine(); >> 931 | D:"EFI_HII_DATE" "," << TypeName = D->getText(); LineNum = D->getLine(); >> 932 | T:"EFI_HII_TIME" "," << TypeName = T->getText(); LineNum = T->getLine(); >> 933 | R:"EFI_HII_REF" "," << TypeName = R->getText(); LineNum = R->getLine(); >> 934 ) 935 { 936 VarId "=" ID:Number "," << 937 _PCATCH( 938 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0, 939 (INTN)TRUE, 940 ID, 941 "varid 0 is not allowed." 942 ); 943 >> 944 } 945 Attribute "=" vfrVarStoreEfiAttr[Attr] ( "\|" vfrVarStoreEfiAttr[Attr] )* "," 946 << VSEObj.SetAttributes (Attr); >> 947 948 ( 949 Name "=" SN:StringIdentifier "," << StoreName = SN->getText(); >> 950 | 951 Name "=" "STRING_TOKEN" "\(" VN:Number "\)" "," 952 VarSize "=" N:Number "," << 953 IsUEFI23EfiVarstore = FALSE; 954 StoreName = gCVfrStringDB.GetVarStoreNameFormStringId(_STOSID(VN->getText(), VN->getLine())); 955 if (StoreName == NULL) { 956 _PCATCH (VFR_RETURN_UNSUPPORTED, VN->getLine(), "Can't get varstore name for this StringId!"); 957 } 958 if (!CustomizedName) { 959 _PCATCH (VFR_RETURN_UNSUPPORTED, E->getLine(), "Old style efivarstore must have String Identifier!"); 960 return; 961 } 962 Size = _STOU32(N->getText(), N->getLine()); 963 switch (Size) { 964 case 1: 965 TypeName = (CHAR8 *) "UINT8"; 966 break; 967 case 2: 968 TypeName = (CHAR8 *) "UINT16"; 969 break; 970 case 4: 971 TypeName = (CHAR8 *) "UINT32"; 972 break; 973 case 8: 974 TypeName = (CHAR8 *) "UINT64"; 975 break; 976 default: 977 _PCATCH (VFR_RETURN_UNSUPPORTED, N); 978 break; 979 } 980 >> 981 ) 982 983 Uuid "=" guidDefinition[Guid] << 984 if (IsUEFI23EfiVarstore) { 985 _PCATCH(mCVfrDataStorage.DeclareBufferVarStore ( 986 StoreName, 987 &Guid, 988 &gCVfrVarDataTypeDB, 989 TypeName, 990 VarStoreId 991 ), LineNum); 992 _PCATCH(mCVfrDataStorage.GetVarStoreId(StoreName, &VarStoreId, &Guid), SN); 993 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum); 994 } else { 995 _PCATCH(mCVfrDataStorage.DeclareBufferVarStore ( 996 TN->getText(), 997 &Guid, 998 &gCVfrVarDataTypeDB, 999 TypeName, 1000 VarStoreId 1001 ), LineNum); 1002 _PCATCH(mCVfrDataStorage.GetVarStoreId(TN->getText(), &VarStoreId, &Guid), VN); 1003 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), N->getLine()); 1004 } 1005 VSEObj.SetGuid (&Guid); 1006 VSEObj.SetVarStoreId (VarStoreId); 1007 1008 VSEObj.SetSize ((UINT16) Size); 1009 VSEObj.SetName (StoreName); 1010 if (IsUEFI23EfiVarstore == FALSE && StoreName != NULL) { 1011 delete StoreName; 1012 } 1013 >> 1014 ";" 1015 ; 1016 1017 vfrVarStoreEfiAttr [UINT32 & Attr] : 1018 N:Number << $Attr |= _STOU32(N->getText(), N->getLine()); >> 1019 ; 1020 1021 vfrStatementVarStoreNameValue : 1022 << 1023 EFI_GUID Guid; 1024 CIfrVarStoreNameValue VSNVObj; 1025 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID; 1026 BOOLEAN Created = FALSE; 1027 >> 1028 L:NameValueVarStore << VSNVObj.SetLineNo(L->getLine()); >> 1029 SN:StringIdentifier "," 1030 { 1031 VarId "=" ID:Number "," << 1032 _PCATCH( 1033 (INTN)(VarStoreId = _STOU16(ID->getText(), ID->getLine())) != 0, 1034 (INTN)TRUE, 1035 ID, 1036 "varid 0 is not allowed." 1037 ); 1038 >> 1039 } 1040 ( 1041 Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," << 1042 if (!Created) { 1043 _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText(), VarStoreId), SN); 1044 Created = TRUE; 1045 } 1046 _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText(), N->getLine())), SN); 1047 >> 1048 )+ 1049 Uuid "=" guidDefinition[Guid] << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >> 1050 << 1051 VSNVObj.SetGuid (&Guid); 1052 _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId, &Guid), SN); 1053 VSNVObj.SetVarStoreId (VarStoreId); 1054 >> 1055 ";" 1056 ; 1057 1058 // 1059 // keep classDeinition and validClassNames for compatibility but not generate 1060 // any IFR object 1061 // 1062 classDefinition[UINT16 & Class] : 1063 << $Class = 0; >> 1064 validClassNames[$Class] ( "\|" validClassNames[$Class] )* 1065 ; 1066 1067 validClassNames[UINT16 & Class] : 1068 ClassNonDevice << $Class |= EFI_NON_DEVICE_CLASS; >> 1069 | ClassDiskDevice << $Class |= EFI_DISK_DEVICE_CLASS; >> 1070 | ClassVideoDevice << $Class |= EFI_VIDEO_DEVICE_CLASS; >> 1071 | ClassNetworkDevice << $Class |= EFI_NETWORK_DEVICE_CLASS; >> 1072 | ClassInputDevice << $Class |= EFI_INPUT_DEVICE_CLASS; >> 1073 | ClassOnBoardDevice << $Class |= EFI_ON_BOARD_DEVICE_CLASS; >> 1074 | ClassOtherDevice << $Class |= EFI_OTHER_DEVICE_CLASS; >> 1075 | N:Number << $Class |= _STOU16(N->getText(), N->getLine()); >> 1076 ; 1077 1078 subclassDefinition[UINT16 & SubClass] : 1079 << $SubClass = 0; >> 1080 SubclassSetupApplication << $SubClass |= EFI_SETUP_APPLICATION_SUBCLASS; >> 1081 | SubclassGeneralApplication << $SubClass |= EFI_GENERAL_APPLICATION_SUBCLASS; >> 1082 | SubclassFrontPage << $SubClass |= EFI_FRONT_PAGE_SUBCLASS; >> 1083 | SubclassSingleUse << $SubClass |= EFI_SINGLE_USE_SUBCLASS; >> 1084 | N:Number << $SubClass |= _STOU16(N->getText(), N->getLine()); >> 1085 ; 1086 1087 vfrStatementDisableIfFormSet : 1088 << 1089 CIfrDisableIf DIObj; 1090 mConstantOnlyInExpression = TRUE; 1091 >> 1092 D:DisableIf << DIObj.SetLineNo(D->getLine()); >> 1093 vfrStatementExpression[0] ";" << mConstantOnlyInExpression = FALSE; >> 1094 vfrFormSetList 1095 E:EndIf << CRT_END_OP (E); >> 1096 ";" 1097 ; 1098 1099 vfrStatementSuppressIfFormSet : 1100 << CIfrSuppressIf SIObj;>> 1101 L:SuppressIf << 1102 if (mCompatibleMode) { 1103 _PCATCH (VFR_RETURN_UNSUPPORTED, L); 1104 } 1105 SIObj.SetLineNo(L->getLine()); 1106 >> 1107 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 1108 vfrStatementExpression[0] ";" 1109 vfrFormSetList 1110 E: EndIf 1111 ";" << CRT_END_OP (E); >> 1112 ; 1113 1114 //***************************************************************************** 1115 // 1116 // the syntax of question header and statement header 1117 // 1118 vfrStatementHeader[CIfrStatementHeader *SHObj] : 1119 Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText(), S1->getLine())); >> 1120 Help "=" "STRING_TOKEN" "\(" S2:Number "\)" << $SHObj->SetHelp (_STOSID(S2->getText(), S2->getLine())); >> 1121 ; 1122 1123 vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]: 1124 << 1125 EFI_VARSTORE_INFO Info; 1126 Info.mVarType = EFI_IFR_TYPE_OTHER; 1127 Info.mVarTotalSize = 0; 1128 Info.mInfo.mVarOffset = EFI_VAROFFSET_INVALID; 1129 Info.mVarStoreId = EFI_VARSTORE_ID_INVALID; 1130 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; 1131 CHAR8 *QName = NULL; 1132 CHAR8 *VarIdStr = NULL; 1133 mUsedDefaultCount = 0; 1134 >> 1135 { 1136 Name "=" QN:StringIdentifier "," << 1137 QName = QN->getText(); 1138 _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name"); 1139 >> 1140 } 1141 { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," } 1142 { 1143 QuestionId "=" ID:Number "," << 1144 QId = _STOQID(ID->getText(), ID->getLine()); 1145 _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number"); 1146 >> 1147 } 1148 << 1149 switch (QType) { 1150 case QUESTION_NORMAL: 1151 mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId); 1152 break; 1153 case QUESTION_DATE: 1154 mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId); 1155 break; 1156 case QUESTION_TIME: 1157 mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId); 1158 break; 1159 case QUESTION_REF: 1160 // 1161 // VarIdStr != NULL stand for question with storagae. 1162 // 1163 if (VarIdStr != NULL) { 1164 mCVfrQuestionDB.RegisterRefQuestion (QName, VarIdStr, QId); 1165 } else { 1166 mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId); 1167 } 1168 break; 1169 default: 1170 _PCATCH(VFR_RETURN_FATAL_ERROR); 1171 } 1172 $QHObj.SetQuestionId (QId); 1173 if (VarIdStr != NULL) { 1174 $QHObj.SetVarStoreInfo (&Info); 1175 } 1176 >> 1177 vfrStatementHeader[&$QHObj] 1178 << 1179 if (VarIdStr != NULL) { 1180 delete VarIdStr; 1181 } 1182 _SAVE_CURRQEST_VARINFO (Info); 1183 >> 1184 ; 1185 1186 questionheaderFlagsField[UINT8 & Flags] : 1187 ReadOnlyFlag << $Flags |= 0x01; >> 1188 | InteractiveFlag << $Flags |= 0x04; >> 1189 | ResetRequiredFlag << $Flags |= 0x10; >> 1190 | ReconnectRequiredFlag << $Flags |= 0x40; >> 1191 | O:OptionOnlyFlag << 1192 if (mCompatibleMode) { 1193 $Flags |= 0x80; 1194 } else { 1195 gCVfrErrorHandle.HandleWarning ( 1196 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, 1197 O->getLine(), 1198 O->getText() 1199 ); 1200 } 1201 >> 1202 | N:NVAccessFlag << 1203 if (!mCompatibleMode) { 1204 gCVfrErrorHandle.HandleWarning ( 1205 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, 1206 N->getLine(), 1207 N->getText() 1208 ); 1209 } 1210 >> 1211 | L:LateCheckFlag << 1212 if (!mCompatibleMode) { 1213 gCVfrErrorHandle.HandleWarning ( 1214 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, 1215 L->getLine(), 1216 L->getText() 1217 ); 1218 } 1219 >> 1220 ; 1221 1222 vfrStorageVarId[EFI_VARSTORE_INFO & Info, CHAR8 *&QuestVarIdStr, BOOLEAN CheckFlag = TRUE] : 1223 << 1224 UINT32 Idx; 1225 UINT32 LineNo; 1226 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID; 1227 CHAR8 *VarIdStr = NULL; 1228 CHAR8 *VarStr = NULL; 1229 CHAR8 *SName = NULL; 1230 CHAR8 *TName = NULL; 1231 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS; 1232 EFI_IFR_TYPE_VALUE Dummy = gZeroEfiIfrTypeValue; 1233 EFI_GUID *VarGuid = NULL; 1234 >> 1235 ( 1236 SN1:StringIdentifier << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >> 1237 OpenBracket I1:Number CloseBracket << 1238 Idx = _STOU32(I1->getText(), I1->getLine()); 1239 _STRCAT(&VarIdStr, "["); 1240 _STRCAT(&VarIdStr, I1->getText()); 1241 _STRCAT(&VarIdStr, "]"); 1242 >> 1243 << 1244 VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId); 1245 if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) { 1246 mCVfrDataStorage.DeclareBufferVarStore ( 1247 SName, 1248 &mFormsetGuid, 1249 &gCVfrVarDataTypeDB, 1250 SName, 1251 EFI_VARSTORE_ID_INVALID, 1252 FALSE 1253 ); 1254 VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid); 1255 } 1256 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) { 1257 _PCATCH(VfrReturnCode, SN1); 1258 _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1); 1259 } 1260 1261 QuestVarIdStr = VarIdStr; 1262 >> 1263 ) 1264 | 1265 ( 1266 SN2:StringIdentifier << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >> 1267 << 1268 VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId); 1269 if (mCompatibleMode && VfrReturnCode == VFR_RETURN_UNDEFINED) { 1270 mCVfrDataStorage.DeclareBufferVarStore ( 1271 SName, 1272 &mFormsetGuid, 1273 &gCVfrVarDataTypeDB, 1274 SName, 1275 EFI_VARSTORE_ID_INVALID, 1276 FALSE 1277 ); 1278 VfrReturnCode = mCVfrDataStorage.GetVarStoreId(SName, &$Info.mVarStoreId, &mFormsetGuid); 1279 } 1280 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) { 1281 _PCATCH(VfrReturnCode, SN2); 1282 VarStoreType = mCVfrDataStorage.GetVarStoreType ($Info.mVarStoreId); 1283 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) { 1284 _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(Info.mVarStoreId, &TName), SN2); 1285 _STRCAT(&VarStr, TName); 1286 } 1287 } 1288 >> 1289 1290 ( 1291 "." << 1292 if (CheckFlag || VfrReturnCode == VFR_RETURN_SUCCESS) { 1293 _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2); 1294 } 1295 _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, "."); 1296 >> 1297 SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >> 1298 { 1299 OpenBracket I2:Number CloseBracket << 1300 Idx = _STOU32(I2->getText(), I2->getLine()); 1301 if (mCompatibleMode) Idx --; 1302 if (Idx > 0) { 1303 // 1304 // Idx == 0, [0] can be ignored. 1305 // Array[0] is same to Array for unify the varid name to cover [0] 1306 // 1307 _STRCAT(&VarIdStr, "["); 1308 _STRCAT(&VarIdStr, I2->getText()); 1309 _STRCAT(&VarIdStr, "]"); 1310 } 1311 _STRCAT(&VarStr, "["); 1312 _STRCAT(&VarStr, I2->getText()); 1313 _STRCAT(&VarStr, "]"); 1314 >> 1315 } 1316 )* << 1317 switch (VarStoreType) { 1318 case EFI_VFR_VARSTORE_EFI: 1319 _PCATCH(mCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2); 1320 break; 1321 case EFI_VFR_VARSTORE_BUFFER: 1322 _PCATCH(gCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine(), VarStr); 1323 VarGuid = mCVfrDataStorage.GetVarStoreGuid($Info.mVarStoreId); 1324 _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Register ( 1325 SName, 1326 VarGuid, 1327 NULL), 1328 SN2->getLine()); 1329 _PCATCH((EFI_VFR_RETURN_CODE)gCVfrBufferConfig.Write ( 1330 'a', 1331 SName, 1332 VarGuid, 1333 NULL, 1334 $Info.mVarType, 1335 $Info.mInfo.mVarOffset, 1336 $Info.mVarTotalSize, 1337 Dummy), 1338 SN2->getLine()); 1339 break; 1340 case EFI_VFR_VARSTORE_NAME: 1341 default: break; 1342 } 1343 1344 QuestVarIdStr = VarIdStr; 1345 if (VarStr != NULL) {delete VarStr;} 1346 >> 1347 ) 1348 ; 1349 1350 vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr, UINT32 &LineNo] : 1351 << 1352 UINT32 Idx; 1353 VarIdStr = NULL; LineNo = 0; 1354 >> 1355 ( 1356 SN1:StringIdentifier << _STRCAT(&VarIdStr, SN1->getText()); LineNo = SN1->getLine(); >> 1357 OpenBracket I1:Number CloseBracket << 1358 _STRCAT(&VarIdStr, "["); 1359 _STRCAT(&VarIdStr, I1->getText()); 1360 _STRCAT(&VarIdStr, "]"); 1361 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); 1362 if (mConstantOnlyInExpression) { 1363 _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo); 1364 } 1365 >> 1366 ) 1367 | 1368 ( 1369 SN2:StringIdentifier << _STRCAT (&VarIdStr, SN2->getText()); LineNo = SN2->getLine(); >> 1370 ( 1371 "." << 1372 _STRCAT (&VarIdStr, "."); 1373 if (mConstantOnlyInExpression) { 1374 _PCATCH(VFR_RETURN_CONSTANT_ONLY, LineNo); 1375 } 1376 >> 1377 SF:StringIdentifier << _STRCAT (&VarIdStr, SF->getText()); >> 1378 { 1379 OpenBracket I2:Number CloseBracket << 1380 Idx = _STOU32(I2->getText(), I2->getLine()); 1381 if (mCompatibleMode) Idx --; 1382 if (Idx > 0) { 1383 // 1384 // Idx == 0, [0] can be ignored. 1385 // Array[0] is same to Array 1386 // 1387 _STRCAT(&VarIdStr, "["); 1388 _STRCAT(&VarIdStr, I2->getText()); 1389 _STRCAT(&VarIdStr, "]"); 1390 } 1391 >> 1392 } 1393 )* 1394 << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >> 1395 ) 1396 ; 1397 1398 vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] : 1399 << 1400 EFI_GUID Guid; 1401 BOOLEAN Negative = FALSE; 1402 BOOLEAN IntDecStyle = FALSE; 1403 CIfrNumeric *NumericQst = NULL; 1404 if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) { 1405 NumericQst = (CIfrNumeric *) gCurrentQuestion; 1406 IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE; 1407 } 1408 UINT8 *Type8 = (UINT8 *) &Value; 1409 UINT16 *Type16 = (UINT16 *) &Value; 1410 UINT32 *Type32 = (UINT32 *) &Value; 1411 UINT64 *Type64 = (UINT64 *) &Value; 1412 UINT16 Index = 0; 1413 ListType = FALSE; 1414 >> 1415 { 1416 "\-" << Negative = TRUE; >> 1417 } 1418 N1:Number << 1419 switch ($Type) { 1420 case EFI_IFR_TYPE_NUM_SIZE_8 : 1421 $Value.u8 = _STOU8(N1->getText(), N1->getLine()); 1422 if (IntDecStyle) { 1423 if (Negative) { 1424 if ($Value.u8 > 0x80) { 1425 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80"); 1426 } 1427 } else { 1428 if ($Value.u8 > 0x7F) { 1429 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80"); 1430 } 1431 } 1432 } 1433 if (Negative) { 1434 $Value.u8 = ~$Value.u8 + 1; 1435 } 1436 break; 1437 case EFI_IFR_TYPE_NUM_SIZE_16 : 1438 $Value.u16 = _STOU16(N1->getText(), N1->getLine()); 1439 if (IntDecStyle) { 1440 if (Negative) { 1441 if ($Value.u16 > 0x8000) { 1442 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000"); 1443 } 1444 } else { 1445 if ($Value.u16 > 0x7FFF) { 1446 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000"); 1447 } 1448 } 1449 } 1450 if (Negative) { 1451 $Value.u16 = ~$Value.u16 + 1; 1452 } 1453 break; 1454 case EFI_IFR_TYPE_NUM_SIZE_32 : 1455 $Value.u32 = _STOU32(N1->getText(), N1->getLine()); 1456 if (IntDecStyle) { 1457 if (Negative) { 1458 if ($Value.u32 > 0x80000000) { 1459 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000"); 1460 } 1461 } else { 1462 if ($Value.u32 > 0X7FFFFFFF) { 1463 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000"); 1464 } 1465 } 1466 } 1467 if (Negative) { 1468 $Value.u32 = ~$Value.u32 + 1; 1469 } 1470 break; 1471 case EFI_IFR_TYPE_NUM_SIZE_64 : 1472 $Value.u64 = _STOU64(N1->getText(), N1->getLine()); 1473 if (IntDecStyle) { 1474 if (Negative) { 1475 if ($Value.u64 > 0x8000000000000000) { 1476 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000"); 1477 } 1478 } else { 1479 if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) { 1480 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000"); 1481 } 1482 } 1483 } 1484 if (Negative) { 1485 $Value.u64 = ~$Value.u64 + 1; 1486 } 1487 break; 1488 case EFI_IFR_TYPE_BOOLEAN : 1489 $Value.b = _STOU8(N1->getText(), N1->getLine()); 1490 break; 1491 case EFI_IFR_TYPE_STRING : 1492 $Value.string = _STOU16(N1->getText(), N1->getLine()); 1493 break; 1494 case EFI_IFR_TYPE_TIME : 1495 case EFI_IFR_TYPE_DATE : 1496 case EFI_IFR_TYPE_REF : 1497 default : 1498 break; 1499 } 1500 >> 1501 | B1:True << $Value.b = TRUE; >> 1502 | B2:False << $Value.b = FALSE; >> 1503 | O1:One << $Value.u8 = _STOU8(O1->getText(), O1->getLine()); >> 1504 | O2:Ones << $Value.u64 = _STOU64(O2->getText(), O2->getLine()); >> 1505 | Z:Zero << $Value.u8 = _STOU8(Z->getText(), Z->getLine()); >> 1506 | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(),SECOND->getText(), HOUR->getLine()); >> 1507 | YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText(), YEAR->getLine()); >> 1508 | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" 1509 << $Value.ref = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >> 1510 | "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText(), S1->getLine()); >> 1511 | "\{" << ListType = TRUE; >> 1512 L1:Number << 1513 switch (Type) { 1514 case EFI_IFR_TYPE_NUM_SIZE_8 : 1515 Type8[Index] = _STOU8(L1->getText(), L1->getLine()); 1516 break; 1517 case EFI_IFR_TYPE_NUM_SIZE_16 : 1518 Type16[Index] = _STOU16(L1->getText(), L1->getLine()); 1519 break; 1520 case EFI_IFR_TYPE_NUM_SIZE_32 : 1521 Type32[Index] = _STOU32(L1->getText(), L1->getLine()); 1522 break; 1523 case EFI_IFR_TYPE_NUM_SIZE_64 : 1524 Type64[Index] = _STOU64(L1->getText(), L1->getLine()); 1525 break; 1526 default: 1527 break; 1528 } 1529 Index++; 1530 >> 1531 ( 1532 "," 1533 L2:Number << 1534 switch (Type) { 1535 case EFI_IFR_TYPE_NUM_SIZE_8 : 1536 Type8[Index] = _STOU8(L2->getText(), L2->getLine()); 1537 break; 1538 case EFI_IFR_TYPE_NUM_SIZE_16 : 1539 Type16[Index] = _STOU16(L2->getText(), L2->getLine()); 1540 break; 1541 case EFI_IFR_TYPE_NUM_SIZE_32 : 1542 Type32[Index] = _STOU32(L2->getText(), L2->getLine()); 1543 break; 1544 case EFI_IFR_TYPE_NUM_SIZE_64 : 1545 Type64[Index] = _STOU64(L2->getText(), L2->getLine()); 1546 break; 1547 default: 1548 break; 1549 } 1550 Index++; 1551 >> 1552 )* 1553 "\}" 1554 ; 1555 1556 //***************************************************************************** 1557 // 1558 // the syntax of form definition 1559 // 1560 vfrFormDefinition : 1561 << CIfrForm FObj; >> 1562 F:Form << FObj.SetLineNo(F->getLine()); >> 1563 FormId "=" S1:Number "," << _PCATCH(FObj.SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >> 1564 Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";" << FObj.SetFormTitle (_STOSID(S2->getText(), S2->getLine())); >> 1565 ( 1566 vfrStatementImage | 1567 vfrStatementLocked | 1568 vfrStatementRules | 1569 vfrStatementDefault | 1570 vfrStatementStat | 1571 vfrStatementQuestions | 1572 vfrStatementConditional | 1573 vfrStatementLabel | 1574 vfrStatementBanner | 1575 // Just for framework vfr compatibility 1576 vfrStatementInvalid | 1577 vfrStatementExtension | 1578 vfrStatementModal | 1579 vfrStatementRefreshEvent ";" 1580 )* 1581 E:EndForm << 1582 if (mCompatibleMode) { 1583 // 1584 // Add Label for Framework Vfr 1585 // 1586 CIfrLabel LObj1; 1587 LObj1.SetLineNo(E->getLine()); 1588 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff 1589 CIfrLabel LObj2; 1590 LObj2.SetLineNo(E->getLine()); 1591 LObj2.SetNumber (0x0); //add dummy label for UEFI, label number hardcode 0x0 1592 CIfrLabel LObj3; 1593 LObj3.SetLineNo(E->getLine()); 1594 LObj3.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff 1595 } 1596 1597 {CIfrEnd EObj; EObj.SetLineNo (E->getLine()); mLastFormEndAddr = EObj.GetObjBinAddr (); gAdjustOpcodeOffset = EObj.GetObjBinOffset ();} 1598 >> 1599 ";" 1600 ; 1601 1602 vfrFormMapDefinition : 1603 << 1604 CIfrFormMap *FMapObj = NULL; 1605 UINT32 FormMapMethodNumber = 0; 1606 EFI_GUID Guid; 1607 >> 1608 F:FormMap << FMapObj = new CIfrFormMap(); FMapObj->SetLineNo(F->getLine()); >> 1609 FormId "=" S1:Number "," << _PCATCH(FMapObj->SetFormId (_STOFID(S1->getText(), S1->getLine())), S1); >> 1610 ( 1611 MapTitle "=" "STRING_TOKEN" "\(" S2:Number "\)" ";" 1612 MapGuid "=" guidDefinition[Guid] ";" << FMapObj->SetFormMapMethod (_STOFID(S2->getText(), S2->getLine()), &Guid); FormMapMethodNumber ++; >> 1613 )* << if (FormMapMethodNumber == 0) {_PCATCH (VFR_RETURN_INVALID_PARAMETER, F->getLine(), "No MapMethod is set for FormMap!");} delete FMapObj;>> 1614 ( 1615 vfrStatementImage | 1616 vfrStatementLocked | 1617 vfrStatementRules | 1618 vfrStatementDefault | 1619 vfrStatementStat | 1620 vfrStatementQuestions | 1621 vfrStatementConditional | 1622 vfrStatementLabel | 1623 vfrStatementBanner | 1624 vfrStatementExtension | 1625 vfrStatementModal | 1626 vfrStatementRefreshEvent ";" 1627 )* 1628 E:EndForm << CRT_END_OP (E); >> 1629 ";" 1630 ; 1631 1632 vfrStatementRules : 1633 << CIfrRule RObj; >> 1634 R:Rule << RObj.SetLineNo(R->getLine()); >> 1635 S1:StringIdentifier "," << 1636 mCVfrRulesDB.RegisterRule (S1->getText()); 1637 RObj.SetRuleId (mCVfrRulesDB.GetRuleId(S1->getText())); 1638 >> 1639 vfrStatementExpression[0] 1640 E:EndRule << CRT_END_OP (E); >> 1641 ";" 1642 ; 1643 1644 vfrStatementDefault : 1645 << 1646 BOOLEAN IsExp = FALSE; 1647 UINT64 ValueList[EFI_IFR_MAX_LENGTH] = {0,}; 1648 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList; 1649 CIfrDefault *DObj = NULL; 1650 CIfrDefault2 *DObj2 = NULL; 1651 EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; 1652 CHAR8 *VarStoreName = NULL; 1653 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID; 1654 UINT32 Size = 0; 1655 EFI_GUID *VarGuid = NULL; 1656 BOOLEAN ArrayType = FALSE; 1657 UINT8 *Type8 = (UINT8 *) ValueList; 1658 UINT16 *Type16 = (UINT16 *) ValueList; 1659 UINT32 *Type32 = (UINT32 *) ValueList; 1660 UINT64 *Type64 = (UINT64 *) ValueList; 1661 CIfrNumeric *NumericQst = NULL; 1662 1663 >> 1664 D:Default 1665 ( 1666 ( 1667 "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," 1668 << 1669 if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) { 1670 //check default value is valid for Numeric Opcode 1671 NumericQst = (CIfrNumeric *) gCurrentQuestion; 1672 if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0) { 1673 switch (_GET_CURRQEST_DATATYPE()) { 1674 case EFI_IFR_TYPE_NUM_SIZE_8: 1675 if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || 1676 ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) { 1677 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue."); 1678 } 1679 break; 1680 case EFI_IFR_TYPE_NUM_SIZE_16: 1681 if (((INT16) Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || 1682 ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) { 1683 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue."); 1684 } 1685 break; 1686 case EFI_IFR_TYPE_NUM_SIZE_32: 1687 if (((INT32) Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || 1688 ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) { 1689 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue."); 1690 } 1691 break; 1692 case EFI_IFR_TYPE_NUM_SIZE_64: 1693 if (((INT64) Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || 1694 ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) { 1695 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue."); 1696 } 1697 break; 1698 default: 1699 break; 1700 } 1701 } else { 1702 if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) { 1703 _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue."); 1704 } 1705 } 1706 } 1707 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) { 1708 _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error."); 1709 Size = sizeof (EFI_IFR_TYPE_VALUE); 1710 } else if (ArrayType) { 1711 switch (_GET_CURRQEST_DATATYPE()) { 1712 case EFI_IFR_TYPE_NUM_SIZE_8 : 1713 while (Type8[Size] != 0) { 1714 Size++; 1715 } 1716 break; 1717 case EFI_IFR_TYPE_NUM_SIZE_16 : 1718 while (Type16[Size] != 0) { 1719 Size++; 1720 } 1721 Size *= sizeof (UINT16); 1722 break; 1723 1724 case EFI_IFR_TYPE_NUM_SIZE_32 : 1725 while (Type32[Size] != 0) { 1726 Size++; 1727 } 1728 Size *= sizeof (UINT32); 1729 break; 1730 1731 case EFI_IFR_TYPE_NUM_SIZE_64 : 1732 while (Type64[Size] != 0) { 1733 Size++; 1734 } 1735 Size *= sizeof (UINT64); 1736 break; 1737 1738 default: 1739 break; 1740 } 1741 } else { 1742 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine()); 1743 } 1744 Size += OFFSET_OF (EFI_IFR_DEFAULT, Value); 1745 DObj = new CIfrDefault ((UINT8)Size); 1746 DObj->SetLineNo(D->getLine()); 1747 if (ArrayType) { 1748 DObj->SetType (EFI_IFR_TYPE_BUFFER); 1749 } else if (gIsStringOp) { 1750 DObj->SetType (EFI_IFR_TYPE_STRING); 1751 } else { 1752 DObj->SetType (_GET_CURRQEST_DATATYPE()); 1753 } 1754 DObj->SetValue(*Val); 1755 >> 1756 | << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >> 1757 vfrStatementValue "," << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >> 1758 ) 1759 { 1760 DefaultStore "=" SN:StringIdentifier "," << 1761 _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); 1762 if (DObj != NULL) { 1763 DObj->SetDefaultId (DefaultId); 1764 } 1765 1766 if (DObj2 != NULL) { 1767 DObj2->SetDefaultId (DefaultId); 1768 } 1769 >> 1770 } 1771 << 1772 CheckDuplicateDefaultValue (DefaultId, D); 1773 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) { 1774 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine()); 1775 VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId); 1776 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId); 1777 if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) { 1778 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd ( 1779 DefaultId, 1780 _GET_CURRQEST_VARTINFO(), 1781 VarStoreName, 1782 VarGuid, 1783 _GET_CURRQEST_DATATYPE (), 1784 *Val), 1785 D->getLine() 1786 ); 1787 } 1788 } 1789 if (DObj != NULL) {delete DObj;} 1790 if (DObj2 != NULL) {delete DObj2;} 1791 >> 1792 ) 1793 ; 1794 1795 vfrStatementStat : 1796 vfrStatementSubTitle | 1797 vfrStatementStaticText | 1798 vfrStatementCrossReference 1799 ; 1800 1801 vfrStatementQuestions : 1802 vfrStatementBooleanType | 1803 vfrStatementDate | 1804 vfrStatementNumericType | 1805 vfrStatementStringType | 1806 vfrStatementOrderedList | 1807 vfrStatementTime 1808 ; 1809 1810 vfrStatementConditional : 1811 vfrStatementDisableIfStat | 1812 vfrStatementSuppressIfStat | //enhance to be compatible for framework endif 1813 vfrStatementGrayOutIfStat | 1814 vfrStatementInconsistentIfStat //to be compatible for framework 1815 ; 1816 1817 vfrStatementConditionalNew : 1818 vfrStatementDisableIfStat | 1819 vfrStatementSuppressIfStatNew | 1820 vfrStatementGrayOutIfStatNew | 1821 vfrStatementInconsistentIfStat //to be compatible for framework 1822 ; 1823 1824 vfrStatementSuppressIfStat : 1825 <<mCompatibleMode>>? vfrStatementSuppressIfStatOld 1826 | vfrStatementSuppressIfStatNew 1827 ; 1828 1829 vfrStatementGrayOutIfStat : 1830 <<mCompatibleMode>>? vfrStatementGrayOutIfStatOld 1831 | vfrStatementGrayOutIfStatNew 1832 ; 1833 1834 vfrStatementInvalid : 1835 ( 1836 vfrStatementInvalidHidden | 1837 vfrStatementInvalidInventory | 1838 vfrStatementInvalidSaveRestoreDefaults 1839 ) 1840 << _CRT_OP (TRUE); >> 1841 ; 1842 1843 flagsField : 1844 Number 1845 | InteractiveFlag 1846 | ManufacturingFlag 1847 | DefaultFlag 1848 | ResetRequiredFlag 1849 | ReconnectRequiredFlag 1850 | N:NVAccessFlag << 1851 if (!mCompatibleMode) { 1852 gCVfrErrorHandle.HandleWarning ( 1853 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, 1854 N->getLine(), 1855 N->getText() 1856 ); 1857 } 1858 >> 1859 | L:LateCheckFlag << 1860 if (!mCompatibleMode) { 1861 gCVfrErrorHandle.HandleWarning ( 1862 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, 1863 L->getLine(), 1864 L->getText() 1865 ); 1866 } 1867 >> 1868 ; 1869 1870 vfrStatementValue : 1871 << CIfrValue VObj; >> 1872 V:Value << VObj.SetLineNo(V->getLine()); >> 1873 "=" vfrStatementExpression[0] << {CIfrEnd EndObj; EndObj.SetLineNo(V->getLine());} >> 1874 ; 1875 1876 vfrStatementRead : 1877 << CIfrRead RObj; >> 1878 R:Read << RObj.SetLineNo(R->getLine()); >> 1879 vfrStatementExpression[0] ";" 1880 ; 1881 1882 vfrStatementWrite : 1883 << CIfrWrite WObj; >> 1884 W:Write << WObj.SetLineNo(W->getLine()); >> 1885 vfrStatementExpression[0] ";" 1886 ; 1887 1888 vfrStatementSubTitle : 1889 << CIfrSubtitle SObj; >> 1890 L:Subtitle << SObj.SetLineNo(L->getLine()); >> 1891 Text "=" "STRING_TOKEN" "\(" S:Number "\)" << SObj.SetPrompt (_STOSID(S->getText(), S->getLine())); >> 1892 { 1893 "," FLAGS "=" vfrSubtitleFlags[SObj] 1894 } 1895 ( 1896 {vfrStatementStatTagList "," } 1897 E:";" << CRT_END_OP (E); >> 1898 | 1899 { "," vfrStatementStatTagList} 1900 { "," (vfrStatementStat | vfrStatementQuestions)*} 1901 D: EndSubtitle ";" << CRT_END_OP (D); >> 1902 ) 1903 ; 1904 1905 vfrSubtitleFlags [CIfrSubtitle & SObj] : 1906 << UINT8 LFlags = 0; >> 1907 subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )* 1908 << _PCATCH(SObj.SetFlags (LFlags)); >> 1909 ; 1910 1911 subtitleFlagsField [UINT8 & Flags] : 1912 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >> 1913 | "HORIZONTAL" << $Flags |= 0x01; >> 1914 ; 1915 1916 vfrStatementStaticText : 1917 << 1918 UINT8 Flags = 0; 1919 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; 1920 EFI_STRING_ID TxtTwo = EFI_STRING_ID_INVALID; 1921 >> 1922 T:Text 1923 Help "=" "STRING_TOKEN" "\(" S1:Number "\)" "," 1924 Text "=" "STRING_TOKEN" "\(" S2:Number "\)" 1925 { 1926 "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)" << TxtTwo = _STOSID(S3->getText(), S3->getLine()); >> 1927 } 1928 { 1929 "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )* 1930 "," Key "=" KN:Number 1931 } 1932 << 1933 if (Flags & EFI_IFR_FLAG_CALLBACK) { 1934 if (TxtTwo != EFI_STRING_ID_INVALID) { 1935 gCVfrErrorHandle.HandleWarning ( 1936 VFR_WARNING_ACTION_WITH_TEXT_TWO, 1937 S3->getLine(), 1938 S3->getText() 1939 ); 1940 } 1941 CIfrAction AObj; 1942 mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId); 1943 AObj.SetLineNo (F->getLine()); 1944 AObj.SetQuestionId (QId); 1945 AObj.SetPrompt (_STOSID(S2->getText(), S2->getLine())); 1946 AObj.SetHelp (_STOSID(S1->getText(), S1->getLine())); 1947 _PCATCH(AObj.SetFlags (Flags), F->getLine()); 1948 AssignQuestionKey (AObj, KN); 1949 CRT_END_OP (KN); 1950 } else { 1951 CIfrText TObj; 1952 TObj.SetLineNo (T->getLine()); 1953 TObj.SetHelp (_STOSID(S1->getText(), S1->getLine())); 1954 TObj.SetPrompt (_STOSID(S2->getText(), S2->getLine())); 1955 TObj.SetTextTwo (TxtTwo); 1956 } 1957 >> 1958 { "," vfrStatementStatTagList } 1959 ";" 1960 ; 1961 1962 staticTextFlagsField[UINT8 & HFlags] : 1963 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >> 1964 | questionheaderFlagsField[HFlags] 1965 ; 1966 1967 vfrStatementCrossReference : 1968 vfrStatementGoto | 1969 vfrStatementResetButton 1970 ; 1971 1972 vfrStatementGoto : 1973 << 1974 UINT8 RefType = 5; 1975 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID; 1976 EFI_GUID FSId = {0,}; 1977 EFI_FORM_ID FId; 1978 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; 1979 UINT32 BitMask; 1980 CIfrQuestionHeader *QHObj = NULL; 1981 CIfrOpHeader *OHObj = NULL; 1982 CIfrRef *R1Obj = NULL; 1983 CIfrRef2 *R2Obj = NULL; 1984 CIfrRef3 *R3Obj = NULL; 1985 CIfrRef4 *R4Obj = NULL; 1986 CIfrRef5 *R5Obj = NULL; 1987 >> 1988 G:Goto 1989 { 1990 ( 1991 DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" "," 1992 FormSetGuid "=" guidDefinition[FSId] "," 1993 FormId "=" F1:Number "," 1994 Question "=" QN1:Number "," 1995 << 1996 RefType = 4; 1997 DevPath = _STOSID(P->getText(), P->getLine()); 1998 FId = _STOFID(F1->getText(), F1->getLine()); 1999 QId = _STOQID(QN1->getText(), QN1->getLine()); 2000 >> 2001 ) 2002 | 2003 ( 2004 FormSetGuid "=" guidDefinition[FSId] "," 2005 FormId "=" F2:Number "," 2006 Question "=" QN2:Number "," 2007 << 2008 RefType = 3; 2009 FId = _STOFID(F2->getText(), F2->getLine()); 2010 QId = _STOQID(QN2->getText(), QN2->getLine()); 2011 >> 2012 ) 2013 | 2014 ( 2015 FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText(), F3->getLine()); >> 2016 Question "=" 2017 ( 2018 QN3:StringIdentifier "," << 2019 mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask); 2020 if (QId == EFI_QUESTION_ID_INVALID) { 2021 _PCATCH(VFR_RETURN_UNDEFINED, QN3); 2022 } 2023 >> 2024 | QN4:Number "," << QId = _STOQID(QN4->getText(), QN4->getLine()); >> 2025 ) 2026 ) 2027 | 2028 ( 2029 F4:Number "," << 2030 RefType = 1; 2031 FId = _STOFID(F4->getText(), F4->getLine()); 2032 >> 2033 ) 2034 } 2035 << 2036 switch (RefType) { 2037 case 5: 2038 { 2039 R5Obj = new CIfrRef5; 2040 QHObj = R5Obj; 2041 OHObj = R5Obj; 2042 R5Obj->SetLineNo(G->getLine()); 2043 break; 2044 } 2045 case 4: 2046 { 2047 R4Obj = new CIfrRef4; 2048 QHObj = R4Obj; 2049 OHObj = R4Obj; 2050 R4Obj->SetLineNo(G->getLine()); 2051 R4Obj->SetDevicePath (DevPath); 2052 R4Obj->SetFormSetId (FSId); 2053 R4Obj->SetFormId (FId); 2054 R4Obj->SetQuestionId (QId); 2055 break; 2056 } 2057 case 3: 2058 { 2059 R3Obj = new CIfrRef3; 2060 QHObj = R3Obj; 2061 OHObj = R3Obj; 2062 R3Obj->SetLineNo(G->getLine()); 2063 R3Obj->SetFormSetId (FSId); 2064 R3Obj->SetFormId (FId); 2065 R3Obj->SetQuestionId (QId); 2066 break; 2067 } 2068 case 2: 2069 { 2070 R2Obj = new CIfrRef2; 2071 QHObj = R2Obj; 2072 OHObj = R2Obj; 2073 R2Obj->SetLineNo(G->getLine()); 2074 R2Obj->SetFormId (FId); 2075 R2Obj->SetQuestionId (QId); 2076 break; 2077 } 2078 case 1: 2079 { 2080 R1Obj = new CIfrRef; 2081 QHObj = R1Obj; 2082 OHObj = R1Obj; 2083 R1Obj->SetLineNo(G->getLine()); 2084 R1Obj->SetFormId (FId); 2085 break; 2086 } 2087 default: break; 2088 } 2089 >> 2090 vfrQuestionHeader[*QHObj, QUESTION_REF] << 2091 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) { 2092 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_REF; 2093 } 2094 >> 2095 { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] } 2096 { 2097 "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >> 2098 } 2099 { 2100 E:"," 2101 vfrStatementQuestionOptionList << OHObj->SetScope(1); CRT_END_OP (E);>> 2102 } 2103 ";" << 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;}>> 2104 ; 2105 2106 vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] : 2107 << UINT8 HFlags = 0; >> 2108 gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )* 2109 << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >> 2110 ; 2111 2112 gotoFlagsField[UINT8 & HFlags] : 2113 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >> 2114 | questionheaderFlagsField[HFlags] 2115 ; 2116 2117 getStringId : 2118 "STRING_TOKEN" "\(" 2119 IdVal:Number 2120 "\)" 2121 ; 2122 2123 vfrStatementResetButton : 2124 << 2125 CIfrResetButton RBObj; 2126 UINT16 DefaultId; 2127 >> 2128 L:ResetButton << RBObj.SetLineNo(L->getLine()); >> 2129 DefaultStore 2130 "=" N:StringIdentifier "," << 2131 _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine()); 2132 RBObj.SetDefaultId (DefaultId); 2133 >> 2134 vfrStatementHeader[&RBObj] "," 2135 { vfrStatementStatTagList "," } 2136 E:EndResetButton << CRT_END_OP (E); >> 2137 ";" 2138 ; 2139 2140 vfrStatementBooleanType : 2141 vfrStatementCheckBox | 2142 vfrStatementAction 2143 ; 2144 2145 //***************************************************** 2146 // Syntax of checkbox 2147 // 2148 // Example: 2149 // checkbox 2150 // varid = MySTestData.mField1, 2151 // prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT), 2152 // help = STRING_TOKEN(STR_CHECK_BOX_HELP), 2153 // flags = CHECKBOX_DEFAULT | CALLBACK, 2154 // default value = TRUE, defaultstore = MyDefaultStore, 2155 // endcheckbox; 2156 // 2157 vfrStatementCheckBox : 2158 << 2159 CIfrCheckBox CBObj; 2160 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue; 2161 CHAR8 *VarStoreName = NULL; 2162 UINT32 DataTypeSize; 2163 EFI_GUID *VarStoreGuid = NULL; 2164 >> 2165 L:CheckBox << CBObj.SetLineNo(L->getLine()); >> 2166 vfrQuestionHeader[CBObj] "," << //check data type 2167 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) { 2168 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_BOOLEAN; 2169 } 2170 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) { 2171 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "CheckBox varid is not the valid data type"); 2172 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) { 2173 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid doesn't support array"); 2174 } else if ((mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId) == EFI_VFR_VARSTORE_BUFFER) && 2175 (_GET_CURRQEST_VARSIZE() != sizeof (BOOLEAN))) { 2176 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "CheckBox varid only support BOOLEAN data type"); 2177 } 2178 } 2179 >> 2180 { 2181 F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] "," 2182 << 2183 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) { 2184 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), VFR_RETURN_SUCCESS, L, "Failed to retrieve varstore name"); 2185 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId); 2186 Val.b = TRUE; 2187 if (CBObj.GetFlags () & 0x01) { 2188 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F); 2189 _PCATCH( 2190 mCVfrDefaultStore.BufferVarStoreAltConfigAdd ( 2191 EFI_HII_DEFAULT_CLASS_STANDARD, 2192 _GET_CURRQEST_VARTINFO(), 2193 VarStoreName, 2194 VarStoreGuid, 2195 _GET_CURRQEST_DATATYPE (), 2196 Val 2197 ), 2198 VFR_RETURN_SUCCESS, 2199 L, 2200 "No standard default storage found" 2201 ); 2202 } 2203 if (CBObj.GetFlags () & 0x02) { 2204 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F); 2205 _PCATCH( 2206 mCVfrDefaultStore.BufferVarStoreAltConfigAdd ( 2207 EFI_HII_DEFAULT_CLASS_MANUFACTURING, 2208 _GET_CURRQEST_VARTINFO(), 2209 VarStoreName, 2210 VarStoreGuid, 2211 _GET_CURRQEST_DATATYPE (), 2212 Val 2213 ), 2214 VFR_RETURN_SUCCESS, 2215 L, 2216 "No manufacturing default storage found" 2217 ); 2218 } 2219 } 2220 >> 2221 } 2222 { 2223 Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >> 2224 } 2225 vfrStatementQuestionOptionList 2226 E:EndCheckBox << CRT_END_OP (E); >> 2227 ";" 2228 ; 2229 2230 vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] : 2231 << 2232 UINT8 LFlags = 0; 2233 UINT8 HFlags = 0; 2234 >> 2235 checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )* 2236 << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >> 2237 ; 2238 2239 checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] : 2240 N:Number << 2241 if (mCompatibleMode) { 2242 // 2243 // set question flag 2244 // 2245 $LFlags |= _STOU8(N->getText(), N->getLine()); 2246 } else { 2247 _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); 2248 } 2249 >> 2250 | D:"DEFAULT" << 2251 if (mCompatibleMode) { 2252 // 2253 // set question Default flag 2254 // 2255 $LFlags |= 0x01; 2256 } else { 2257 _PCATCH (VFR_RETURN_UNSUPPORTED, D); 2258 } 2259 >> 2260 | M:"MANUFACTURING" << 2261 if (mCompatibleMode) { 2262 // 2263 // set question MFG flag 2264 // 2265 $LFlags |= 0x02; 2266 } else { 2267 _PCATCH (VFR_RETURN_UNSUPPORTED, M); 2268 } 2269 >> 2270 | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >> 2271 | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >> 2272 | questionheaderFlagsField[HFlags] 2273 ; 2274 2275 //***************************************************** 2276 // Syntax of action 2277 // 2278 // Example: 2279 // action 2280 // prompt = STRING_TOKEN(STR_ACTION_PROMPT), 2281 // help = STRING_TOKEN(STR_ACTION_HELP), 2282 // flags = CALLBACK, 2283 // config = STRING_TOKEN(STR_ACTION_CONFIG), 2284 // endaction; 2285 // 2286 vfrStatementAction : 2287 << CIfrAction AObj; >> 2288 L:Action << AObj.SetLineNo(L->getLine()); >> 2289 vfrQuestionHeader[AObj] "," 2290 { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," } 2291 Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText(), S->getLine())); >> 2292 vfrStatementQuestionTagList 2293 E:EndAction << CRT_END_OP (E); >> 2294 ";" 2295 ; 2296 2297 vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] : 2298 << UINT8 HFlags = 0; >> 2299 actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )* 2300 << _PCATCH(AObj.SetFlags (HFlags), LineNum); >> 2301 ; 2302 2303 actionFlagsField[UINT8 & HFlags] : 2304 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >> 2305 | questionheaderFlagsField[HFlags] 2306 ; 2307 2308 vfrStatementDate : 2309 << 2310 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; 2311 CHAR8 *VarIdStr[3] = {NULL, }; 2312 CIfrDate DObj; 2313 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue; 2314 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_DATE); 2315 >> 2316 L:Date << DObj.SetLineNo(L->getLine()); >> 2317 ( 2318 ( 2319 vfrQuestionHeader[DObj, QUESTION_DATE] "," << 2320 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) { 2321 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_DATE; 2322 } 2323 >> 2324 { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," } 2325 vfrStatementQuestionOptionList 2326 ) 2327 | 2328 ( 2329 Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier "," 2330 << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >> 2331 Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" "," 2332 Help "=" "STRING_TOKEN" "\(" YH:Number "\)" "," 2333 minMaxDateStepDefault[Val.date, 0] 2334 2335 Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier "," 2336 << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >> 2337 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" "," 2338 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" "," 2339 minMaxDateStepDefault[Val.date, 1] 2340 2341 Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier "," 2342 << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >> 2343 Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" "," 2344 Help "=" "STRING_TOKEN" "\(" DH:Number "\)" "," 2345 minMaxDateStepDefault[Val.date, 2] 2346 { G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," } 2347 << 2348 mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId); 2349 DObj.SetQuestionId (QId); 2350 DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME); 2351 DObj.SetPrompt (_STOSID(YP->getText(), YP->getLine())); 2352 DObj.SetHelp (_STOSID(YH->getText(), YH->getLine())); 2353 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; } 2354 >> 2355 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val); DefaultObj.SetLineNo(L->getLine());} >> 2356 ) 2357 ( vfrStatementInconsistentIf )* 2358 ) 2359 E:EndDate << CRT_END_OP (E); >> 2360 ";" 2361 ; 2362 2363 minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] : 2364 Minimum "=" MinN:Number "," 2365 Maximum "=" MaxN:Number "," 2366 { "step" "=" Number "," } 2367 { 2368 "default" "=" N:Number "," << 2369 switch (KeyValue) { 2370 case 0: 2371 D.Year = _STOU16(N->getText(), N->getLine()); 2372 if (D.Year < _STOU16 (MinN->getText(), MinN->getLine()) || D.Year > _STOU16 (MaxN->getText(), MaxN->getLine())) { 2373 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Year default value must be between Min year and Max year."); 2374 } 2375 break; 2376 case 1: 2377 D.Month = _STOU8(N->getText(), N->getLine()); 2378 if (D.Month < 1 || D.Month > 12) { 2379 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Month default value must be between 1 and 12."); 2380 } 2381 break; 2382 case 2: 2383 D.Day = _STOU8(N->getText(), N->getLine()); 2384 if (D.Day < 1 || D.Day > 31) { 2385 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Day default value must be between 1 and 31."); 2386 } 2387 break; 2388 } 2389 >> 2390 } 2391 ; 2392 2393 vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] : 2394 << UINT8 LFlags = 0; >> 2395 dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )* 2396 << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >> 2397 ; 2398 2399 dateFlagsField [UINT8 & Flags] : 2400 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >> 2401 | "YEAR_SUPPRESS" << $Flags |= 0x01; >> 2402 | "MONTH_SUPPRESS" << $Flags |= 0x02; >> 2403 | "DAY_SUPPRESS" << $Flags |= 0x04; >> 2404 | "STORAGE_NORMAL" << $Flags |= 0x00; >> 2405 | "STORAGE_TIME" << $Flags |= 0x10; >> 2406 | "STORAGE_WAKEUP" << $Flags |= 0x20; >> 2407 ; 2408 2409 vfrStatementNumericType : 2410 vfrStatementNumeric | 2411 vfrStatementOneOf 2412 ; 2413 2414 vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] : 2415 << 2416 UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0; 2417 UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0; 2418 UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0; 2419 UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0; 2420 BOOLEAN IntDecStyle = FALSE; 2421 CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj); 2422 if ((NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0)) { 2423 IntDecStyle = TRUE; 2424 } 2425 BOOLEAN MinNegative = FALSE; 2426 BOOLEAN MaxNegative = FALSE; 2427 >> 2428 Minimum "=" 2429 { 2430 "\-" << MinNegative = TRUE; >> 2431 } 2432 I:Number "," << 2433 if (!IntDecStyle && MinNegative) { 2434 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. "); 2435 } 2436 switch (_GET_CURRQEST_DATATYPE()) { 2437 case EFI_IFR_TYPE_NUM_SIZE_64 : 2438 MinU8 = _STOU64(I->getText(), I->getLine()); 2439 if (IntDecStyle) { 2440 if (MinNegative) { 2441 if (MinU8 > 0x8000000000000000) { 2442 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); 2443 } 2444 } else { 2445 if (MinU8 > 0x7FFFFFFFFFFFFFFF) { 2446 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); 2447 } 2448 } 2449 } 2450 if (MinNegative) { 2451 MinU8 = ~MinU8 + 1; 2452 } 2453 break; 2454 case EFI_IFR_TYPE_NUM_SIZE_32 : 2455 MinU4 = _STOU32(I->getText(), I->getLine()); 2456 if (IntDecStyle) { 2457 if (MinNegative) { 2458 if (MinU4 > 0x80000000) { 2459 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF"); 2460 } 2461 } else { 2462 if (MinU4 > 0x7FFFFFFF) { 2463 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF"); 2464 } 2465 } 2466 } 2467 if (MinNegative) { 2468 MinU4 = ~MinU4 + 1; 2469 } 2470 break; 2471 case EFI_IFR_TYPE_NUM_SIZE_16 : 2472 MinU2 = _STOU16(I->getText(), I->getLine()); 2473 if (IntDecStyle) { 2474 if (MinNegative) { 2475 if (MinU2 > 0x8000) { 2476 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF"); 2477 } 2478 } else { 2479 if (MinU2 > 0x7FFF) { 2480 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF"); 2481 } 2482 } 2483 } 2484 if (MinNegative) { 2485 MinU2 = ~MinU2 + 1; 2486 } 2487 break; 2488 case EFI_IFR_TYPE_NUM_SIZE_8 : 2489 MinU1 = _STOU8(I->getText(), I->getLine()); 2490 if (IntDecStyle) { 2491 if (MinNegative) { 2492 if (MinU1 > 0x80) { 2493 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F"); 2494 } 2495 } else { 2496 if (MinU1 > 0x7F) { 2497 _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F"); 2498 } 2499 } 2500 } 2501 if (MinNegative) { 2502 MinU1 = ~MinU1 + 1; 2503 } 2504 break; 2505 } 2506 >> 2507 Maximum "=" 2508 { 2509 "\-" << MaxNegative = TRUE; >> 2510 } 2511 A:Number "," << 2512 if (!IntDecStyle && MaxNegative) { 2513 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. "); 2514 } 2515 2516 switch (_GET_CURRQEST_DATATYPE()) { 2517 case EFI_IFR_TYPE_NUM_SIZE_64 : 2518 MaxU8 = _STOU64(A->getText(), A->getLine()); 2519 if (IntDecStyle) { 2520 if (MaxNegative) { 2521 if (MaxU8 > 0x8000000000000000) { 2522 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); 2523 } 2524 } else { 2525 if (MaxU8 > 0x7FFFFFFFFFFFFFFF) { 2526 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF"); 2527 } 2528 } 2529 } 2530 if (MaxNegative) { 2531 MaxU8 = ~MaxU8 + 1; 2532 } 2533 if (IntDecStyle) { 2534 if ((INT64) MaxU8 < (INT64) MinU8) { 2535 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum"); 2536 } 2537 } else { 2538 if (MaxU8 < MinU8) { 2539 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum"); 2540 } 2541 } 2542 break; 2543 case EFI_IFR_TYPE_NUM_SIZE_32 : 2544 MaxU4 = _STOU32(A->getText(), A->getLine()); 2545 if (IntDecStyle) { 2546 if (MaxNegative) { 2547 if (MaxU4 > 0x80000000) { 2548 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF"); 2549 } 2550 } else { 2551 if (MaxU4 > 0x7FFFFFFF) { 2552 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF"); 2553 } 2554 } 2555 } 2556 if (MaxNegative) { 2557 MaxU4 = ~MaxU4 + 1; 2558 } 2559 if (IntDecStyle) { 2560 if ((INT32) MaxU4 < (INT32) MinU4) { 2561 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum"); 2562 } 2563 } else { 2564 if (MaxU4 < MinU4) { 2565 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum"); 2566 } 2567 } 2568 break; 2569 case EFI_IFR_TYPE_NUM_SIZE_16 : 2570 MaxU2 = _STOU16(A->getText(), A->getLine()); 2571 if (IntDecStyle) { 2572 if (MaxNegative) { 2573 if (MaxU2 > 0x8000) { 2574 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF"); 2575 } 2576 } else { 2577 if (MaxU2 > 0x7FFF) { 2578 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF"); 2579 } 2580 } 2581 } 2582 if (MaxNegative) { 2583 MaxU2 = ~MaxU2 + 1; 2584 } 2585 if (IntDecStyle) { 2586 if ((INT16) MaxU2 < (INT16) MinU2) { 2587 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum"); 2588 } 2589 } else { 2590 if (MaxU2 < MinU2) { 2591 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum"); 2592 } 2593 } 2594 break; 2595 case EFI_IFR_TYPE_NUM_SIZE_8 : 2596 MaxU1 = _STOU8(A->getText(), A->getLine()); 2597 if (IntDecStyle) { 2598 if (MaxNegative) { 2599 if (MaxU1 > 0x80) { 2600 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F"); 2601 } 2602 } else { 2603 if (MaxU1 > 0x7F) { 2604 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F"); 2605 } 2606 } 2607 } 2608 if (MaxNegative) { 2609 MaxU1 = ~MaxU1 + 1; 2610 } 2611 if (IntDecStyle) { 2612 if ((INT8) MaxU1 < (INT8) MinU1) { 2613 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum"); 2614 } 2615 } else { 2616 if (MaxU1 < MinU1) { 2617 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum"); 2618 } 2619 } 2620 break; 2621 } 2622 >> 2623 { 2624 STEP "=" S:Number "," 2625 << 2626 switch (_GET_CURRQEST_DATATYPE()) { 2627 case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText(), S->getLine()); break; 2628 case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText(), S->getLine()); break; 2629 case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText(), S->getLine()); break; 2630 case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText(), S->getLine()); break; 2631 } 2632 >> 2633 } 2634 << 2635 switch (_GET_CURRQEST_DATATYPE()) { 2636 case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break; 2637 case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break; 2638 case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break; 2639 case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break; 2640 } 2641 >> 2642 ; 2643 2644 vfrStatementNumeric : 2645 << 2646 CIfrNumeric NObj; 2647 UINT32 DataTypeSize; 2648 BOOLEAN IsSupported = TRUE; 2649 UINT8 ShrinkSize = 0; 2650 >> 2651 L:Numeric << NObj.SetLineNo(L->getLine()); >> 2652 vfrQuestionHeader[NObj] "," << // check data type 2653 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) { 2654 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "Numeric varid is not the valid data type"); 2655 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) { 2656 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric varid doesn't support array"); 2657 } 2658 _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); 2659 } 2660 >> 2661 { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," } 2662 { 2663 Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >> 2664 } 2665 vfrSetMinMaxStep[NObj] << 2666 switch (_GET_CURRQEST_DATATYPE()) { 2667 // 2668 // Base on the type to know the actual used size,shrink the buffer 2669 // size allocate before. 2670 // 2671 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break; 2672 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break; 2673 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break; 2674 case EFI_IFR_TYPE_NUM_SIZE_64:break; 2675 default: 2676 IsSupported = FALSE; 2677 break; 2678 } 2679 NObj.ShrinkBinSize (ShrinkSize); 2680 if (!IsSupported) { 2681 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "Numeric question only support UINT8, UINT16, UINT32 and UINT64 data type."); 2682 } 2683 >> 2684 vfrStatementQuestionOptionList 2685 E:EndNumeric << 2686 CRT_END_OP (E); 2687 >> 2688 ";" 2689 ; 2690 2691 vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] : 2692 << 2693 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE; 2694 UINT8 HFlags = 0; 2695 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID; 2696 BOOLEAN IsSetType = FALSE; 2697 BOOLEAN IsDisplaySpecified = FALSE; 2698 >> 2699 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified ] )* 2700 << 2701 //check data type flag 2702 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) { 2703 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId); 2704 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) { 2705 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) { 2706 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type"); 2707 } 2708 } else { 2709 // update data type for name/value store 2710 UINT32 DataTypeSize; 2711 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE; 2712 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize); 2713 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize; 2714 } 2715 } else if (IsSetType){ 2716 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE; 2717 } 2718 _PCATCH(NObj.SetFlags (HFlags, LFlags, IsDisplaySpecified), LineNum); 2719 >> 2720 ; 2721 2722 numericFlagsField [UINT8 & HFlags, UINT8 & LFlags, BOOLEAN & IsSetType, BOOLEAN & IsDisplaySpecified] : 2723 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >> 2724 | "NUMERIC_SIZE_1" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_1; IsSetType = TRUE;>> 2725 | "NUMERIC_SIZE_2" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_2; IsSetType = TRUE;>> 2726 | "NUMERIC_SIZE_4" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_4; IsSetType = TRUE;>> 2727 | "NUMERIC_SIZE_8" << $LFlags = ($LFlags & ~EFI_IFR_NUMERIC_SIZE) | EFI_IFR_NUMERIC_SIZE_8; IsSetType = TRUE;>> 2728 | "DISPLAY_INT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_INT_DEC; IsDisplaySpecified = TRUE;>> 2729 | "DISPLAY_UINT_DEC" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_DEC; IsDisplaySpecified = TRUE;>> 2730 | "DISPLAY_UINT_HEX" << $LFlags = ($LFlags & ~EFI_IFR_DISPLAY) | EFI_IFR_DISPLAY_UINT_HEX; IsDisplaySpecified = TRUE;>> 2731 | questionheaderFlagsField[HFlags] 2732 ; 2733 2734 vfrStatementOneOf : 2735 << 2736 CIfrOneOf OObj; 2737 UINT32 DataTypeSize; 2738 BOOLEAN IsSupported = TRUE; 2739 UINT8 ShrinkSize = 0; 2740 >> 2741 L:OneOf << OObj.SetLineNo(L->getLine()); >> 2742 vfrQuestionHeader[OObj] "," << //check data type 2743 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) { 2744 _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize), L->getLine(), "OneOf varid is not the valid data type"); 2745 if (DataTypeSize != 0 && DataTypeSize != _GET_CURRQEST_VARSIZE()) { 2746 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf varid doesn't support array"); 2747 } 2748 _PCATCH(OObj.SetFlags (OObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); 2749 } 2750 >> 2751 { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," } 2752 { 2753 vfrSetMinMaxStep[OObj] 2754 } 2755 << 2756 switch (_GET_CURRQEST_DATATYPE()) { 2757 // 2758 // Base on the type to know the actual used size,shrink the buffer 2759 // size allocate before. 2760 // 2761 case EFI_IFR_TYPE_NUM_SIZE_8: ShrinkSize = 21;break; 2762 case EFI_IFR_TYPE_NUM_SIZE_16:ShrinkSize = 18;break; 2763 case EFI_IFR_TYPE_NUM_SIZE_32:ShrinkSize = 12;break; 2764 case EFI_IFR_TYPE_NUM_SIZE_64:break; 2765 default: 2766 IsSupported = FALSE; 2767 break; 2768 } 2769 OObj.ShrinkBinSize (ShrinkSize); 2770 if (!IsSupported) { 2771 _PCATCH (VFR_RETURN_INVALID_PARAMETER, L->getLine(), "OneOf question only support UINT8, UINT16, UINT32 and UINT64 data type."); 2772 } 2773 >> 2774 vfrStatementQuestionOptionList 2775 E:EndOneOf << 2776 CRT_END_OP (E); 2777 >> 2778 ";" 2779 ; 2780 2781 vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] : 2782 << 2783 UINT8 LFlags = _GET_CURRQEST_DATATYPE() & EFI_IFR_NUMERIC_SIZE; 2784 UINT8 HFlags = 0; 2785 EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID; 2786 BOOLEAN IsSetType = FALSE; 2787 BOOLEAN IsDisplaySpecified = FALSE; 2788 >> 2789 numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] ( "\|" numericFlagsField[HFlags, LFlags, IsSetType, IsDisplaySpecified] )* 2790 << 2791 //check data type flag 2792 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) { 2793 VarStoreType = mCVfrDataStorage.GetVarStoreType (_GET_CURRQEST_VARTINFO().mVarStoreId); 2794 if (VarStoreType == EFI_VFR_VARSTORE_BUFFER || VarStoreType == EFI_VFR_VARSTORE_EFI) { 2795 if (_GET_CURRQEST_DATATYPE() != (LFlags & EFI_IFR_NUMERIC_SIZE)) { 2796 _PCATCH(VFR_RETURN_INVALID_PARAMETER, LineNum, "Numeric Flag is not same to Numeric VarData type"); 2797 } 2798 } else { 2799 // update data type for Name/Value store 2800 UINT32 DataTypeSize; 2801 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE; 2802 gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &DataTypeSize); 2803 _GET_CURRQEST_VARTINFO().mVarTotalSize = DataTypeSize; 2804 } 2805 } else if (IsSetType){ 2806 _GET_CURRQEST_VARTINFO().mVarType = LFlags & EFI_IFR_NUMERIC_SIZE; 2807 } 2808 _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum); 2809 >> 2810 ; 2811 2812 vfrStatementStringType : 2813 vfrStatementString | 2814 vfrStatementPassword 2815 ; 2816 2817 vfrStatementString : 2818 << 2819 CIfrString SObj; 2820 UINT32 VarArraySize; 2821 UINT8 StringMinSize; 2822 UINT8 StringMaxSize; 2823 >> 2824 L:String << SObj.SetLineNo(L->getLine()); gIsStringOp = TRUE;>> 2825 vfrQuestionHeader[SObj] "," 2826 { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," } 2827 { 2828 Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >> 2829 } 2830 MinSize "=" MIN:Number "," << 2831 VarArraySize = _GET_CURRQEST_ARRAY_SIZE(); 2832 StringMinSize = _STOU8(MIN->getText(), MIN->getLine()); 2833 if (_STOU64(MIN->getText(), MIN->getLine()) > StringMinSize) { 2834 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize takes only one byte, which can't be larger than 0xFF."); 2835 } else if (VarArraySize != 0 && StringMinSize > VarArraySize) { 2836 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "String MinSize can't be larger than the max number of elements in string array."); 2837 } 2838 SObj.SetMinSize (StringMinSize); 2839 >> 2840 MaxSize "=" MAX:Number "," << 2841 StringMaxSize = _STOU8(MAX->getText(), MAX->getLine()); 2842 if (_STOU64(MAX->getText(), MAX->getLine()) > StringMaxSize) { 2843 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize takes only one byte, which can't be larger than 0xFF."); 2844 } else if (VarArraySize != 0 && StringMaxSize > VarArraySize) { 2845 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be larger than the max number of elements in string array."); 2846 } else if (StringMaxSize < StringMinSize) { 2847 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "String MaxSize can't be less than String MinSize."); 2848 } 2849 SObj.SetMaxSize (StringMaxSize); 2850 >> 2851 vfrStatementQuestionOptionList 2852 E:EndString << CRT_END_OP (E); gIsStringOp = FALSE;>> 2853 ";" 2854 ; 2855 2856 vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] : 2857 << 2858 UINT8 LFlags = 0; 2859 UINT8 HFlags = 0; 2860 >> 2861 stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )* 2862 << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >> 2863 ; 2864 2865 stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] : 2866 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >> 2867 | "MULTI_LINE" << $LFlags = 0x01; >> 2868 | questionheaderFlagsField[HFlags] 2869 ; 2870 2871 vfrStatementPassword : 2872 << 2873 CIfrPassword PObj; 2874 UINT32 VarArraySize; 2875 UINT16 PasswordMinSize; 2876 UINT16 PasswordMaxSize; 2877 >> 2878 L:Password << PObj.SetLineNo(L->getLine()); >> 2879 vfrQuestionHeader[PObj] "," 2880 { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," } 2881 { 2882 Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >> 2883 } 2884 MinSize "=" MIN:Number "," << 2885 VarArraySize = _GET_CURRQEST_ARRAY_SIZE(); 2886 PasswordMinSize = _STOU16(MIN->getText(), MIN->getLine()); 2887 if (_STOU64(MIN->getText(), MIN->getLine()) > PasswordMinSize) { 2888 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize takes only two byte, which can't be larger than 0xFFFF."); 2889 } else if (VarArraySize != 0 && PasswordMinSize > VarArraySize) { 2890 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MIN->getLine(), "Password MinSize can't be larger than the max number of elements in password array."); 2891 } 2892 PObj.SetMinSize (PasswordMinSize); 2893 >> 2894 MaxSize "=" MAX:Number "," << 2895 PasswordMaxSize = _STOU16(MAX->getText(), MAX->getLine()); 2896 if (_STOU64(MAX->getText(), MAX->getLine()) > PasswordMaxSize) { 2897 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize takes only two byte, which can't be larger than 0xFFFF."); 2898 } else if (VarArraySize != 0 && PasswordMaxSize > VarArraySize) { 2899 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be larger than the max number of elements in password array."); 2900 } else if (PasswordMaxSize < PasswordMinSize) { 2901 _PCATCH (VFR_RETURN_INVALID_PARAMETER, MAX->getLine(), "Password MaxSize can't be less than Password MinSize."); 2902 } 2903 PObj.SetMaxSize (PasswordMaxSize); 2904 >> 2905 { Encoding "=" Number "," } 2906 vfrStatementQuestionOptionList 2907 E:EndPassword << CRT_END_OP (E); >> 2908 ";" 2909 ; 2910 2911 vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] : 2912 << UINT8 HFlags = 0; >> 2913 passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )* 2914 << _PCATCH(PObj.SetFlags(HFlags), LineNum); >> 2915 ; 2916 2917 passwordFlagsField [UINT8 & HFlags] : 2918 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >> 2919 | questionheaderFlagsField[HFlags] 2920 ; 2921 2922 vfrStatementOrderedList : 2923 << 2924 CIfrOrderedList OLObj; 2925 UINT32 VarArraySize; 2926 >> 2927 L:OrderedList << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>> 2928 vfrQuestionHeader[OLObj] "," 2929 << 2930 VarArraySize = _GET_CURRQEST_ARRAY_SIZE(); 2931 OLObj.SetMaxContainers ((UINT8) (VarArraySize > 0xFF ? 0xFF : VarArraySize)); 2932 >> 2933 { 2934 MaxContainers "=" M:Number "," << 2935 if (_STOU64(M->getText(), M->getLine()) > _STOU8(M->getText(), M->getLine())) { 2936 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers takes only one byte, which can't be larger than 0xFF."); 2937 } else if (VarArraySize != 0 && _STOU8(M->getText(), M->getLine()) > VarArraySize) { 2938 _PCATCH (VFR_RETURN_INVALID_PARAMETER, M->getLine(), "OrderedList MaxContainers can't be larger than the max number of elements in array."); 2939 } 2940 OLObj.SetMaxContainers (_STOU8(M->getText(), M->getLine())); 2941 >> 2942 } 2943 { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}} 2944 vfrStatementQuestionOptionList 2945 E:EndList << CRT_END_OP (E); gIsOrderedList = FALSE;>> 2946 ";" 2947 ; 2948 2949 vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] : 2950 << 2951 UINT8 HFlags = 0; 2952 UINT8 LFlags = 0; 2953 >> 2954 orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )* 2955 << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >> 2956 ; 2957 2958 orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] : 2959 N:Number << _PCATCH(_STOU8(N->getText(), N->getLine()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >> 2960 | "UNIQUE" << $LFlags |= 0x01; >> 2961 | "NOEMPTY" << $LFlags |= 0x02; >> 2962 | questionheaderFlagsField[HFlags] 2963 ; 2964 2965 vfrStatementTime : 2966 << 2967 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; 2968 CHAR8 *VarIdStr[3] = {NULL, }; 2969 CIfrTime TObj; 2970 EFI_IFR_TYPE_VALUE Val = gZeroEfiIfrTypeValue; 2971 UINT8 Size = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (EFI_HII_TIME); 2972 >> 2973 L:Time << TObj.SetLineNo(L->getLine()); >> 2974 ( 2975 ( 2976 vfrQuestionHeader[TObj, QUESTION_TIME] "," << 2977 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) { 2978 _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_TIME; 2979 } 2980 >> 2981 { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," } 2982 vfrStatementQuestionOptionList 2983 ) 2984 | 2985 ( 2986 Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier "," 2987 << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >> 2988 Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" "," 2989 Help "=" "STRING_TOKEN" "\(" HH:Number "\)" "," 2990 minMaxTimeStepDefault[Val.time, 0] 2991 2992 Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier "," 2993 << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >> 2994 Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" "," 2995 Help "=" "STRING_TOKEN" "\(" MH:Number "\)" "," 2996 minMaxTimeStepDefault[Val.time, 1] 2997 2998 Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier "," 2999 << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >> 3000 Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" "," 3001 Help "=" "STRING_TOKEN" "\(" SH:Number "\)" "," 3002 minMaxTimeStepDefault[Val.time, 2] 3003 { G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," } 3004 << 3005 mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId); 3006 TObj.SetQuestionId (QId); 3007 TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME); 3008 TObj.SetPrompt (_STOSID(HP->getText(), HP->getLine())); 3009 TObj.SetHelp (_STOSID(HH->getText(), HH->getLine())); 3010 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; } 3011 >> 3012 << {CIfrDefault DefaultObj(Size, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val); DefaultObj.SetLineNo(L->getLine());} >> 3013 ) 3014 ( vfrStatementInconsistentIf )* 3015 ) 3016 E:EndTime << CRT_END_OP (E); >> 3017 ";" 3018 ; 3019 3020 minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] : 3021 Minimum "=" Number "," 3022 Maximum "=" Number "," 3023 { "step" "=" Number "," } 3024 { 3025 "default" "=" N:Number "," << 3026 switch (KeyValue) { 3027 case 0: 3028 T.Hour = _STOU8(N->getText(), N->getLine()); 3029 if (T.Hour > 23) { 3030 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Hour default value must be between 0 and 23."); 3031 } 3032 break; 3033 case 1: 3034 T.Minute = _STOU8(N->getText(), N->getLine()); 3035 if (T.Minute > 59) { 3036 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Minute default value must be between 0 and 59."); 3037 } 3038 break; 3039 case 2: 3040 T.Second = _STOU8(N->getText(), N->getLine()); 3041 if (T.Second > 59) { 3042 _PCATCH (VFR_RETURN_INVALID_PARAMETER, N->getLine(), "Second default value must be between 0 and 59."); 3043 } 3044 break; 3045 } 3046 >> 3047 } 3048 ; 3049 3050 vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] : 3051 << UINT8 LFlags = 0; >> 3052 timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )* 3053 << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >> 3054 ; 3055 3056 timeFlagsField [UINT8 & Flags] : 3057 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >> 3058 | "HOUR_SUPPRESS" << $Flags |= 0x01; >> 3059 | "MINUTE_SUPPRESS" << $Flags |= 0x02; >> 3060 | "SECOND_SUPPRESS" << $Flags |= 0x04; >> 3061 | "STORAGE_NORMAL" << $Flags |= 0x00; >> 3062 | "STORAGE_TIME" << $Flags |= 0x10; >> 3063 | "STORAGE_WAKEUP" << $Flags |= 0x20; >> 3064 ; 3065 3066 vfrStatementQuestionTag : 3067 vfrStatementStatTag "," | 3068 vfrStatementInconsistentIf | 3069 vfrStatementNoSubmitIf | 3070 vfrStatementDisableIfQuest | 3071 vfrStatementRefresh | 3072 vfrStatementVarstoreDevice | 3073 vfrStatementExtension | 3074 vfrStatementRefreshEvent "," | 3075 vfrStatementWarningIf 3076 ; 3077 3078 vfrStatementQuestionTagList : 3079 ( vfrStatementQuestionTag )* 3080 ; 3081 3082 vfrStatementQuestionOptionTag : 3083 vfrStatementSuppressIfQuest | 3084 vfrStatementGrayOutIfQuest | 3085 vfrStatementValue | 3086 vfrStatementDefault | 3087 vfrStatementRead | 3088 vfrStatementWrite | 3089 vfrStatementOptions 3090 ; 3091 3092 vfrStatementQuestionOptionList : 3093 ( 3094 vfrStatementQuestionTag | 3095 vfrStatementQuestionOptionTag 3096 )* 3097 ; 3098 3099 vfrStatementStatList : 3100 vfrStatementStat | 3101 vfrStatementQuestions | 3102 vfrStatementConditionalNew | 3103 vfrStatementLabel | 3104 vfrStatementExtension | 3105 // Just for framework vfr compatibility 3106 vfrStatementInvalid 3107 ; 3108 3109 vfrStatementStatListOld : 3110 vfrStatementStat | 3111 vfrStatementQuestions | 3112 vfrStatementLabel | 3113 // Just for framework vfr compatibility 3114 vfrStatementInvalid 3115 ; 3116 3117 vfrStatementDisableIfStat : 3118 << 3119 CIfrDisableIf DIObj; 3120 >> 3121 L:DisableIf << DIObj.SetLineNo(L->getLine()); >> 3122 vfrStatementExpression[0] ";" 3123 ( vfrStatementStatList )* 3124 E:EndIf << CRT_END_OP (E); >> 3125 ";" 3126 ; 3127 3128 vfrStatementInconsistentIfStat : 3129 << CIfrInconsistentIf IIObj; >> 3130 L:InconsistentIf << 3131 if (!mCompatibleMode) { 3132 _PCATCH (VFR_RETURN_UNSUPPORTED, L); 3133 } 3134 IIObj.SetLineNo(L->getLine()); 3135 >> 3136 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >> 3137 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3138 vfrStatementExpression[0] 3139 E:EndIf << CRT_END_OP (E); >> 3140 ";" 3141 ; 3142 3143 // 3144 // Compatible for framework vfr file 3145 // 3146 vfrStatementgrayoutIfSuppressIf: 3147 << CIfrSuppressIf SIObj; >> 3148 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >> 3149 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3150 vfrStatementExpression[0] 3151 ";" 3152 ; 3153 3154 vfrStatementsuppressIfGrayOutIf: 3155 << CIfrGrayOutIf GOIObj; >> 3156 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >> 3157 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3158 vfrStatementExpression[0] 3159 ";" 3160 ; 3161 3162 vfrStatementSuppressIfStatNew : 3163 << CIfrSuppressIf SIObj;>> 3164 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >> 3165 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3166 vfrStatementExpression[0] 3167 ";" 3168 ( vfrStatementStatList )* 3169 E: EndIf ";" << CRT_END_OP (E); >> 3170 ; 3171 3172 vfrStatementGrayOutIfStatNew : 3173 << CIfrGrayOutIf GOIObj;>> 3174 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >> 3175 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3176 vfrStatementExpression[0] 3177 ";" 3178 ( vfrStatementStatList )* 3179 E: EndIf ";" << CRT_END_OP (E); >> 3180 ; 3181 3182 vfrStatementSuppressIfStatOld : 3183 << 3184 CIfrSuppressIf SIObj; 3185 BOOLEAN GrayOutExist = FALSE; 3186 >> 3187 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >> 3188 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3189 vfrStatementExpression[0] 3190 ";" 3191 { 3192 vfrStatementsuppressIfGrayOutIf 3193 << GrayOutExist = TRUE; >> 3194 } 3195 ( vfrStatementStatListOld )* 3196 E: EndIf ";" << if (GrayOutExist) CRT_END_OP (E); CRT_END_OP (E);>> 3197 ; 3198 3199 vfrStatementGrayOutIfStatOld : 3200 << 3201 CIfrGrayOutIf GOIObj; 3202 BOOLEAN SuppressExist = FALSE; 3203 >> 3204 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >> 3205 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3206 vfrStatementExpression[0] 3207 ";" 3208 { 3209 vfrStatementgrayoutIfSuppressIf 3210 << SuppressExist = TRUE; >> 3211 } 3212 ( vfrStatementStatListOld )* 3213 E: EndIf ";" << if (SuppressExist) CRT_END_OP (E); CRT_END_OP (E); >> 3214 ; 3215 3216 vfrImageTag : 3217 << CIfrImage IObj; >> 3218 L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText(), S1->getLine())); IObj.SetLineNo(L->getLine()); >> 3219 ; 3220 3221 vfrLockedTag : 3222 << CIfrLocked LObj; >> 3223 L:Locked << LObj.SetLineNo(L->getLine()); >> 3224 ; 3225 3226 vfrModalTag : 3227 << CIfrModal MObj; >> 3228 L:Modal << MObj.SetLineNo(L->getLine()); >> 3229 ; 3230 3231 vfrStatementStatTag : 3232 vfrImageTag | 3233 vfrLockedTag 3234 ; 3235 3236 vfrStatementStatTagList : 3237 vfrStatementStatTag ( "," vfrStatementStatTag )* 3238 ; 3239 3240 vfrStatementImage : 3241 vfrImageTag 3242 ";" 3243 ; 3244 3245 vfrStatementModal : 3246 vfrModalTag 3247 ";" 3248 ; 3249 3250 vfrStatementLocked : 3251 vfrLockedTag 3252 ";" 3253 ; 3254 3255 vfrStatementInconsistentIf : 3256 << CIfrInconsistentIf IIObj; >> 3257 L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >> 3258 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText(), S->getLine())); >> 3259 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3260 vfrStatementExpression[0] 3261 E:EndIf {";"} << CRT_END_OP (E); >> 3262 ; 3263 3264 vfrStatementNoSubmitIf : 3265 << CIfrNoSubmitIf NSIObj; >> 3266 L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >> 3267 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText(), S->getLine())); >> 3268 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3269 vfrStatementExpression[0] 3270 E:EndIf {";"} << CRT_END_OP (E); >> 3271 ; 3272 3273 vfrStatementWarningIf : 3274 << CIfrWarningIf WIObj; >> 3275 L:WarningIf << WIObj.SetLineNo(L->getLine()); >> 3276 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << WIObj.SetWarning (_STOSID(S->getText(), S->getLine())); >> 3277 {Timeout "=" T:Number "," << WIObj.SetTimeOut (_STOU8(T->getText(), T->getLine())); >>} 3278 vfrStatementExpression[0] 3279 E:EndIf {";"} << CRT_END_OP (E); >> 3280 ; 3281 3282 vfrStatementDisableIfQuest : 3283 << 3284 CIfrDisableIf DIObj; 3285 >> 3286 L:DisableIf << DIObj.SetLineNo(L->getLine()); >> 3287 vfrStatementExpression[0] ";" 3288 vfrStatementQuestionOptionList 3289 E:EndIf {";"} << CRT_END_OP (E); >> 3290 ; 3291 3292 vfrStatementRefresh : 3293 << CIfrRefresh RObj; >> 3294 L:Refresh << RObj.SetLineNo(L->getLine()); >> 3295 Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText(), I->getLine())); >> 3296 ; 3297 3298 vfrStatementRefreshEvent : 3299 << 3300 CIfrRefreshId RiObj; 3301 EFI_GUID Guid; 3302 >> 3303 L:RefreshGuid << RiObj.SetLineNo(L->getLine()); >> 3304 "=" guidDefinition[Guid] << RiObj.SetRefreshEventGroutId (&Guid); >> 3305 ; 3306 3307 vfrStatementVarstoreDevice : 3308 << CIfrVarStoreDevice VDObj; >> 3309 L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >> 3310 "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText(), S->getLine())); >> 3311 ; 3312 3313 vfrStatementSuppressIfQuest : 3314 << CIfrSuppressIf SIObj; >> 3315 L:SuppressIf << SIObj.SetLineNo(L->getLine()); >> 3316 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3317 vfrStatementExpression[0] ";" 3318 vfrStatementQuestionOptionList 3319 E:EndIf {";"} << CRT_END_OP (E); >> 3320 ; 3321 3322 vfrStatementGrayOutIfQuest : 3323 << CIfrGrayOutIf GOIObj; >> 3324 L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >> 3325 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3326 vfrStatementExpression[0] ";" 3327 vfrStatementQuestionOptionList 3328 E:EndIf {";"} << CRT_END_OP (E); >> 3329 ; 3330 3331 vfrStatementOptions : 3332 vfrStatementOneOfOption 3333 ; 3334 3335 vfrStatementOneOfOption : 3336 << 3337 UINT8 ValueList[EFI_IFR_MAX_LENGTH] = {0,}; 3338 EFI_IFR_TYPE_VALUE *Val = (EFI_IFR_TYPE_VALUE *) ValueList; 3339 CHAR8 *VarStoreName = NULL; 3340 UINT32 Size = 0; 3341 BOOLEAN TypeError = FALSE; 3342 EFI_VFR_RETURN_CODE ReturnCode = VFR_RETURN_SUCCESS; 3343 EFI_GUID *VarStoreGuid = NULL; 3344 BOOLEAN ArrayType = FALSE; 3345 CIfrOneOfOption *OOOObj; 3346 UINT8 *Type8 = (UINT8 *) ValueList; 3347 UINT16 *Type16 = (UINT16 *) ValueList; 3348 UINT32 *Type32 = (UINT32 *) ValueList; 3349 UINT64 *Type64 = (UINT64 *) ValueList; 3350 >> 3351 L:Option << 3352 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) { 3353 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error."); 3354 } 3355 3356 >> 3357 Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," 3358 Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] "," 3359 << 3360 if (gCurrentMinMaxData != NULL) { 3361 //set min/max value for oneof opcode 3362 UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE()); 3363 switch (_GET_CURRQEST_DATATYPE()) { 3364 case EFI_IFR_TYPE_NUM_SIZE_64: 3365 gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step); 3366 break; 3367 case EFI_IFR_TYPE_NUM_SIZE_32: 3368 gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step); 3369 break; 3370 case EFI_IFR_TYPE_NUM_SIZE_16: 3371 gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step); 3372 break; 3373 case EFI_IFR_TYPE_NUM_SIZE_8: 3374 gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step); 3375 break; 3376 default: 3377 break; 3378 } 3379 } 3380 if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) { 3381 Size = sizeof (EFI_IFR_TYPE_VALUE); 3382 } else if (ArrayType) { 3383 switch (_GET_CURRQEST_DATATYPE()) { 3384 case EFI_IFR_TYPE_NUM_SIZE_8 : 3385 while (Type8[Size] != 0) { 3386 Size++; 3387 } 3388 break; 3389 case EFI_IFR_TYPE_NUM_SIZE_16 : 3390 while (Type16[Size] != 0) { 3391 Size++; 3392 } 3393 Size *= sizeof (UINT16); 3394 break; 3395 case EFI_IFR_TYPE_NUM_SIZE_32 : 3396 while (Type32[Size] != 0) { 3397 Size++; 3398 } 3399 Size *= sizeof (UINT32); 3400 break; 3401 case EFI_IFR_TYPE_NUM_SIZE_64 : 3402 while (Type64[Size] != 0) { 3403 Size++; 3404 } 3405 Size *= sizeof (UINT64); 3406 break; 3407 default: 3408 break; 3409 } 3410 } else { 3411 ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size); 3412 } 3413 if (ReturnCode != VFR_RETURN_SUCCESS) { 3414 _PCATCH (ReturnCode, L->getLine()); 3415 } 3416 3417 Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value); 3418 OOOObj = new CIfrOneOfOption((UINT8)Size); 3419 OOOObj->SetLineNo(L->getLine()); 3420 OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); 3421 if (ArrayType) { 3422 OOOObj->SetType (EFI_IFR_TYPE_BUFFER); 3423 } else { 3424 OOOObj->SetType (_GET_CURRQEST_DATATYPE()); 3425 } 3426 OOOObj->SetValue (*Val); 3427 >> 3428 F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()] 3429 << 3430 // 3431 // Array type only for default type OneOfOption. 3432 // 3433 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) { 3434 _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!"); 3435 } 3436 3437 // 3438 // Clear the default flag if the option not use array value but has default flag. 3439 // 3440 if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) { 3441 OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)); 3442 } 3443 3444 if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) { 3445 _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine()); 3446 VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId); 3447 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) { 3448 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F); 3449 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd ( 3450 EFI_HII_DEFAULT_CLASS_STANDARD, 3451 _GET_CURRQEST_VARTINFO(), 3452 VarStoreName, 3453 VarStoreGuid, 3454 _GET_CURRQEST_DATATYPE (), 3455 *Val 3456 ), L->getLine()); 3457 } 3458 if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) { 3459 CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F); 3460 _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd ( 3461 EFI_HII_DEFAULT_CLASS_MANUFACTURING, 3462 _GET_CURRQEST_VARTINFO(), 3463 VarStoreName, 3464 VarStoreGuid, 3465 _GET_CURRQEST_DATATYPE (), 3466 *Val 3467 ), L->getLine()); 3468 } 3469 } 3470 >> 3471 { 3472 "," Key "=" KN:Number << 3473 if (!mCompatibleMode) { 3474 _PCATCH (VFR_RETURN_UNSUPPORTED, KN); 3475 } 3476 // 3477 // Guid Option Key 3478 // 3479 CIfrOptionKey IfrOptionKey ( 3480 gCurrentQuestion->QUESTION_ID(), 3481 *Val, 3482 _STOQID(KN->getText(), KN->getLine()) 3483 ); 3484 SET_LINE_INFO (IfrOptionKey, KN); 3485 >> 3486 } 3487 ( 3488 T:"," vfrImageTag << OOOObj->SetScope (1); CRT_END_OP (T); >> 3489 )* 3490 ";" << if (OOOObj != NULL) {delete OOOObj;} >> 3491 ; 3492 3493 vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] : 3494 << 3495 UINT8 LFlags = _GET_CURRQEST_DATATYPE(); 3496 UINT8 HFlags = 0; 3497 >> 3498 oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )* 3499 << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >> 3500 << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >> 3501 ; 3502 3503 oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] : 3504 N:Number << $LFlags |= _STOU8(N->getText(), N->getLine()); >> 3505 | "OPTION_DEFAULT" << $LFlags |= 0x10; >> 3506 | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >> 3507 | InteractiveFlag << $HFlags |= 0x04; >> 3508 | ResetRequiredFlag << $HFlags |= 0x10; >> 3509 | ReconnectRequiredFlag << $HFlags |= 0x40; >> 3510 | ManufacturingFlag << $LFlags |= 0x20; >> 3511 | DefaultFlag << $LFlags |= 0x10; >> 3512 | A:NVAccessFlag << 3513 if (mCompatibleMode) { 3514 $HFlags |= 0x08; 3515 } else { 3516 gCVfrErrorHandle.HandleWarning ( 3517 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, 3518 A->getLine(), 3519 A->getText() 3520 ); 3521 } 3522 >> 3523 | L:LateCheckFlag << 3524 if (mCompatibleMode) { 3525 $HFlags |= 0x20; 3526 } else { 3527 gCVfrErrorHandle.HandleWarning ( 3528 VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, 3529 L->getLine(), 3530 L->getText() 3531 ); 3532 } 3533 >> 3534 ; 3535 3536 vfrStatementLabel : 3537 L:Label 3538 N:Number << 3539 if (mCompatibleMode) { 3540 // 3541 // Add end Label for Framework Vfr 3542 // 3543 CIfrLabel LObj1; 3544 LObj1.SetLineNo(L->getLine()); 3545 LObj1.SetNumber (0xffff); //add end label for UEFI, label number hardcode 0xffff 3546 } 3547 3548 { 3549 CIfrLabel LObj2; 3550 LObj2.SetLineNo(L->getLine()); 3551 LObj2.SetNumber (_STOU16(N->getText(), N->getLine())); 3552 } 3553 >> 3554 ";" 3555 ; 3556 3557 vfrStatementBanner : 3558 << CIfrBanner BObj; >> 3559 B:Banner { "," } << BObj.SetLineNo(B->getLine()); >> 3560 Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText(), S->getLine())); >> 3561 ( 3562 ( 3563 Line L:Number "," << BObj.SetLine (_STOU16(L->getText(), L->getLine())); >> 3564 Align 3565 ( 3566 Left << BObj.SetAlign (0); >> 3567 | Center << BObj.SetAlign (1); >> 3568 | Right << BObj.SetAlign (2); >> 3569 ) ";" 3570 ) 3571 | 3572 ( 3573 Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText(), T->getLine()));} >> 3574 ) 3575 ) 3576 ; 3577 3578 //****************************************************************************** 3579 // 3580 // keep some syntax for compatibility but not generate any IFR object 3581 // 3582 vfrStatementInvalidHidden : 3583 L:Hidden << 3584 if (!mCompatibleMode) { 3585 _PCATCH (VFR_RETURN_UNSUPPORTED, L); 3586 } 3587 >> 3588 Value "=" Number "," 3589 Key "=" Number ";" 3590 ; 3591 3592 vfrStatementInvalidInconsistentIf : 3593 InconsistentIf 3594 Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," 3595 { FLAGS "=" flagsField ( "\|" flagsField )* "," } 3596 vfrStatementExpression[0] 3597 EndIf 3598 ";" 3599 ; 3600 3601 vfrStatementInvalidInventory : 3602 L:Inventory << 3603 if (!mCompatibleMode) { 3604 _PCATCH (VFR_RETURN_UNSUPPORTED, L); 3605 } 3606 >> 3607 Help "=" "STRING_TOKEN" "\(" Number "\)" "," 3608 Text "=" "STRING_TOKEN" "\(" Number "\)" "," 3609 { 3610 Text "=" "STRING_TOKEN" "\(" Number "\)" 3611 } 3612 ";" 3613 ; 3614 3615 vfrStatementInvalidSaveRestoreDefaults : 3616 ( 3617 L:Save << 3618 if (!mCompatibleMode) { 3619 _PCATCH (VFR_RETURN_UNSUPPORTED, L); 3620 } 3621 >> 3622 | 3623 K:Restore << 3624 if (!mCompatibleMode) { 3625 _PCATCH (VFR_RETURN_UNSUPPORTED, K); 3626 } 3627 >> 3628 ) 3629 Defaults "," 3630 FormId "=" Number "," 3631 Prompt "=" "STRING_TOKEN" "\(" Number "\)" "," 3632 Help "=" "STRING_TOKEN" "\(" Number "\)" 3633 { "," FLAGS "=" flagsField ( "\|" flagsField )* } 3634 { "," Key "=" Number } 3635 ";" 3636 ; 3637 3638 //****************************************************************************** 3639 // 3640 // The syntax of expression 3641 // 3642 #token Dup("dup") "dup" 3643 #token VarEqVal("vareqval") "vareqval" 3644 #token Var("var") "var" 3645 #token IdEqVal("ideqval") "ideqval" 3646 #token IdEqId("ideqid") "ideqid" 3647 #token IdEqValList("ideqvallist") "ideqvallist" 3648 #token QuestionRef("questionref") "questionref" 3649 #token RuleRef("ruleref") "ruleref" 3650 #token StringRef("stringref") "stringref" 3651 #token PushThis("pushthis") "pushthis" 3652 #token Security("security") "security" 3653 #token Get("get") "get" 3654 #token True("TRUE") "TRUE" 3655 #token False("FALSE") "FALSE" 3656 #token One("ONE") "ONE" 3657 #token Ones("ONES") "ONES" 3658 #token Zero("ZERO") "ZERO" 3659 #token Undefined("UNDEFINED") "UNDEFINED" 3660 #token Version("VERSION") "VERSION" 3661 #token Length("length") "length" 3662 #token AND("AND") "AND" 3663 #token OR("OR") "OR" 3664 #token NOT("NOT") "NOT" 3665 #token Set("set") "set" 3666 #token BitWiseNot("~") "\~" 3667 #token BoolVal("boolval") "boolval" 3668 #token StringVal("stringval") "stringval" 3669 #token UnIntVal("unintval") "unintval" 3670 #token ToUpper("toupper") "toupper" 3671 #token ToLower("tolower") "tolower" 3672 #token Match("match") "match" 3673 #token Match2("match2") "match2" 3674 #token Catenate("catenate") "catenate" 3675 #token QuestionRefVal("questionrefval") "questionrefval" 3676 #token StringRefVal("stringrefval") "stringrefval" 3677 #token Map("map") "map" 3678 #token RefreshGuid("refreshguid") "refreshguid" 3679 3680 // 3681 // Root expression extension function called by other function. 3682 // 3683 vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] : 3684 << 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 ();} >> 3685 andTerm[$RootLevel, $ExpOpCount] 3686 ( 3687 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >> 3688 )* 3689 << 3690 // 3691 // Extend OpCode Scope only for the root expression. 3692 // 3693 if ($ExpOpCount > 1 && $RootLevel == 0) { 3694 if (_SET_SAVED_OPHDR_SCOPE()) { 3695 CIfrEnd EObj; 3696 if (mCIfrOpHdrLineNo[mCIfrOpHdrIndex] != 0) { 3697 EObj.SetLineNo (mCIfrOpHdrLineNo[mCIfrOpHdrIndex]); 3698 } 3699 } 3700 } 3701 3702 if ($RootLevel == 0) { 3703 mCIfrOpHdrIndex --; 3704 } 3705 >> 3706 ; 3707 3708 // 3709 // Add new sub function for the sub expression extension to remember the ExpOpCount 3710 // This funciton is only called by sub expression. 3711 // 3712 vfrStatementExpressionSub [UINT32 RootLevel, UINT32 & ExpOpCount] : 3713 andTerm[$RootLevel, $ExpOpCount] 3714 ( 3715 L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >> 3716 )* 3717 ; 3718 3719 andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] : 3720 bitwiseorTerm[$RootLevel, $ExpOpCount] 3721 ( 3722 L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >> 3723 )* 3724 ; 3725 3726 bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3727 bitwiseandTerm[$RootLevel, $ExpOpCount] 3728 ( 3729 L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >> 3730 )* 3731 ; 3732 3733 bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3734 equalTerm[$RootLevel, $ExpOpCount] 3735 ( 3736 L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >> 3737 )* 3738 ; 3739 3740 equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3741 compareTerm[$RootLevel, $ExpOpCount] 3742 ( 3743 ( 3744 L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >> 3745 ) 3746 | 3747 ( 3748 L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >> 3749 ) 3750 )* 3751 ; 3752 3753 compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3754 shiftTerm[$RootLevel, $ExpOpCount] 3755 ( 3756 ( 3757 L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >> 3758 ) 3759 | 3760 ( 3761 L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >> 3762 ) 3763 | 3764 ( 3765 L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >> 3766 ) 3767 | 3768 ( 3769 L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >> 3770 ) 3771 )* 3772 ; 3773 3774 shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3775 addMinusTerm[$RootLevel, $ExpOpCount] 3776 ( 3777 ( 3778 L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >> 3779 ) 3780 | 3781 ( 3782 L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >> 3783 ) 3784 )* 3785 ; 3786 3787 addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3788 multdivmodTerm[$RootLevel, $ExpOpCount] 3789 ( 3790 ( 3791 L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >> 3792 ) 3793 | 3794 ( 3795 L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >> 3796 ) 3797 )* 3798 ; 3799 3800 multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3801 castTerm[$RootLevel, $ExpOpCount] 3802 ( 3803 ( 3804 L1:"\*" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >> 3805 ) 3806 | 3807 ( 3808 L2:"/" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >> 3809 ) 3810 | 3811 ( 3812 L3:"%" castTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >> 3813 ) 3814 )* 3815 ; 3816 3817 castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3818 << UINT8 CastType = 0xFF; >> 3819 ( 3820 L:"\(" 3821 ( 3822 Boolean << CastType = 0; >> 3823 | Uint64 << CastType = 1; >> 3824 | Uint32 << CastType = 1; >> 3825 | Uint16 << CastType = 1; >> 3826 | Uint8 << CastType = 1; >> 3827 ) 3828 "\)" 3829 )* 3830 atomTerm[$RootLevel, $ExpOpCount] 3831 << 3832 switch (CastType) { 3833 case 0: { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } break; 3834 case 1: { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } break; 3835 } 3836 >> 3837 ; 3838 3839 atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3840 vfrExpressionCatenate[$RootLevel, $ExpOpCount] 3841 | vfrExpressionMatch[$RootLevel, $ExpOpCount] 3842 | vfrExpressionMatch2[$RootLevel, $ExpOpCount] 3843 | vfrExpressionParen[$RootLevel, $ExpOpCount] 3844 | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount] 3845 | vfrExpressionConstant[$RootLevel, $ExpOpCount] 3846 | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount] 3847 | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount] 3848 | vfrExpressionMap[$RootLevel, $ExpOpCount] 3849 | ( 3850 L:NOT 3851 atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >> 3852 ) 3853 ; 3854 3855 vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3856 L:Catenate 3857 "\(" 3858 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 3859 "," 3860 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 3861 "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >> 3862 ; 3863 3864 vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3865 L:Match 3866 "\(" 3867 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 3868 "," 3869 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 3870 "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >> 3871 ; 3872 3873 vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3874 << 3875 EFI_GUID Guid; 3876 >> 3877 L:Match2 3878 "\(" 3879 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 3880 "," 3881 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 3882 "," 3883 guidDefinition[Guid] 3884 "\)" << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >> 3885 ; 3886 3887 vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]: 3888 "\(" 3889 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 3890 "\)" 3891 ; 3892 3893 vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] : 3894 dupExp[$RootLevel, $ExpOpCount] 3895 | vareqvalExp[$RootLevel, $ExpOpCount] //Compatible for Framework vareqval 3896 | ideqvalExp[$RootLevel, $ExpOpCount] 3897 | ideqidExp[$RootLevel, $ExpOpCount] 3898 | ideqvallistExp[$RootLevel, $ExpOpCount] 3899 | questionref1Exp[$RootLevel, $ExpOpCount] 3900 | rulerefExp[$RootLevel, $ExpOpCount] 3901 | stringref1Exp[$RootLevel, $ExpOpCount] 3902 | pushthisExp[$RootLevel, $ExpOpCount] 3903 | securityExp[$RootLevel, $ExpOpCount] 3904 | getExp[$RootLevel, $ExpOpCount] 3905 ; 3906 3907 dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] : 3908 L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >> 3909 ; 3910 3911 vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] : 3912 << 3913 EFI_QUESTION_ID QId; 3914 UINT32 Mask; 3915 UINT16 ConstVal; 3916 CHAR8 *VarIdStr; 3917 UINT32 LineNo; 3918 EFI_VFR_RETURN_CODE VfrReturnCode = VFR_RETURN_SUCCESS; 3919 EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID; 3920 >> 3921 L:VarEqVal << 3922 if (!mCompatibleMode) { 3923 _PCATCH (VFR_RETURN_UNSUPPORTED, L); 3924 } 3925 >> 3926 VK:Var 3927 OpenParen 3928 VN:Number << 3929 VarIdStr = NULL; _STRCAT(&VarIdStr, VK->getText()); _STRCAT(&VarIdStr, VN->getText()); 3930 VfrReturnCode = mCVfrDataStorage.GetVarStoreId (VarIdStr, &VarStoreId); 3931 if (VfrReturnCode == VFR_RETURN_UNDEFINED) { 3932 _PCATCH (mCVfrDataStorage.DeclareEfiVarStore ( 3933 VarIdStr, 3934 &mFormsetGuid, 3935 _STOSID(VN->getText(), VN->getLine()), 3936 0x2, //default type is UINT16 3937 FALSE 3938 ), VN); 3939 } else { 3940 _PCATCH (VfrReturnCode, VN); 3941 } 3942 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask); 3943 LineNo = GET_LINENO(VN); 3944 >> 3945 CloseParen 3946 ( 3947 ( 3948 "==" 3949 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >> 3950 << 3951 if (Mask == 0) { 3952 CIfrEqIdVal EIVObj (L->getLine()); 3953 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine()); 3954 EIVObj.SetQuestionId (QId, VarIdStr, LineNo); 3955 EIVObj.SetValue (ConstVal); 3956 $ExpOpCount++; 3957 } else { 3958 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL); 3959 } 3960 >> 3961 ) 3962 | 3963 ( 3964 "<=" 3965 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >> 3966 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >> 3967 ) 3968 | 3969 ( 3970 "<" 3971 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >> 3972 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >> 3973 ) 3974 | 3975 ( 3976 ">=" 3977 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >> 3978 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >> 3979 ) 3980 | 3981 ( 3982 ">" 3983 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >> 3984 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >> 3985 ) 3986 ) 3987 ; 3988 3989 ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] : 3990 << 3991 EFI_QUESTION_ID QId; 3992 UINT32 Mask; 3993 UINT16 ConstVal; 3994 CHAR8 *VarIdStr; 3995 UINT32 LineNo; 3996 >> 3997 L:IdEqVal 3998 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo] 3999 ( 4000 ( 4001 "==" 4002 V1:Number << ConstVal = _STOU16(V1->getText(), V1->getLine()); >> 4003 << 4004 if (Mask == 0) { 4005 CIfrEqIdVal EIVObj (L->getLine()); 4006 _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0), L->getLine()); 4007 EIVObj.SetQuestionId (QId, VarIdStr, LineNo); 4008 EIVObj.SetValue (ConstVal); 4009 $ExpOpCount++; 4010 } else { 4011 IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL); 4012 } 4013 >> 4014 ) 4015 | 4016 ( 4017 "<=" 4018 V2:Number << ConstVal = _STOU16(V2->getText(), V2->getLine()); >> 4019 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >> 4020 ) 4021 | 4022 ( 4023 "<" 4024 V3:Number << ConstVal = _STOU16(V3->getText(), V3->getLine()); >> 4025 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >> 4026 ) 4027 | 4028 ( 4029 ">=" 4030 V4:Number << ConstVal = _STOU16(V4->getText(), V4->getLine()); >> 4031 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >> 4032 ) 4033 | 4034 ( 4035 ">" 4036 V5:Number << ConstVal = _STOU16(V5->getText(), V5->getLine()); >> 4037 << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >> 4038 ) 4039 ) 4040 ; 4041 4042 ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4043 << 4044 EFI_QUESTION_ID QId[2]; 4045 UINT32 Mask[2]; 4046 CHAR8 *VarIdStr[2]; 4047 UINT32 LineNo[2]; 4048 >> 4049 L:IdEqId 4050 vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]] 4051 ( 4052 ( 4053 "==" 4054 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]] 4055 << 4056 if (Mask[0] & Mask[1]) { 4057 IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL); 4058 } else { 4059 CIfrEqIdId EIIObj(L->getLine()); 4060 _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0), L->getLine()); 4061 EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]); 4062 EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]); 4063 $ExpOpCount++; 4064 } 4065 >> 4066 ) 4067 | 4068 ( 4069 "<=" 4070 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]] 4071 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >> 4072 ) 4073 | 4074 ( 4075 "<" 4076 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]] 4077 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >> 4078 ) 4079 | 4080 ( 4081 ">=" 4082 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]] 4083 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >> 4084 ) 4085 | 4086 ( 4087 ">" 4088 vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]] 4089 << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >> 4090 ) 4091 ) 4092 ; 4093 4094 ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4095 << 4096 UINT16 ListLen = 0; 4097 EFI_QUESTION_ID QId; 4098 UINT32 Mask; 4099 UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,}; 4100 CHAR8 *VarIdStr; 4101 UINT32 LineNo; 4102 >> 4103 L:IdEqValList 4104 vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo] 4105 "==" 4106 ( 4107 V:Number << ValueList[ListLen] = _STOU16(V->getText(), V->getLine()); ListLen++; >> 4108 )+ 4109 << 4110 if (Mask != 0) { 4111 IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList); 4112 } else { 4113 UINT16 Index; 4114 CIfrEqIdList EILObj(L->getLine()); 4115 if (QId != EFI_QUESTION_ID_INVALID) { 4116 EILObj.SetQuestionId (QId, VarIdStr, LineNo); 4117 } 4118 EILObj.SetListLength (ListLen); 4119 for (Index = 0; Index < ListLen; Index++) { 4120 EILObj.SetValueList (Index, ValueList[Index]); 4121 } 4122 4123 EILObj.UpdateIfrBuffer(); 4124 _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0), L->getLine()); 4125 4126 if (QId == EFI_QUESTION_ID_INVALID) { 4127 EILObj.SetQuestionId (QId, VarIdStr, LineNo); 4128 } 4129 $ExpOpCount++; 4130 } 4131 >> 4132 ; 4133 4134 questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4135 << 4136 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; 4137 UINT32 BitMask; 4138 CHAR8 *QName = NULL; 4139 UINT32 LineNo = 0; 4140 >> 4141 L:QuestionRef 4142 "\(" 4143 ( 4144 QN:StringIdentifier << 4145 QName = QN->getText(); 4146 LineNo = QN->getLine(); 4147 mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask); 4148 >> 4149 | ID:Number << QId = _STOQID(ID->getText(), ID->getLine()); >> 4150 ) 4151 "\)" 4152 << 4153 { CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >> 4154 ; 4155 4156 rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4157 L:RuleRef 4158 "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0), L->getLine()); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >> 4159 ; 4160 4161 //****************************************************** 4162 // PARSE: 4163 // stringref (STR_FORM_SET_TITLE) 4164 // 4165 stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4166 << 4167 EFI_STRING_ID RefStringId = EFI_STRING_ID_INVALID; 4168 >> 4169 L:StringRef 4170 "\(" 4171 ( 4172 "STRING_TOKEN" 4173 "\(" 4174 S:Number << RefStringId = _STOSID(S->getText(), S->getLine()); >> 4175 "\)" 4176 | I:Number << RefStringId = _STOSID(I->getText(), I->getLine()); >> 4177 ) 4178 "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0), L->getLine()); SR1Obj.SetStringId (RefStringId); $ExpOpCount++; } >> 4179 ; 4180 4181 pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4182 L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L->getLine()); $ExpOpCount++; } >> 4183 ; 4184 4185 securityExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4186 << 4187 EFI_GUID Guid; 4188 >> 4189 L:Security 4190 "\(" guidDefinition[Guid] "\)" << { CIfrSecurity SObj(L->getLine()); _SAVE_OPHDR_COND (SObj, ($ExpOpCount == 0), L->getLine()); SObj.SetPermissions (&Guid); } $ExpOpCount++; >> 4191 ; 4192 4193 numericVarStoreType [UINT8 & VarType] : 4194 "NUMERIC_SIZE_1" << $VarType = EFI_IFR_NUMERIC_SIZE_1; >> 4195 | "NUMERIC_SIZE_2" << $VarType = EFI_IFR_NUMERIC_SIZE_2; >> 4196 | "NUMERIC_SIZE_4" << $VarType = EFI_IFR_NUMERIC_SIZE_4; >> 4197 | "NUMERIC_SIZE_8" << $VarType = EFI_IFR_NUMERIC_SIZE_8; >> 4198 ; 4199 4200 getExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4201 << 4202 EFI_VARSTORE_INFO Info; 4203 CHAR8 *VarIdStr = NULL; 4204 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; 4205 UINT32 Mask = 0; 4206 EFI_QUESION_TYPE QType = QUESTION_NORMAL; 4207 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED; 4208 UINT32 VarSize = 0; 4209 Info.mVarStoreId = 0; 4210 >> 4211 L:Get 4212 "\(" 4213 vfrStorageVarId[Info, VarIdStr, FALSE] 4214 {"\|" FLAGS "=" numericVarStoreType [VarType] } 4215 "\)" << 4216 { 4217 if (Info.mVarStoreId == 0) { 4218 // support Date/Time question 4219 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType); 4220 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) { 4221 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information"); 4222 } 4223 if (QType == QUESTION_DATE) { 4224 Info.mVarType = EFI_IFR_TYPE_DATE; 4225 } else if (QType == QUESTION_TIME) { 4226 Info.mVarType = EFI_IFR_TYPE_TIME; 4227 } 4228 switch (Mask) { 4229 case DATE_YEAR_BITMASK: 4230 Info.mInfo.mVarOffset = 0; 4231 break; 4232 case DATE_DAY_BITMASK: 4233 Info.mInfo.mVarOffset = 3; 4234 break; 4235 case TIME_HOUR_BITMASK: 4236 Info.mInfo.mVarOffset = 0; 4237 break; 4238 case TIME_MINUTE_BITMASK: 4239 Info.mInfo.mVarOffset = 1; 4240 break; 4241 case TIME_SECOND_BITMASK: 4242 Info.mInfo.mVarOffset = 2; 4243 break; 4244 default: 4245 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information"); 4246 break; 4247 } 4248 } else { 4249 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) { 4250 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string"); 4251 } 4252 if (VarType != EFI_IFR_TYPE_UNDEFINED) { 4253 Info.mVarType = VarType; 4254 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size"); 4255 Info.mVarTotalSize = VarSize; 4256 } 4257 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size"); 4258 if (VarSize != Info.mVarTotalSize) { 4259 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array"); 4260 } 4261 } 4262 CIfrGet GObj(L->getLine()); 4263 _SAVE_OPHDR_COND (GObj, ($ExpOpCount == 0), L->getLine()); 4264 GObj.SetVarInfo (&Info); 4265 delete VarIdStr; 4266 $ExpOpCount++; 4267 } 4268 >> 4269 ; 4270 4271 vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4272 L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0), L1->getLine()); $ExpOpCount++; >> 4273 | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0), L2->getLine()); $ExpOpCount++; >> 4274 | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L3->getLine()); $ExpOpCount++; >> 4275 | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0), L4->getLine()); $ExpOpCount++; >> 4276 | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0), L5->getLine()); $ExpOpCount++; >> 4277 | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0), L6->getLine()); $ExpOpCount++; >> 4278 | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0), L7->getLine()); $ExpOpCount++; >> 4279 | V:Number << CIfrUint64 U64Obj(V->getLine()); U64Obj.SetValue (_STOU64(V->getText(), V->getLine())); _SAVE_OPHDR_COND (U64Obj, ($ExpOpCount == 0), V->getLine()); $ExpOpCount++; >> 4280 ; 4281 4282 vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4283 lengthExp[$RootLevel, $ExpOpCount] 4284 | bitwisenotExp[$RootLevel, $ExpOpCount] 4285 | question23refExp[$RootLevel, $ExpOpCount] 4286 | stringref2Exp[$RootLevel, $ExpOpCount] 4287 | toboolExp[$RootLevel, $ExpOpCount] 4288 | tostringExp[$RootLevel, $ExpOpCount] 4289 | unintExp[$RootLevel, $ExpOpCount] 4290 | toupperExp[$RootLevel, $ExpOpCount] 4291 | tolwerExp[$RootLevel, $ExpOpCount] 4292 | setExp[$RootLevel, $ExpOpCount] 4293 ; 4294 4295 lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4296 L:Length 4297 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" 4298 << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >> 4299 ; 4300 4301 bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4302 L:BitWiseNot 4303 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" 4304 << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >> 4305 ; 4306 4307 question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4308 << 4309 UINT8 Type = 0x1; 4310 EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID; 4311 EFI_GUID Guid = {0,}; 4312 >> 4313 L:QuestionRefVal 4314 "\(" 4315 { 4316 DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText(), S->getLine()); >> 4317 } 4318 { 4319 Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >> 4320 } 4321 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4322 "\)" 4323 << 4324 switch (Type) { 4325 case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;} 4326 case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;} 4327 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;} 4328 } 4329 $ExpOpCount++; 4330 >> 4331 ; 4332 4333 stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4334 L:StringRefVal 4335 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" 4336 << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >> 4337 ; 4338 4339 toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4340 L:BoolVal 4341 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" 4342 << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >> 4343 ; 4344 4345 tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4346 << UINT8 Fmt = 0; >> 4347 L:StringVal 4348 { 4349 Format "=" F:Number "," << Fmt = _STOU8(F->getText(), F->getLine()); >> 4350 } 4351 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" 4352 << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >> 4353 ; 4354 4355 unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4356 L:UnIntVal 4357 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" 4358 << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >> 4359 ; 4360 4361 toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4362 L:ToUpper 4363 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" 4364 << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >> 4365 ; 4366 4367 tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4368 L:ToLower 4369 "\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)" 4370 << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >> 4371 ; 4372 4373 setExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4374 << 4375 EFI_VARSTORE_INFO Info; 4376 CHAR8 *VarIdStr = NULL; 4377 EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; 4378 UINT32 Mask = 0; 4379 EFI_QUESION_TYPE QType = QUESTION_NORMAL; 4380 UINT8 VarType = EFI_IFR_TYPE_UNDEFINED; 4381 UINT32 VarSize = 0; 4382 Info.mVarStoreId = 0; 4383 >> 4384 L:Set 4385 "\(" 4386 vfrStorageVarId[Info, VarIdStr, FALSE] 4387 {"\|" FLAG "=" numericVarStoreType [VarType] } 4388 "," vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4389 "\)" 4390 << 4391 { 4392 if (Info.mVarStoreId == 0) { 4393 // support Date/Time question 4394 mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, QId, Mask, &QType); 4395 if (QId == EFI_QUESTION_ID_INVALID || Mask == 0 || QType == QUESTION_NORMAL) { 4396 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information"); 4397 } 4398 if (QType == QUESTION_DATE) { 4399 Info.mVarType = EFI_IFR_TYPE_DATE; 4400 } else if (QType == QUESTION_TIME) { 4401 Info.mVarType = EFI_IFR_TYPE_TIME; 4402 } 4403 switch (Mask) { 4404 case DATE_YEAR_BITMASK: 4405 Info.mInfo.mVarOffset = 0; 4406 break; 4407 case DATE_DAY_BITMASK: 4408 Info.mInfo.mVarOffset = 3; 4409 break; 4410 case TIME_HOUR_BITMASK: 4411 Info.mInfo.mVarOffset = 0; 4412 break; 4413 case TIME_MINUTE_BITMASK: 4414 Info.mInfo.mVarOffset = 1; 4415 break; 4416 case TIME_SECOND_BITMASK: 4417 Info.mInfo.mVarOffset = 2; 4418 break; 4419 default: 4420 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode can't get the enough varstore information"); 4421 break; 4422 } 4423 } else { 4424 if ((mCVfrDataStorage.GetVarStoreType(Info.mVarStoreId) == EFI_VFR_VARSTORE_NAME) && (VarType == EFI_IFR_TYPE_UNDEFINED)) { 4425 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support name string"); 4426 } 4427 if (VarType != EFI_IFR_TYPE_UNDEFINED) { 4428 Info.mVarType = VarType; 4429 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size"); 4430 Info.mVarTotalSize = VarSize; 4431 } 4432 _PCATCH(gCVfrVarDataTypeDB.GetDataTypeSize (Info.mVarType, &VarSize), L->getLine(), "Get/Set opcode can't get var type size"); 4433 if (VarSize != Info.mVarTotalSize) { 4434 _PCATCH(VFR_RETURN_UNSUPPORTED, L->getLine(), "Get/Set opcode don't support data array"); 4435 } 4436 } 4437 CIfrSet TSObj(L->getLine()); 4438 TSObj.SetVarInfo (&Info); 4439 delete VarIdStr; 4440 $ExpOpCount++; 4441 } 4442 >> 4443 ; 4444 4445 vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4446 conditionalExp[$RootLevel, $ExpOpCount] 4447 | findExp[$RootLevel, $ExpOpCount] 4448 | midExp[$RootLevel, $ExpOpCount] 4449 | tokenExp[$RootLevel, $ExpOpCount] 4450 | spanExp[$RootLevel, $ExpOpCount] 4451 ; 4452 4453 #token Cond("cond") "cond" 4454 #token Find("find") "find" 4455 #token Mid("mid") "mid" 4456 #token Tok("token") "token" 4457 #token Span("span") "span" 4458 4459 conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4460 L:Cond "\(" 4461 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4462 "?" 4463 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4464 ":" 4465 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4466 "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >> 4467 ; 4468 4469 findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4470 << UINT8 Format; >> 4471 L:Find "\(" 4472 findFormat[Format] ( "\|" findFormat[Format] )* 4473 "," 4474 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4475 "," 4476 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4477 "," 4478 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4479 "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >> 4480 ; 4481 4482 findFormat [UINT8 & Format] : 4483 "SENSITIVE" << $Format = 0x00; >> 4484 | "INSENSITIVE" << $Format = 0x01; >> 4485 ; 4486 4487 midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4488 L:Mid "\(" 4489 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4490 "," 4491 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4492 "," 4493 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4494 "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >> 4495 ; 4496 4497 tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4498 L:Tok "\(" 4499 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4500 "," 4501 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4502 "," 4503 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4504 "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >> 4505 ; 4506 4507 spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] : 4508 << UINT8 Flags = 0; >> 4509 S:Span "\(" 4510 FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )* 4511 "," 4512 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4513 "," 4514 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4515 "," 4516 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4517 "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >> 4518 ; 4519 4520 vfrExpressionMap [UINT32 & RootLevel, UINT32 & ExpOpCount]: 4521 L:Map 4522 "\(" 4523 vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] 4524 ":" << { CIfrMap MObj(L->getLine()); } >> 4525 ( 4526 vfrStatementExpression[0] 4527 "," 4528 vfrStatementExpression[0] 4529 ";" 4530 ) * 4531 E:"\)" << { CIfrEnd EObj; EObj.SetLineNo(E->getLine()); $ExpOpCount++; } >> 4532 ; 4533 4534 spanFlags [UINT8 & Flags] : 4535 N:Number << $Flags |= _STOU8(N->getText(), N->getLine()); >> 4536 | "LAST_NON_MATCH" << $Flags |= 0x00; >> 4537 | "FIRST_NON_MATCH" << $Flags |= 0x01; >> 4538 ; 4539 4540 #token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*" 4541 #token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+" 4542 4543 //****************************************************************************** 4544 // 4545 // Parser class definition. 4546 // 4547 class EfiVfrParser { 4548 << 4549 private: 4550 UINT8 mParserStatus; 4551 BOOLEAN mConstantOnlyInExpression; 4552 4553 CVfrDefaultStore mCVfrDefaultStore; 4554 CVfrDataStorage mCVfrDataStorage; 4555 CVfrQuestionDB mCVfrQuestionDB; 4556 CVfrRulesDB mCVfrRulesDB; 4557 4558 CIfrOpHeader * mCIfrOpHdr[MAX_IFR_EXPRESSION_DEPTH]; 4559 UINT32 mCIfrOpHdrLineNo[MAX_IFR_EXPRESSION_DEPTH]; 4560 UINT8 mCIfrOpHdrIndex; 4561 VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN, UINT32 LineNo = 0); 4562 VOID _CLEAR_SAVED_OPHDR (VOID); 4563 BOOLEAN _SET_SAVED_OPHDR_SCOPE (VOID); 4564 4565 4566 EFI_VARSTORE_INFO mCurrQestVarInfo; 4567 EFI_GUID *mOverrideClassGuid; 4568 CHAR8* mLastFormEndAddr; 4569 4570 // 4571 // Whether the question already has default value. 4572 // 4573 UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE]; 4574 UINT16 mUsedDefaultCount; 4575 4576 // 4577 // For framework vfr compatibility 4578 // 4579 BOOLEAN mCompatibleMode; 4580 EFI_GUID mFormsetGuid; 4581 4582 VOID _CRT_OP (IN BOOLEAN); 4583 4584 VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &); 4585 EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID); 4586 4587 UINT8 _GET_CURRQEST_DATATYPE (); 4588 UINT32 _GET_CURRQEST_VARSIZE (); 4589 UINT32 _GET_CURRQEST_ARRAY_SIZE(); 4590 VOID CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr); 4591 4592 public: 4593 VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *); 4594 VOID _PCATCH (IN EFI_VFR_RETURN_CODE); 4595 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr); 4596 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32); 4597 VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32, IN CONST CHAR8 *); 4598 4599 VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32); 4600 4601 CHAR8* TrimHex (IN CHAR8 *, OUT BOOLEAN *); 4602 CHAR8* _U32TOS (IN UINT32); 4603 UINT8 _STOU8 (IN CHAR8 *, IN UINT32); 4604 UINT16 _STOU16 (IN CHAR8 *, IN UINT32); 4605 UINT32 _STOU32 (IN CHAR8 *, IN UINT32); 4606 UINT64 _STOU64 (IN CHAR8 *, IN UINT32); 4607 EFI_HII_DATE _STOD (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32); 4608 EFI_HII_TIME _STOT (IN CHAR8 *, IN CHAR8 *, IN CHAR8 *, IN UINT32); 4609 EFI_HII_REF _STOR (IN CHAR8 *, IN CHAR8 *, IN EFI_GUID *, IN CHAR8 *, IN UINT32); 4610 4611 EFI_STRING_ID _STOSID (IN CHAR8 *, IN UINT32); 4612 EFI_FORM_ID _STOFID (IN CHAR8 *, IN UINT32); 4613 EFI_QUESTION_ID _STOQID (IN CHAR8 *, IN UINT32); 4614 4615 VOID _STRCAT (IN OUT CHAR8 **, IN CONST CHAR8 *); 4616 4617 VOID _DeclareDefaultLinearVarStore (IN UINT32); 4618 VOID _DeclareStandardDefaultStorage (IN UINT32); 4619 VOID _DeclareDefaultFrameworkVarStore (IN UINT32); 4620 4621 VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr); 4622 4623 VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32); 4624 VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE); 4625 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); 4626 VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN CHAR8 *, IN UINT32, IN UINT16, IN UINT16 *); 4627 VOID SetOverrideClassGuid (IN EFI_GUID *); 4628 // 4629 // For framework vfr compatibility 4630 // 4631 VOID SetCompatibleMode (IN BOOLEAN); 4632 >> 4633 } 4634 4635 << 4636 VOID 4637 EfiVfrParser::_SAVE_OPHDR_COND ( 4638 IN CIfrOpHeader &OpHdr, 4639 IN BOOLEAN Cond, 4640 IN UINT32 LineNo 4641 ) 4642 { 4643 if (Cond == TRUE) { 4644 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) { 4645 return ; 4646 } 4647 mCIfrOpHdr[mCIfrOpHdrIndex] = new CIfrOpHeader(OpHdr); 4648 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = LineNo; 4649 } 4650 } 4651 4652 VOID 4653 EfiVfrParser::_CLEAR_SAVED_OPHDR ( 4654 VOID 4655 ) 4656 { 4657 mCIfrOpHdr[mCIfrOpHdrIndex] = NULL; 4658 mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0; 4659 } 4660 4661 BOOLEAN 4662 EfiVfrParser::_SET_SAVED_OPHDR_SCOPE ( 4663 VOID 4664 ) 4665 { 4666 if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) { 4667 mCIfrOpHdr[mCIfrOpHdrIndex]->SetScope (1); 4668 return TRUE; 4669 } 4670 4671 // 4672 // IfrOpHdr is not set, FALSE is return. 4673 // 4674 return FALSE; 4675 } 4676 4677 VOID 4678 EfiVfrParser::_CRT_OP ( 4679 IN BOOLEAN Crt 4680 ) 4681 { 4682 gCreateOp = Crt; 4683 } 4684 4685 VOID 4686 EfiVfrParser::_SAVE_CURRQEST_VARINFO ( 4687 IN EFI_VARSTORE_INFO &Info 4688 ) 4689 { 4690 mCurrQestVarInfo = Info; 4691 } 4692 4693 EFI_VARSTORE_INFO & 4694 EfiVfrParser::_GET_CURRQEST_VARTINFO ( 4695 VOID 4696 ) 4697 { 4698 return mCurrQestVarInfo; 4699 } 4700 4701 UINT32 4702 EfiVfrParser::_GET_CURRQEST_ARRAY_SIZE ( 4703 VOID 4704 ) 4705 { 4706 UINT8 Size = 1; 4707 4708 switch (mCurrQestVarInfo.mVarType) { 4709 case EFI_IFR_TYPE_NUM_SIZE_8: 4710 Size = 1; 4711 break; 4712 4713 case EFI_IFR_TYPE_NUM_SIZE_16: 4714 Size = 2; 4715 break; 4716 4717 case EFI_IFR_TYPE_NUM_SIZE_32: 4718 Size = 4; 4719 break; 4720 4721 case EFI_IFR_TYPE_NUM_SIZE_64: 4722 Size = 8; 4723 break; 4724 4725 default: 4726 break; 4727 } 4728 4729 return (mCurrQestVarInfo.mVarTotalSize / Size); 4730 } 4731 4732 UINT8 4733 EfiVfrParser::_GET_CURRQEST_DATATYPE ( 4734 VOID 4735 ) 4736 { 4737 return mCurrQestVarInfo.mVarType; 4738 } 4739 4740 UINT32 4741 EfiVfrParser::_GET_CURRQEST_VARSIZE ( 4742 VOID 4743 ) 4744 { 4745 return mCurrQestVarInfo.mVarTotalSize; 4746 } 4747 4748 VOID 4749 EfiVfrParser::_PCATCH ( 4750 IN INTN ReturnCode, 4751 IN INTN ExpectCode, 4752 IN ANTLRTokenPtr Tok, 4753 IN CONST CHAR8 *ErrorMsg 4754 ) 4755 { 4756 if (ReturnCode != ExpectCode) { 4757 mParserStatus++; 4758 gCVfrErrorHandle.PrintMsg (Tok->getLine(), Tok->getText(), "Error", ErrorMsg); 4759 } 4760 } 4761 4762 VOID 4763 EfiVfrParser::_PCATCH ( 4764 IN EFI_VFR_RETURN_CODE ReturnCode 4765 ) 4766 { 4767 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode); 4768 } 4769 4770 VOID 4771 EfiVfrParser::_PCATCH ( 4772 IN EFI_VFR_RETURN_CODE ReturnCode, 4773 IN ANTLRTokenPtr Tok 4774 ) 4775 { 4776 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText()); 4777 } 4778 4779 VOID 4780 EfiVfrParser::_PCATCH ( 4781 IN EFI_VFR_RETURN_CODE ReturnCode, 4782 IN UINT32 LineNum 4783 ) 4784 { 4785 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum); 4786 } 4787 4788 VOID 4789 EfiVfrParser::_PCATCH ( 4790 IN EFI_VFR_RETURN_CODE ReturnCode, 4791 IN UINT32 LineNum, 4792 IN CONST CHAR8 *ErrorMsg 4793 ) 4794 { 4795 mParserStatus = mParserStatus + gCVfrErrorHandle.HandleError (ReturnCode, LineNum, (CHAR8 *) ErrorMsg); 4796 } 4797 4798 VOID 4799 EfiVfrParser::syn ( 4800 ANTLRAbstractToken *Tok, 4801 ANTLRChar *Egroup, 4802 SetWordType *Eset, 4803 ANTLRTokenType ETok, 4804 INT32 Huh 4805 ) 4806 { 4807 gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText()); 4808 4809 mParserStatus += 1; 4810 } 4811 4812 CHAR8 * 4813 EfiVfrParser::TrimHex ( 4814 IN CHAR8 *Str, 4815 OUT BOOLEAN *IsHex 4816 ) 4817 { 4818 *IsHex = FALSE; 4819 4820 while (*Str && *Str == ' ') { 4821 Str++; 4822 } 4823 while (*Str && *Str == '0') { 4824 Str++; 4825 } 4826 if (*Str && (*Str == 'x' || *Str == 'X')) { 4827 Str++; 4828 *IsHex = TRUE; 4829 } 4830 4831 return Str; 4832 } 4833 4834 CHAR8 * 4835 EfiVfrParser::_U32TOS ( 4836 IN UINT32 Value 4837 ) 4838 { 4839 CHAR8 *Str; 4840 Str = new CHAR8[20]; 4841 sprintf (Str, "%d", Value); 4842 return Str; 4843 } 4844 4845 UINT8 4846 EfiVfrParser::_STOU8 ( 4847 IN CHAR8 *Str, 4848 IN UINT32 LineNum 4849 ) 4850 { 4851 BOOLEAN IsHex; 4852 UINT8 Value; 4853 CHAR8 c; 4854 4855 UINT8 PreviousValue; 4856 CHAR8 *OrigString = Str; 4857 CHAR8 ErrorMsg[100]; 4858 4859 Str = TrimHex (Str, &IsHex); 4860 for (Value = 0; (c = *Str) != '\0'; Str++) { 4861 PreviousValue = Value; 4862 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10); 4863 4864 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) { 4865 Value += (c - 'a' + 10); 4866 } 4867 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) { 4868 Value += (c - 'A' + 10); 4869 } 4870 if (c >= '0' && c <= '9') { 4871 Value += (c - '0'); 4872 } 4873 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) { 4874 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT8", OrigString); 4875 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg); 4876 } 4877 } 4878 4879 return Value; 4880 } 4881 4882 UINT16 4883 EfiVfrParser::_STOU16 ( 4884 IN CHAR8 *Str, 4885 IN UINT32 LineNum 4886 ) 4887 { 4888 BOOLEAN IsHex; 4889 UINT16 Value; 4890 CHAR8 c; 4891 4892 UINT16 PreviousValue; 4893 CHAR8 *OrigString = Str; 4894 CHAR8 ErrorMsg[100]; 4895 4896 Str = TrimHex (Str, &IsHex); 4897 for (Value = 0; (c = *Str) != '\0'; Str++) { 4898 PreviousValue = Value; 4899 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10); 4900 4901 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) { 4902 Value += (c - 'a' + 10); 4903 } 4904 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) { 4905 Value += (c - 'A' + 10); 4906 } 4907 if (c >= '0' && c <= '9') { 4908 Value += (c - '0'); 4909 } 4910 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue))) { 4911 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT16", OrigString); 4912 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg); 4913 } 4914 } 4915 4916 return Value; 4917 } 4918 4919 UINT32 4920 EfiVfrParser::_STOU32 ( 4921 IN CHAR8 *Str, 4922 IN UINT32 LineNum 4923 ) 4924 { 4925 BOOLEAN IsHex; 4926 UINT32 Value; 4927 CHAR8 c; 4928 4929 UINT32 PreviousValue; 4930 CHAR8 *OrigString = Str; 4931 CHAR8 ErrorMsg[100]; 4932 4933 Str = TrimHex (Str, &IsHex); 4934 for (Value = 0; (c = *Str) != '\0'; Str++) { 4935 PreviousValue = Value; 4936 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10); 4937 4938 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) { 4939 Value += (c - 'a' + 10); 4940 } 4941 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) { 4942 Value += (c - 'A' + 10); 4943 } 4944 if (c >= '0' && c <= '9') { 4945 Value += (c - '0'); 4946 } 4947 if((IsHex && ((Value/16) != PreviousValue)) || (!IsHex && ((Value/10) != PreviousValue ))) { 4948 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT32", OrigString); 4949 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg); 4950 } 4951 } 4952 4953 return Value; 4954 } 4955 4956 UINT64 4957 EfiVfrParser::_STOU64 ( 4958 IN CHAR8 *Str, 4959 IN UINT32 LineNum 4960 ) 4961 { 4962 BOOLEAN IsHex; 4963 UINT64 Value; 4964 CHAR8 c; 4965 UINT64 PreviousValue; 4966 CHAR8 *OrigString = Str; 4967 CHAR8 ErrorMsg[100]; 4968 4969 Str = TrimHex (Str, &IsHex); 4970 for (Value = 0; (c = *Str) != '\0'; Str++) { 4971 PreviousValue = Value; 4972 (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10); 4973 4974 if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) { 4975 Value += (c - 'a' + 10); 4976 } 4977 if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) { 4978 Value += (c - 'A' + 10); 4979 } 4980 if (c >= '0' && c <= '9') { 4981 Value += (c - '0'); 4982 } 4983 if((IsHex && ((Value/16) != PreviousValue)) || ((!IsHex && (Value/10) != PreviousValue))) { 4984 sprintf(ErrorMsg, "Overflow: Value %s is too large to store in a UINT64", OrigString); 4985 gCVfrErrorHandle.HandleWarning (VFR_WARNING_STRING_TO_UINT_OVERFLOW, LineNum, ErrorMsg); 4986 } 4987 } 4988 4989 return Value; 4990 } 4991 4992 EFI_HII_DATE 4993 EfiVfrParser::_STOD ( 4994 IN CHAR8 *Year, 4995 IN CHAR8 *Month, 4996 IN CHAR8 *Day, 4997 IN UINT32 LineNum 4998 ) 4999 { 5000 EFI_HII_DATE Date; 5001 5002 Date.Year = _STOU16 (Year, LineNum); 5003 Date.Month = _STOU8 (Month, LineNum); 5004 Date.Day = _STOU8 (Day, LineNum); 5005 5006 return Date; 5007 } 5008 5009 EFI_HII_TIME 5010 EfiVfrParser::_STOT ( 5011 IN CHAR8 *Hour, 5012 IN CHAR8 *Minute, 5013 IN CHAR8 *Second, 5014 IN UINT32 LineNum 5015 ) 5016 { 5017 EFI_HII_TIME Time; 5018 5019 Time.Hour = _STOU8 (Hour, LineNum); 5020 Time.Minute = _STOU8 (Minute, LineNum); 5021 Time.Second = _STOU8 (Second, LineNum); 5022 5023 return Time; 5024 } 5025 5026 EFI_STRING_ID 5027 EfiVfrParser::_STOSID ( 5028 IN CHAR8 *Str, 5029 IN UINT32 LineNum 5030 ) 5031 { 5032 return (EFI_STRING_ID)_STOU16(Str, LineNum); 5033 } 5034 5035 EFI_FORM_ID 5036 EfiVfrParser::_STOFID ( 5037 IN CHAR8 *Str, 5038 IN UINT32 LineNum 5039 ) 5040 { 5041 return (EFI_FORM_ID)_STOU16(Str, LineNum); 5042 } 5043 5044 EFI_QUESTION_ID 5045 EfiVfrParser::_STOQID ( 5046 IN CHAR8 *Str, 5047 IN UINT32 LineNum 5048 ) 5049 { 5050 return (EFI_QUESTION_ID)_STOU16(Str, LineNum); 5051 } 5052 5053 VOID 5054 EfiVfrParser::_STRCAT ( 5055 IN OUT CHAR8 **Dest, 5056 IN CONST CHAR8 *Src 5057 ) 5058 { 5059 CHAR8 *NewStr; 5060 UINT32 Len; 5061 5062 if ((Dest == NULL) || (Src == NULL)) { 5063 return; 5064 } 5065 5066 Len = (*Dest == NULL) ? 0 : strlen (*Dest); 5067 Len += strlen (Src); 5068 if ((NewStr = new CHAR8[Len + 1]) == NULL) { 5069 return; 5070 } 5071 NewStr[0] = '\0'; 5072 if (*Dest != NULL) { 5073 strcpy (NewStr, *Dest); 5074 delete *Dest; 5075 } 5076 strcat (NewStr, Src); 5077 5078 *Dest = NewStr; 5079 } 5080 5081 EFI_HII_REF 5082 EfiVfrParser::_STOR ( 5083 IN CHAR8 *QuestionId, 5084 IN CHAR8 *FormId, 5085 IN EFI_GUID *FormSetGuid, 5086 IN CHAR8 *DevicePath, 5087 IN UINT32 LineNum 5088 ) 5089 { 5090 EFI_HII_REF Ref; 5091 UINT32 Index; 5092 5093 memcpy (&Ref.FormSetGuid, FormSetGuid, sizeof (EFI_GUID)); 5094 Ref.QuestionId = _STOQID (QuestionId, LineNum); 5095 Ref.FormId = _STOFID (FormId, LineNum); 5096 Ref.DevicePath = _STOSID (DevicePath, LineNum); 5097 5098 return Ref; 5099 } 5100 5101 // 5102 // framework vfr to default declare varstore for each structure 5103 // 5104 VOID 5105 EfiVfrParser::_DeclareDefaultFrameworkVarStore ( 5106 IN UINT32 LineNo 5107 ) 5108 { 5109 SVfrVarStorageNode *pNode; 5110 UINT32 TypeSize; 5111 BOOLEAN FirstNode; 5112 CONST CHAR8 VarName[] = "Setup"; 5113 5114 FirstNode = TRUE; 5115 pNode = mCVfrDataStorage.GetBufferVarStoreList(); 5116 if (pNode == NULL && gCVfrVarDataTypeDB.mFirstNewDataTypeName != NULL) { 5117 // 5118 // Create the default Buffer Var Store when no VarStore is defined. 5119 // its name should be "Setup" 5120 // 5121 gCVfrVarDataTypeDB.GetDataTypeSize (gCVfrVarDataTypeDB.mFirstNewDataTypeName, &TypeSize); 5122 CIfrVarStore VSObj; 5123 VSObj.SetLineNo (LineNo); 5124 VSObj.SetVarStoreId (0x1); //the first and only one Buffer Var Store 5125 VSObj.SetSize ((UINT16) TypeSize); 5126 //VSObj.SetName (gCVfrVarDataTypeDB.mFirstNewDataTypeName); 5127 VSObj.SetName ((CHAR8 *) VarName); 5128 VSObj.SetGuid (&mFormsetGuid); 5129 #ifdef VFREXP_DEBUG 5130 printf ("Create the default VarStoreName is %s\n", gCVfrVarDataTypeDB.mFirstNewDataTypeName); 5131 #endif 5132 } else { 5133 for (; pNode != NULL; pNode = pNode->mNext) { 5134 // 5135 // create the default varstore opcode for not declared varstore 5136 // the first varstore name should be "Setup" 5137 // 5138 if (!pNode->mAssignedFlag) { 5139 CIfrVarStore VSObj; 5140 VSObj.SetLineNo (LineNo); 5141 VSObj.SetVarStoreId (pNode->mVarStoreId); 5142 VSObj.SetSize ((UINT16) pNode->mStorageInfo.mDataType->mTotalSize); 5143 if (FirstNode) { 5144 VSObj.SetName ((CHAR8 *) VarName); 5145 FirstNode = FALSE; 5146 } else { 5147 VSObj.SetName (pNode->mVarStoreName); 5148 } 5149 VSObj.SetGuid (&pNode->mGuid); 5150 #ifdef VFREXP_DEBUG 5151 printf ("undefined VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId); 5152 #endif 5153 } 5154 } 5155 } 5156 5157 pNode = mCVfrDataStorage.GetEfiVarStoreList(); 5158 for (; pNode != NULL; pNode = pNode->mNext) { 5159 // 5160 // create the default efi varstore opcode for not exist varstore 5161 // 5162 if (!pNode->mAssignedFlag) { 5163 CIfrVarStoreEfi VSEObj; 5164 VSEObj.SetLineNo (LineNo); 5165 VSEObj.SetAttributes (0x00000002); //hardcode EFI_VARIABLE_BOOTSERVICE_ACCESS attribute 5166 VSEObj.SetGuid (&pNode->mGuid); 5167 VSEObj.SetVarStoreId (pNode->mVarStoreId); 5168 // Generate old efi varstore storage structure for compatiable with old "VarEqVal" opcode, 5169 // which is 3 bytes less than new structure define in UEFI Spec 2.3.1. 5170 VSEObj.SetBinaryLength (sizeof (EFI_IFR_VARSTORE_EFI) - 3); 5171 #ifdef VFREXP_DEBUG 5172 printf ("undefined Efi VarStoreName is %s and Id is 0x%x\n", pNode->mVarStoreName, pNode->mVarStoreId); 5173 #endif 5174 } 5175 } 5176 5177 } 5178 5179 VOID 5180 EfiVfrParser::_DeclareDefaultLinearVarStore ( 5181 IN UINT32 LineNo 5182 ) 5183 { 5184 UINT32 Index; 5185 CHAR8 **TypeNameList; 5186 UINT32 ListSize; 5187 CONST CHAR8 DateName[] = "Date"; 5188 CONST CHAR8 TimeName[] = "Time"; 5189 CONST CHAR8 DateType[] = "EFI_HII_DATE"; 5190 CONST CHAR8 TimeType[] = "EFI_HII_TIME"; 5191 5192 gCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize); 5193 5194 for (Index = 0; Index < ListSize; Index++) { 5195 UINT32 Size; 5196 EFI_VARSTORE_ID VarStoreId; 5197 CIfrVarStore VSObj; 5198 5199 VSObj.SetLineNo (LineNo); 5200 mCVfrDataStorage.DeclareBufferVarStore ( 5201 TypeNameList[Index], 5202 &mFormsetGuid, 5203 &gCVfrVarDataTypeDB, 5204 TypeNameList[Index], 5205 EFI_VARSTORE_ID_INVALID 5206 ); 5207 mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId, &mFormsetGuid); 5208 VSObj.SetVarStoreId (VarStoreId); 5209 gCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size); 5210 VSObj.SetSize ((UINT16) Size); 5211 VSObj.SetName (TypeNameList[Index]); 5212 VSObj.SetGuid (&mFormsetGuid); 5213 } 5214 5215 // 5216 // not required to declare Date and Time VarStore, 5217 // because code to support old format Data and Time 5218 // 5219 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) DateName) == FALSE) { 5220 UINT32 Size; 5221 EFI_VARSTORE_ID VarStoreId; 5222 CIfrVarStore VSObj; 5223 5224 VSObj.SetLineNo (LineNo); 5225 mCVfrDataStorage.DeclareBufferVarStore ( 5226 (CHAR8 *) DateName, 5227 &mFormsetGuid, 5228 &gCVfrVarDataTypeDB, 5229 (CHAR8 *) DateType, 5230 EFI_VARSTORE_ID_INVALID 5231 ); 5232 mCVfrDataStorage.GetVarStoreId((CHAR8 *) DateName, &VarStoreId, &mFormsetGuid); 5233 VSObj.SetVarStoreId (VarStoreId); 5234 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) DateType, &Size); 5235 VSObj.SetSize ((UINT16) Size); 5236 VSObj.SetName ((CHAR8 *) DateName); 5237 VSObj.SetGuid (&mFormsetGuid); 5238 } 5239 5240 if (gCVfrVarDataTypeDB.IsTypeNameDefined ((CHAR8 *) TimeName) == FALSE) { 5241 UINT32 Size; 5242 EFI_VARSTORE_ID VarStoreId; 5243 CIfrVarStore VSObj; 5244 5245 VSObj.SetLineNo (LineNo); 5246 mCVfrDataStorage.DeclareBufferVarStore ( 5247 (CHAR8 *) TimeName, 5248 &mFormsetGuid, 5249 &gCVfrVarDataTypeDB, 5250 (CHAR8 *) TimeType, 5251 EFI_VARSTORE_ID_INVALID 5252 ); 5253 mCVfrDataStorage.GetVarStoreId((CHAR8 *) TimeName, &VarStoreId, &mFormsetGuid); 5254 VSObj.SetVarStoreId (VarStoreId); 5255 gCVfrVarDataTypeDB.GetDataTypeSize((CHAR8 *) TimeType, &Size); 5256 VSObj.SetSize ((UINT16) Size); 5257 VSObj.SetName ((CHAR8 *) TimeName); 5258 VSObj.SetGuid (&mFormsetGuid); 5259 } 5260 } 5261 5262 VOID 5263 EfiVfrParser::_DeclareStandardDefaultStorage ( 5264 IN UINT32 LineNo 5265 ) 5266 { 5267 // 5268 // Default Store is declared. 5269 // 5270 CIfrDefaultStore DSObj; 5271 5272 mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), (CHAR8 *) "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD); 5273 DSObj.SetLineNo (LineNo); 5274 DSObj.SetDefaultName (EFI_STRING_ID_INVALID); 5275 DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD); 5276 5277 // 5278 // Default MANUFACTURING Store is declared. 5279 // 5280 CIfrDefaultStore DSObjMF; 5281 5282 mCVfrDefaultStore.RegisterDefaultStore (DSObjMF.GetObjBinAddr(), (CHAR8 *) "Standard ManuFacturing", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_MANUFACTURING); 5283 DSObjMF.SetLineNo (LineNo); 5284 DSObjMF.SetDefaultName (EFI_STRING_ID_INVALID); 5285 DSObjMF.SetDefaultId (EFI_HII_DEFAULT_CLASS_MANUFACTURING); 5286 } 5287 5288 VOID 5289 EfiVfrParser::AssignQuestionKey ( 5290 IN CIfrQuestionHeader &QHObj, 5291 IN ANTLRTokenPtr KeyTok 5292 ) 5293 { 5294 UINT16 KeyValue; 5295 5296 if (KeyTok == NULL) { 5297 return; 5298 } 5299 5300 KeyValue = _STOU16 (KeyTok->getText(), KeyTok->getLine()); 5301 5302 if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) { 5303 /* 5304 * if the question is not CALLBACK ignore the key. 5305 */ 5306 _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok); 5307 QHObj.SetQuestionId (KeyValue); 5308 } 5309 } 5310 5311 VOID 5312 EfiVfrParser::ConvertIdExpr ( 5313 IN UINT32 &ExpOpCount, 5314 IN UINT32 LineNo, 5315 IN EFI_QUESTION_ID QId, 5316 IN CHAR8 *VarIdStr, 5317 IN UINT32 BitMask 5318 ) 5319 { 5320 CIfrQuestionRef1 QR1Obj(LineNo); 5321 QR1Obj.SetQuestionId (QId, VarIdStr, LineNo); 5322 _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0)); 5323 5324 if (BitMask != 0) { 5325 CIfrUint32 U32Obj(LineNo); 5326 U32Obj.SetValue (BitMask); 5327 5328 CIfrBitWiseAnd BWAObj(LineNo); 5329 5330 CIfrUint8 U8Obj(LineNo); 5331 switch (BitMask) { 5332 case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break; 5333 case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break; 5334 case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break; 5335 case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break; 5336 case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break; 5337 } 5338 5339 CIfrShiftRight SRObj(LineNo); 5340 } 5341 5342 ExpOpCount += 4; 5343 } 5344 5345 VOID 5346 EfiVfrParser::IdEqValDoSpecial ( 5347 IN UINT32 &ExpOpCount, 5348 IN UINT32 LineNo, 5349 IN EFI_QUESTION_ID QId, 5350 IN CHAR8 *VarIdStr, 5351 IN UINT32 BitMask, 5352 IN UINT16 ConstVal, 5353 IN EFI_COMPARE_TYPE CompareType 5354 ) 5355 { 5356 ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask); 5357 5358 if (ConstVal > 0xFF) { 5359 CIfrUint16 U16Obj(LineNo); 5360 U16Obj.SetValue (ConstVal); 5361 } else { 5362 CIfrUint8 U8Obj(LineNo); 5363 U8Obj.SetValue ((UINT8)ConstVal); 5364 } 5365 5366 switch (CompareType) { 5367 case EQUAL : 5368 { 5369 CIfrEqual EObj(LineNo); 5370 break; 5371 } 5372 case LESS_EQUAL : 5373 { 5374 CIfrLessEqual LEObj(LineNo); 5375 break; 5376 } 5377 case LESS_THAN : 5378 { 5379 CIfrLessThan LTObj(LineNo); 5380 break; 5381 } 5382 case GREATER_EQUAL : 5383 { 5384 CIfrGreaterEqual GEObj(LineNo); 5385 break; 5386 } 5387 case GREATER_THAN : 5388 { 5389 CIfrGreaterThan GTObj(LineNo); 5390 break; 5391 } 5392 } 5393 5394 ExpOpCount += 2; 5395 } 5396 5397 VOID 5398 EfiVfrParser::IdEqIdDoSpecial ( 5399 IN UINT32 &ExpOpCount, 5400 IN UINT32 LineNo, 5401 IN EFI_QUESTION_ID QId1, 5402 IN CHAR8 *VarId1Str, 5403 IN UINT32 BitMask1, 5404 IN EFI_QUESTION_ID QId2, 5405 IN CHAR8 *VarId2Str, 5406 IN UINT32 BitMask2, 5407 IN EFI_COMPARE_TYPE CompareType 5408 ) 5409 { 5410 ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1); 5411 ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2); 5412 5413 switch (CompareType) { 5414 case EQUAL : 5415 { 5416 CIfrEqual EObj(LineNo); 5417 break; 5418 } 5419 case LESS_EQUAL : 5420 { 5421 CIfrLessEqual LEObj(LineNo); 5422 break; 5423 } 5424 case LESS_THAN : 5425 { 5426 CIfrLessThan LTObj(LineNo); 5427 break; 5428 } 5429 case GREATER_EQUAL : 5430 { 5431 CIfrGreaterEqual GEObj(LineNo); 5432 break; 5433 } 5434 case GREATER_THAN : 5435 { 5436 CIfrGreaterThan GTObj(LineNo); 5437 break; 5438 } 5439 } 5440 5441 ExpOpCount++; 5442 } 5443 5444 VOID 5445 EfiVfrParser::IdEqListDoSpecial ( 5446 IN UINT32 &ExpOpCount, 5447 IN UINT32 LineNo, 5448 IN EFI_QUESTION_ID QId, 5449 IN CHAR8 *VarIdStr, 5450 IN UINT32 BitMask, 5451 IN UINT16 ListLen, 5452 IN UINT16 *ValueList 5453 ) 5454 { 5455 UINT16 Index; 5456 5457 if (ListLen == 0) { 5458 return; 5459 } 5460 5461 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL); 5462 for (Index = 1; Index < ListLen; Index++) { 5463 IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL); 5464 CIfrOr OObj (LineNo); 5465 ExpOpCount++; 5466 } 5467 } 5468 5469 VOID 5470 EfiVfrParser::SetOverrideClassGuid (IN EFI_GUID *OverrideClassGuid) 5471 { 5472 mOverrideClassGuid = OverrideClassGuid; 5473 } 5474 5475 // 5476 // For framework vfr compatibility 5477 // 5478 VOID 5479 EfiVfrParser::SetCompatibleMode (IN BOOLEAN Mode) 5480 { 5481 mCompatibleMode = Mode; 5482 mCVfrQuestionDB.SetCompatibleMode (Mode); 5483 } 5484 5485 VOID 5486 EfiVfrParser::CheckDuplicateDefaultValue ( 5487 IN EFI_DEFAULT_ID DefaultId, 5488 IN ANTLRTokenPtr Tok 5489 ) 5490 { 5491 UINT16 Index; 5492 5493 for(Index = 0; Index < mUsedDefaultCount; Index++) { 5494 if (mUsedDefaultArray[Index] == DefaultId) { 5495 gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText()); 5496 } 5497 } 5498 5499 if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) { 5500 gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText()); 5501 } 5502 5503 mUsedDefaultArray[mUsedDefaultCount++] = DefaultId; 5504 } 5505 >> 5506