VfrSyntax.g 314 KB

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