]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.cpp
Add the missing BDS license header.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / UefiVfrCompile / VfrFormPkg.cpp
CommitLineData
5b19df7f
LG
1/*++\r
2\r
3Copyright (c) 2004 - 2010, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14VfrFormPkg.cpp\r
15\r
16Abstract:\r
17\r
18--*/\r
19\r
95d675b5 20#include "stdio.h"\r
21#include "VfrFormPkg.h"\r
22\r
23/*\r
24 * The definition of CFormPkg's member function\r
25 */\r
26\r
27SPendingAssign::SPendingAssign (\r
28 IN INT8 *Key, \r
29 IN VOID *Addr, \r
30 IN UINT32 Len, \r
31 IN UINT32 LineNo\r
32 )\r
33{\r
34 if (Key != NULL) {\r
35 mKey = new INT8[strlen (Key) + 1];\r
36 if (mKey != NULL) {\r
37 strcpy (mKey, Key);\r
38 }\r
39 } else {\r
40 mKey = NULL;\r
41 }\r
42 mAddr = Addr;\r
43 mLen = Len;\r
44 mFlag = PENDING;\r
45 mLineNo = LineNo;\r
46 mNext = NULL;\r
47}\r
48\r
49SPendingAssign::~SPendingAssign (\r
50 VOID\r
51 )\r
52{\r
53 if (mKey != NULL) {\r
54 delete mKey;\r
55 }\r
56 mAddr = NULL;\r
57 mLen = 0;\r
58 mLineNo = 0;\r
59 mNext = NULL;\r
60}\r
61\r
62VOID\r
63SPendingAssign::SetAddrAndLen (\r
64 IN VOID *Addr, \r
65 IN UINT32 LineNo\r
66 )\r
67{\r
68 mAddr = Addr;\r
69 mLineNo = LineNo;\r
70}\r
71\r
72VOID\r
73SPendingAssign::AssignValue (\r
74 IN VOID *Addr, \r
75 IN UINT32 Len\r
76 )\r
77{\r
78 memcpy (mAddr, Addr, (mLen < Len ? mLen : Len));\r
79 mFlag = ASSIGNED;\r
80}\r
81\r
82INT8 *\r
83SPendingAssign::GetKey (\r
84 VOID\r
85 )\r
86{\r
87 return mKey;\r
88}\r
89\r
90CFormPkg::CFormPkg (\r
91 IN UINT32 BufferSize = 4096\r
92 )\r
93{\r
94 CHAR8 *BufferStart;\r
95 CHAR8 *BufferEnd;\r
96 SBufferNode *Node;\r
97\r
98 mPkgLength = 0;\r
99 mBufferNodeQueueHead = NULL;\r
100 mCurrBufferNode = NULL;\r
101\r
102 Node = new SBufferNode;\r
103 if (Node == NULL) {\r
104 return ;\r
105 }\r
106 BufferStart = new CHAR8[BufferSize];\r
107 if (BufferStart == NULL) {\r
108 return;\r
109 }\r
110 BufferEnd = BufferStart + BufferSize;\r
111\r
112 memset (BufferStart, 0, BufferSize);\r
113 Node->mBufferStart = BufferStart;\r
114 Node->mBufferEnd = BufferEnd;\r
115 Node->mBufferFree = BufferStart;\r
116 Node->mNext = NULL;\r
117\r
118 mBufferSize = BufferSize;\r
119 mBufferNodeQueueHead = Node;\r
120 mBufferNodeQueueTail = Node;\r
121 mCurrBufferNode = Node;\r
122}\r
123\r
124CFormPkg::~CFormPkg ()\r
125{\r
126 SBufferNode *pBNode;\r
127 SPendingAssign *pPNode;\r
128\r
129 while (mBufferNodeQueueHead != NULL) {\r
130 pBNode = mBufferNodeQueueHead;\r
131 mBufferNodeQueueHead = mBufferNodeQueueHead->mNext;\r
132 if (pBNode->mBufferStart != NULL) {\r
133 delete pBNode->mBufferStart;\r
134 delete pBNode;\r
135 }\r
136 }\r
137 mBufferNodeQueueTail = NULL;\r
138 mCurrBufferNode = NULL;\r
139\r
140 while (PendingAssignList != NULL) {\r
141 pPNode = PendingAssignList;\r
142 PendingAssignList = PendingAssignList->mNext;\r
143 delete pPNode;\r
144 }\r
145 PendingAssignList = NULL;\r
146}\r
147\r
148CHAR8 *\r
149CFormPkg::IfrBinBufferGet (\r
150 IN UINT32 Len\r
151 )\r
152{\r
153 CHAR8 *BinBuffer = NULL;\r
154\r
155 if ((Len == 0) || (Len > mBufferSize)) {\r
156 return NULL;\r
157 }\r
158\r
159 if ((mCurrBufferNode->mBufferFree + Len) <= mCurrBufferNode->mBufferEnd) {\r
160 BinBuffer = mCurrBufferNode->mBufferFree;\r
161 mCurrBufferNode->mBufferFree += Len;\r
162 } else {\r
163 SBufferNode *Node;\r
164\r
165 Node = new SBufferNode;\r
166 if (Node == NULL) {\r
167 return NULL;\r
168 }\r
169\r
170 Node->mBufferStart = new CHAR8[mBufferSize];\r
171 if (Node->mBufferStart == NULL) {\r
172 delete Node;\r
173 return NULL;\r
174 } else {\r
175 memset (Node->mBufferStart, 0, mBufferSize);\r
176 Node->mBufferEnd = Node->mBufferStart + mBufferSize;\r
177 Node->mBufferFree = Node->mBufferStart;\r
178 Node->mNext = NULL;\r
179 }\r
180\r
181 if (mBufferNodeQueueTail == NULL) {\r
182 mBufferNodeQueueHead = mBufferNodeQueueTail = Node;\r
183 } else {\r
184 mBufferNodeQueueTail->mNext = Node;\r
185 mBufferNodeQueueTail = Node;\r
186 }\r
187 mCurrBufferNode = Node;\r
188\r
189 //\r
190 // Now try again.\r
191 //\r
192 BinBuffer = mCurrBufferNode->mBufferFree;\r
193 mCurrBufferNode->mBufferFree += Len;\r
194 }\r
195\r
196 mPkgLength += Len;\r
197\r
198 return BinBuffer;\r
199}\r
200\r
201inline\r
202UINT32\r
203CFormPkg::GetPkgLength (\r
204 VOID\r
205 )\r
206{\r
207 return mPkgLength;\r
208}\r
209\r
210VOID\r
211CFormPkg::Open (\r
212 VOID\r
213 )\r
214{\r
215 mReadBufferNode = mBufferNodeQueueHead;\r
216 mReadBufferOffset = 0;\r
217}\r
218\r
219VOID\r
220CFormPkg::Close (\r
221 VOID\r
222 )\r
223{\r
224 mReadBufferNode = NULL;\r
225 mReadBufferOffset = 0;\r
226}\r
227\r
228UINT32\r
229CFormPkg::Read (\r
230 IN CHAR8 *Buffer, \r
231 IN UINT32 Size\r
232 )\r
233{\r
234 UINT32 Index;\r
235\r
236 if ((Size == 0) || (Buffer == NULL)) {\r
237 return 0;\r
238 }\r
239\r
240 if (mReadBufferNode == NULL) {\r
241 return 0;\r
242 }\r
243\r
244 for (Index = 0; Index < Size; Index++) {\r
245 if ((mReadBufferNode->mBufferStart + mReadBufferOffset) < mReadBufferNode->mBufferFree) {\r
246 Buffer[Index] = mReadBufferNode->mBufferStart[mReadBufferOffset++];\r
247 } else {\r
248 if ((mReadBufferNode = mReadBufferNode->mNext) == NULL) {\r
249 return Index;\r
250 } else {\r
251 mReadBufferOffset = 0;\r
252 Buffer[Index] = mReadBufferNode->mBufferStart[mReadBufferOffset++];\r
253 }\r
254 }\r
255 }\r
256\r
257 return Size;\r
258}\r
259\r
260EFI_VFR_RETURN_CODE\r
261CFormPkg::BuildPkgHdr (\r
262 OUT EFI_HII_PACKAGE_HEADER **PkgHdr\r
263 )\r
264{\r
265 if (PkgHdr == NULL) {\r
266 return VFR_RETURN_FATAL_ERROR;\r
267 }\r
268\r
269 if (((*PkgHdr) = new EFI_HII_PACKAGE_HEADER) == NULL) {\r
270 return VFR_RETURN_OUT_FOR_RESOURCES;\r
271 }\r
272\r
273 (*PkgHdr)->Type = EFI_HII_PACKAGE_FORM;\r
274 (*PkgHdr)->Length = mPkgLength + sizeof (EFI_HII_PACKAGE_HEADER);\r
275 return VFR_RETURN_SUCCESS;\r
276}\r
277\r
278EFI_VFR_RETURN_CODE\r
279CFormPkg::BuildPkg (\r
280 IN FILE *Output\r
281 )\r
282{\r
283 EFI_VFR_RETURN_CODE Ret;\r
284 CHAR8 Buffer[1024];\r
285 UINT32 Size;\r
286 EFI_HII_PACKAGE_HEADER *PkgHdr;\r
287\r
288 if (Output == NULL) {\r
289 return VFR_RETURN_FATAL_ERROR;\r
290 }\r
291\r
292 if ((Ret = BuildPkgHdr(&PkgHdr)) != VFR_RETURN_SUCCESS) {\r
293 return Ret;\r
294 }\r
295 fwrite (PkgHdr, sizeof (EFI_HII_PACKAGE_HEADER), 1, Output);\r
296 delete PkgHdr;\r
297\r
298 Open ();\r
299 while ((Size = Read (Buffer, 1024)) != 0) {\r
300 fwrite (Buffer, Size, 1, Output);\r
301 }\r
302 Close ();\r
303\r
304 return VFR_RETURN_SUCCESS;\r
305}\r
306\r
307VOID\r
308CFormPkg::_WRITE_PKG_LINE (\r
309 IN FILE *pFile,\r
310 IN UINT32 LineBytes,\r
311 IN INT8 *LineHeader,\r
312 IN INT8 *BlkBuf,\r
313 IN UINT32 BlkSize\r
314 )\r
315{\r
316 UINT32 Index;\r
317\r
318 if ((pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
319 return;\r
320 }\r
321\r
322 for (Index = 0; Index < BlkSize; Index++) {\r
323 if ((Index % LineBytes) == 0) {\r
324 fprintf (pFile, "\n%s", LineHeader);\r
325 }\r
326 fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);\r
327 }\r
328}\r
329\r
330VOID\r
331CFormPkg::_WRITE_PKG_END (\r
332 IN FILE *pFile,\r
333 IN UINT32 LineBytes,\r
334 IN INT8 *LineHeader,\r
335 IN INT8 *BlkBuf,\r
336 IN UINT32 BlkSize\r
337 )\r
338{\r
339 UINT32 Index;\r
340\r
341 if ((BlkSize == 0) || (pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
342 return;\r
343 }\r
344\r
345 for (Index = 0; Index < BlkSize - 1; Index++) {\r
346 if ((Index % LineBytes) == 0) {\r
347 fprintf (pFile, "\n%s", LineHeader);\r
348 }\r
349 fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);\r
350 }\r
351\r
352 if ((Index % LineBytes) == 0) {\r
353 fprintf (pFile, "\n%s", LineHeader);\r
354 }\r
355 fprintf (pFile, "0x%02X\n", (UINT8)BlkBuf[Index]);\r
356}\r
357\r
358#define BYTES_PRE_LINE 0x10\r
359\r
360EFI_VFR_RETURN_CODE \r
361CFormPkg::GenCFile (\r
362 IN INT8 *BaseName,\r
363 IN FILE *pFile\r
364 )\r
365{\r
366 EFI_VFR_RETURN_CODE Ret;\r
367 INT8 Buffer[BYTES_PRE_LINE * 8];\r
368 EFI_HII_PACKAGE_HEADER *PkgHdr;\r
369 UINT32 PkgLength = 0;\r
370 UINT32 ReadSize = 0;\r
371\r
372 if ((BaseName == NULL) || (pFile == NULL)) {\r
373 return VFR_RETURN_FATAL_ERROR;\r
374 }\r
375\r
376 fprintf (pFile, "\nunsigned char %sBin[] = {\n", BaseName);\r
377\r
378 if ((Ret = BuildPkgHdr(&PkgHdr)) != VFR_RETURN_SUCCESS) {\r
379 return Ret;\r
380 }\r
381\r
382 fprintf (pFile, " // ARRAY LENGTH\n");\r
383 PkgLength = PkgHdr->Length + sizeof (UINT32);\r
384 _WRITE_PKG_LINE(pFile, BYTES_PRE_LINE, " ", (INT8 *)&PkgLength, sizeof (UINT32));\r
385\r
386 fprintf (pFile, "\n\n // PACKAGE HEADER\n");\r
387 _WRITE_PKG_LINE(pFile, BYTES_PRE_LINE, " ", (INT8 *)PkgHdr, sizeof (EFI_HII_PACKAGE_HEADER));\r
388 PkgLength = sizeof (EFI_HII_PACKAGE_HEADER);\r
389\r
390 fprintf (pFile, "\n\n // PACKAGE DATA\n");\r
391 Open ();\r
392 while ((ReadSize = Read ((CHAR8 *)Buffer, BYTES_PRE_LINE * 8)) != 0) {\r
393 PkgLength += ReadSize;\r
394 if (PkgLength < PkgHdr->Length) {\r
395 _WRITE_PKG_LINE (pFile, BYTES_PRE_LINE, " ", Buffer, ReadSize);\r
396 } else {\r
397 _WRITE_PKG_END (pFile, BYTES_PRE_LINE, " ", Buffer, ReadSize);\r
398 }\r
399 }\r
400 Close ();\r
401\r
402 delete PkgHdr;\r
403 fprintf (pFile, "\n};\n");\r
404\r
405 return VFR_RETURN_SUCCESS;\r
406}\r
407\r
408EFI_VFR_RETURN_CODE\r
409CFormPkg::AssignPending (\r
410 IN INT8 *Key, \r
411 IN VOID *ValAddr, \r
412 IN UINT32 ValLen,\r
413 IN UINT32 LineNo\r
414 )\r
415{\r
416 SPendingAssign *pNew;\r
417\r
418 pNew = new SPendingAssign (Key, ValAddr, ValLen, LineNo);\r
419 if (pNew == NULL) {\r
420 return VFR_RETURN_OUT_FOR_RESOURCES;\r
421 }\r
422\r
423 pNew->mNext = PendingAssignList;\r
424 PendingAssignList = pNew;\r
425 return VFR_RETURN_SUCCESS;\r
426}\r
427\r
428VOID\r
429CFormPkg::DoPendingAssign (\r
430 IN INT8 *Key, \r
431 IN VOID *ValAddr, \r
432 IN UINT32 ValLen\r
433 )\r
434{\r
435 SPendingAssign *pNode;\r
436\r
437 if ((Key == NULL) || (ValAddr == NULL)) {\r
438 return;\r
439 }\r
440\r
441 for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
442 if (strcmp (pNode->mKey, Key) == 0) {\r
443 pNode->AssignValue (ValAddr, ValLen);\r
444 }\r
445 }\r
446}\r
447\r
448bool\r
449CFormPkg::HavePendingUnassigned (\r
450 VOID\r
451 )\r
452{\r
453 SPendingAssign *pNode;\r
454\r
455 for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
456 if (pNode->mFlag == PENDING) {\r
457 return TRUE;\r
458 }\r
459 }\r
460\r
461 return FALSE;\r
462}\r
463\r
464VOID\r
465CFormPkg::PendingAssignPrintAll (\r
466 VOID\r
467 )\r
468{\r
469 SPendingAssign *pNode;\r
470\r
471 for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
472 if (pNode->mFlag == PENDING) {\r
473 gCVfrErrorHandle.PrintError (pNode->mLineNo, pNode->mKey, "can not assign value because not defined");\r
474 }\r
475 }\r
476}\r
477\r
478CFormPkg gCFormPkg;\r
479\r
480SIfrRecord::SIfrRecord (\r
481 VOID\r
482 )\r
483{\r
484 mIfrBinBuf = NULL;\r
485 mBinBufLen = 0;\r
486 mLineNo = 0xFFFFFFFF;\r
487 mOffset = 0xFFFFFFFF;\r
488 mNext = NULL;\r
489}\r
490\r
491SIfrRecord::~SIfrRecord (\r
492 VOID\r
493 )\r
494{\r
495 if (mIfrBinBuf != NULL) {\r
496 delete mIfrBinBuf;\r
497 mIfrBinBuf = NULL;\r
498 }\r
499 mLineNo = 0xFFFFFFFF;\r
500 mOffset = 0xFFFFFFFF;\r
501 mBinBufLen = 0;\r
502 mNext = NULL;\r
503}\r
504\r
505CIfrRecordInfoDB::CIfrRecordInfoDB (\r
506 VOID\r
507 )\r
508{\r
509 mSwitch = FALSE;\r
510 mRecordCount = EFI_IFR_RECORDINFO_IDX_START;\r
511 mIfrRecordListHead = NULL;\r
512 mIfrRecordListTail = NULL;\r
513}\r
514\r
515CIfrRecordInfoDB::~CIfrRecordInfoDB (\r
516 VOID\r
517 )\r
518{\r
519 SIfrRecord *pNode;\r
520\r
521 while (mIfrRecordListHead != NULL) {\r
522 pNode = mIfrRecordListHead;\r
523 mIfrRecordListHead = mIfrRecordListHead->mNext;\r
524 delete pNode;\r
525 }\r
526}\r
527\r
528SIfrRecord *\r
529CIfrRecordInfoDB::GetRecordInfoFromIdx (\r
530 IN UINT32 RecordIdx\r
531 )\r
532{\r
533 UINT32 Idx;\r
534 SIfrRecord *pNode = NULL;\r
535\r
536 if (RecordIdx == EFI_IFR_RECORDINFO_IDX_INVALUD) {\r
537 return NULL;\r
538 }\r
539\r
540 for (Idx = (EFI_IFR_RECORDINFO_IDX_START + 1), pNode = mIfrRecordListHead; \r
541 (Idx != RecordIdx) && (pNode != NULL); \r
542 Idx++, pNode = pNode->mNext)\r
543 ;\r
544\r
545 return pNode;\r
546}\r
547\r
548UINT32\r
549CIfrRecordInfoDB::IfrRecordRegister (\r
550 IN UINT32 LineNo, \r
551 IN CHAR8 *IfrBinBuf, \r
552 IN UINT8 BinBufLen,\r
553 IN UINT32 Offset\r
554 )\r
555{\r
556 SIfrRecord *pNew;\r
557\r
558 if (mSwitch == FALSE) {\r
559 return EFI_IFR_RECORDINFO_IDX_INVALUD;\r
560 }\r
561\r
562 if ((pNew = new SIfrRecord) == NULL) {\r
563 return EFI_IFR_RECORDINFO_IDX_INVALUD;\r
564 }\r
565\r
566 if (mIfrRecordListHead == NULL) {\r
567 mIfrRecordListHead = pNew;\r
568 mIfrRecordListTail = pNew;\r
569 } else {\r
570 mIfrRecordListTail->mNext = pNew;\r
571 mIfrRecordListTail = pNew;\r
572 }\r
573 mRecordCount++;\r
574\r
575 return mRecordCount;\r
576}\r
577\r
578VOID\r
579CIfrRecordInfoDB::IfrRecordInfoUpdate (\r
580 IN UINT32 RecordIdx, \r
581 IN UINT32 LineNo,\r
582 IN CHAR8 *BinBuf,\r
583 IN UINT8 BinBufLen,\r
584 IN UINT32 Offset\r
585 )\r
586{\r
587 SIfrRecord *pNode;\r
588\r
589 if ((pNode = GetRecordInfoFromIdx (RecordIdx)) == NULL) {\r
590 return;\r
591 }\r
592\r
593 pNode->mLineNo = LineNo;\r
594 pNode->mOffset = Offset;\r
595 pNode->mBinBufLen = BinBufLen;\r
596 if (BinBuf != NULL) {\r
597 if (pNode->mIfrBinBuf != NULL) {\r
598 delete pNode->mIfrBinBuf;\r
599 }\r
600 pNode->mIfrBinBuf = new CHAR8[BinBufLen];\r
601 if (pNode->mIfrBinBuf != NULL) {\r
602 memcpy (pNode->mIfrBinBuf, BinBuf, BinBufLen);\r
603 }\r
604 }\r
605}\r
606\r
607VOID\r
608CIfrRecordInfoDB::IfrRecordOutput (\r
609 IN FILE *File,\r
610 IN UINT32 LineNo\r
611 )\r
612{\r
613 SIfrRecord *pNode;\r
614 UINT8 Index;\r
615\r
616 if (mSwitch == FALSE) {\r
617 return;\r
618 }\r
619\r
620 if (File == NULL) {\r
621 return;\r
622 }\r
623\r
624 for (pNode = mIfrRecordListHead; pNode != NULL; pNode = pNode->mNext) {\r
625 if (pNode->mLineNo == LineNo) {\r
626 fprintf (File, ">%08X: ", pNode->mOffset);\r
627 if (pNode->mIfrBinBuf != NULL) {\r
628 for (Index = 0; Index < pNode->mBinBufLen; Index++) {\r
629 fprintf (File, "%02X ", pNode->mIfrBinBuf[Index]);\r
630 }\r
631 }\r
632 fprintf (File, "\n");\r
633 }\r
634 }\r
635}\r
636\r
637CIfrRecordInfoDB gCIfrRecordInfoDB;\r
638\r
639VOID\r
640CIfrObj::_EMIT_PENDING_OBJ (\r
641 VOID\r
642 )\r
643{\r
644 CHAR8 *ObjBinBuf = NULL;\r
645\r
646 ObjBinBuf = gCFormPkg.IfrBinBufferGet (mObjBinLen);\r
647 if (ObjBinBuf != NULL) {\r
648 memcpy (ObjBinBuf, mObjBinBuf, mObjBinLen);\r
649 }\r
650\r
651 if (mObjBinBuf != NULL) {\r
652 delete mObjBinBuf;\r
653 }\r
654}\r
655\r
656/*\r
657 * The definition of CIfrObj's member function\r
658 */\r
659static struct {\r
660 UINT8 mSize;\r
661 UINT8 mScope;\r
662} gOpcodeSizesScopeTable[] = {\r
663 { 0, 0 }, // EFI_IFR_INVALID - 0x00\r
664 { sizeof (EFI_IFR_FORM), 1 }, // EFI_IFR_FORM_OP\r
665 { sizeof (EFI_IFR_SUBTITLE), 1 }, // EFI_IFR_SUBTITLE_OP\r
666 { sizeof (EFI_IFR_TEXT), 0 }, // EFI_IFR_TEXT_OP\r
667 { sizeof (EFI_IFR_IMAGE), 0 }, // EFI_IFR_IMAGE_OP\r
668 { sizeof (EFI_IFR_ONE_OF), 1 }, // EFI_IFR_ONE_OF_OP - 0x05\r
669 { sizeof (EFI_IFR_CHECKBOX), 1}, // EFI_IFR_CHECKBOX_OP\r
670 { sizeof (EFI_IFR_NUMERIC), 1 }, // EFI_IFR_NUMERIC_OP\r
671 { sizeof (EFI_IFR_PASSWORD), 1 }, // EFI_IFR_PASSWORD_OP\r
672 { sizeof (EFI_IFR_ONE_OF_OPTION), 0 }, // EFI_IFR_ONE_OF_OPTION_OP\r
673 { sizeof (EFI_IFR_SUPPRESS_IF), 1 }, // EFI_IFR_SUPPRESS_IF - 0x0A\r
674 { sizeof (EFI_IFR_LOCKED), 0 }, // EFI_IFR_LOCKED_OP\r
675 { sizeof (EFI_IFR_ACTION), 1 }, // EFI_IFR_ACTION_OP\r
676 { sizeof (EFI_IFR_RESET_BUTTON), 1 }, // EFI_IFR_RESET_BUTTON_OP\r
677 { sizeof (EFI_IFR_FORM_SET), 1 }, // EFI_IFR_FORM_SET_OP -0xE\r
678 { sizeof (EFI_IFR_REF), 0 }, // EFI_IFR_REF_OP\r
679 { sizeof (EFI_IFR_NO_SUBMIT_IF), 1}, // EFI_IFR_NO_SUBMIT_IF_OP -0x10\r
680 { sizeof (EFI_IFR_INCONSISTENT_IF), 1 }, // EFI_IFR_INCONSISTENT_IF_OP\r
681 { sizeof (EFI_IFR_EQ_ID_VAL), 0 }, // EFI_IFR_EQ_ID_VAL_OP\r
682 { sizeof (EFI_IFR_EQ_ID_ID), 0 }, // EFI_IFR_EQ_ID_ID_OP\r
683 { sizeof (EFI_IFR_EQ_ID_LIST), 0 }, // EFI_IFR_EQ_ID_LIST_OP - 0x14\r
684 { sizeof (EFI_IFR_AND), 0 }, // EFI_IFR_AND_OP\r
685 { sizeof (EFI_IFR_OR), 0 }, // EFI_IFR_OR_OP\r
686 { sizeof (EFI_IFR_NOT), 0 }, // EFI_IFR_NOT_OP\r
687 { sizeof (EFI_IFR_RULE), 1 }, // EFI_IFR_RULE_OP\r
688 { sizeof (EFI_IFR_GRAY_OUT_IF), 1 }, // EFI_IFR_GRAYOUT_IF_OP - 0x19\r
689 { sizeof (EFI_IFR_DATE), 1 }, // EFI_IFR_DATE_OP\r
690 { sizeof (EFI_IFR_TIME), 1 }, // EFI_IFR_TIME_OP\r
691 { sizeof (EFI_IFR_STRING), 1 }, // EFI_IFR_STRING_OP\r
692 { sizeof (EFI_IFR_REFRESH), 1 }, // EFI_IFR_REFRESH_OP\r
693 { sizeof (EFI_IFR_DISABLE_IF), 1 }, // EFI_IFR_DISABLE_IF_OP - 0x1E\r
694 { 0, 0 }, // 0x1F\r
695 { sizeof (EFI_IFR_TO_LOWER), 0 }, // EFI_IFR_TO_LOWER_OP - 0x20\r
696 { sizeof (EFI_IFR_TO_UPPER), 0 }, // EFI_IFR_TO_UPPER_OP - 0x21\r
697 { 0, 0 }, // 0x22\r
698 { sizeof (EFI_IFR_ORDERED_LIST), 1 }, // EFI_IFR_ORDERED_LIST_OP - 0x23\r
699 { sizeof (EFI_IFR_VARSTORE), 0 }, // EFI_IFR_VARSTORE_OP\r
700 { sizeof (EFI_IFR_VARSTORE_NAME_VALUE), 0 }, // EFI_IFR_VARSTORE_NAME_VALUE_OP\r
701 { sizeof (EFI_IFR_VARSTORE_EFI), 0 }, // EFI_IFR_VARSTORE_EFI_OP\r
702 { sizeof (EFI_IFR_VARSTORE_DEVICE), 1 }, // EFI_IFR_VARSTORE_DEVICE_OP\r
703 { sizeof (EFI_IFR_VERSION), 0 }, // EFI_IFR_VERSION_OP - 0x28\r
704 { sizeof (EFI_IFR_END), 0 }, // EFI_IFR_END_OP\r
705 { sizeof (EFI_IFR_MATCH), 1 }, // EFI_IFR_MATCH_OP - 0x2A\r
706 { 0, 0 }, { 0, 0} , { 0, 0} , { 0, 0} , // 0x2B ~ 0x2E\r
707 { sizeof (EFI_IFR_EQUAL), 0 }, // EFI_IFR_EQUAL_OP - 0x2F\r
708 { sizeof (EFI_IFR_NOT_EQUAL), 0 }, // EFI_IFR_NOT_EQUAL_OP\r
709 { sizeof (EFI_IFR_GREATER_THAN), 0 }, // EFI_IFR_GREATER_THAN_OP\r
710 { sizeof (EFI_IFR_GREATER_EQUAL), 0 }, // EFI_IFR_GREATER_EQUAL_OP\r
711 { sizeof (EFI_IFR_LESS_THAN), 0 }, // EFI_IFR_LESS_THAN_OP\r
712 { sizeof (EFI_IFR_LESS_EQUAL), 0 }, // EFI_IFR_LESS_EQUAL_OP - 0x34\r
713 { sizeof (EFI_IFR_BITWISE_AND), 0 }, // EFI_IFR_BITWISE_AND_OP\r
714 { sizeof (EFI_IFR_BITWISE_OR), 0 }, // EFI_IFR_BITWISE_OR_OP\r
715 { sizeof (EFI_IFR_BITWISE_NOT), 0 }, // EFI_IFR_BITWISE_NOT_OP\r
716 { sizeof (EFI_IFR_SHIFT_LEFT), 0 }, // EFI_IFR_SHIFT_LEFT_OP\r
717 { sizeof (EFI_IFR_SHIFT_RIGHT), 0 }, // EFI_IFR_SHIFT_RIGHT_OP\r
718 { sizeof (EFI_IFR_ADD), 0 }, // EFI_IFR_ADD_OP - 0x3A\r
719 { sizeof (EFI_IFR_SUBTRACT), 0 }, // EFI_IFR_SUBTRACT_OP\r
720 { sizeof (EFI_IFR_MULTIPLY), 0 }, // EFI_IFR_MULTIPLY_OP\r
721 { sizeof (EFI_IFR_DIVIDE), 0 }, // EFI_IFR_DIVIDE_OP\r
722 { sizeof (EFI_IFR_MODULO), 0 }, // EFI_IFR_MODULO_OP - 0x3E\r
723 { sizeof (EFI_IFR_RULE_REF), 0 }, // EFI_IFR_RULE_REF_OP\r
724 { sizeof (EFI_IFR_QUESTION_REF1), 0 }, // EFI_IFR_QUESTION_REF1_OP\r
725 { sizeof (EFI_IFR_QUESTION_REF2), 0 }, // EFI_IFR_QUESTION_REF2_OP - 0x41\r
726 { sizeof (EFI_IFR_UINT8), 0}, // EFI_IFR_UINT8\r
727 { sizeof (EFI_IFR_UINT16), 0}, // EFI_IFR_UINT16\r
728 { sizeof (EFI_IFR_UINT32), 0}, // EFI_IFR_UINT32\r
729 { sizeof (EFI_IFR_UINT64), 0}, // EFI_IFR_UTNT64\r
730 { sizeof (EFI_IFR_TRUE), 0 }, // EFI_IFR_TRUE_OP - 0x46\r
731 { sizeof (EFI_IFR_FALSE), 0 }, // EFI_IFR_FALSE_OP\r
732 { sizeof (EFI_IFR_TO_UINT), 0 }, // EFI_IFR_TO_UINT_OP\r
733 { sizeof (EFI_IFR_TO_STRING), 0 }, // EFI_IFR_TO_STRING_OP\r
734 { sizeof (EFI_IFR_TO_BOOLEAN), 0 }, // EFI_IFR_TO_BOOLEAN_OP\r
735 { sizeof (EFI_IFR_MID), 0 }, // EFI_IFR_MID_OP\r
736 { sizeof (EFI_IFR_FIND), 0 }, // EFI_IFR_FIND_OP\r
737 { sizeof (EFI_IFR_TOKEN), 0 }, // EFI_IFR_TOKEN_OP\r
738 { sizeof (EFI_IFR_STRING_REF1), 0 }, // EFI_IFR_STRING_REF1_OP - 0x4E\r
739 { sizeof (EFI_IFR_STRING_REF2), 0 }, // EFI_IFR_STRING_REF2_OP\r
740 { sizeof (EFI_IFR_CONDITIONAL), 0 }, // EFI_IFR_CONDITIONAL_OP\r
741 { sizeof (EFI_IFR_QUESTION_REF3), 0 }, // EFI_IFR_QUESTION_REF3_OP\r
742 { sizeof (EFI_IFR_ZERO), 0 }, // EFI_IFR_ZERO_OP\r
743 { sizeof (EFI_IFR_ONE), 0 }, // EFI_IFR_ONE_OP\r
744 { sizeof (EFI_IFR_ONES), 0 }, // EFI_IFR_ONES_OP\r
745 { sizeof (EFI_IFR_UNDEFINED), 0 }, // EFI_IFR_UNDEFINED_OP\r
746 { sizeof (EFI_IFR_LENGTH), 0 }, // EFI_IFR_LENGTH_OP\r
747 { sizeof (EFI_IFR_DUP), 0 }, // EFI_IFR_DUP_OP - 0x57\r
748 { sizeof (EFI_IFR_THIS), 0 }, // EFI_IFR_THIS_OP\r
749 { sizeof (EFI_IFR_SPAN), 0 }, // EFI_IFR_SPAN_OP\r
750 { sizeof (EFI_IFR_VALUE), 1 }, // EFI_IFR_VALUE_OP\r
751 { sizeof (EFI_IFR_DEFAULT), 0 }, // EFI_IFR_DEFAULT_OP\r
752 { sizeof (EFI_IFR_DEFAULTSTORE), 0 }, // EFI_IFR_DEFAULTSTORE_OP - 0x5C\r
753 { 0, 0}, // 0x5D\r
754 { sizeof (EFI_IFR_CATENATE), 0 }, // EFI_IFR_CATENATE_OP\r
755 { sizeof (EFI_IFR_GUID), 0 }, // EFI_IFR_GUID_OP\r
756};\r
757\r
758#ifdef CIFROBJ_DEUBG\r
759static struct {\r
760 INT8 *mIfrName;\r
761} gIfrObjPrintDebugTable[] = {\r
762 "EFI_IFR_INVALID", "EFI_IFR_FORM", "EFI_IFR_SUBTITLE", "EFI_IFR_TEXT", "EFI_IFR_IMAGE", "EFI_IFR_ONE_OF",\r
763 "EFI_IFR_CHECKBOX", "EFI_IFR_NUMERIC", "EFI_IFR_PASSWORD", "EFI_IFR_ONE_OF_OPTION", "EFI_IFR_SUPPRESS_IF", "EFI_IFR_LOCKED",\r
764 "EFI_IFR_ACTION", "EFI_IFR_RESET_BUTTON", "EFI_IFR_FORM_SET", "EFI_IFR_REF", "EFI_IFR_NO_SUBMIT_IF", "EFI_IFR_INCONSISTENT_IF",\r
765 "EFI_IFR_EQ_ID_VAL", "EFI_IFR_EQ_ID_ID", "EFI_IFR_EQ_ID_LIST", "EFI_IFR_AND", "EFI_IFR_OR", "EFI_IFR_NOT",\r
766 "EFI_IFR_RULE", "EFI_IFR_GRAY_OUT_IF", "EFI_IFR_DATE", "EFI_IFR_TIME", "EFI_IFR_STRING", "EFI_IFR_REFRESH",\r
767 "EFI_IFR_DISABLE_IF", "EFI_IFR_INVALID", "EFI_IFR_TO_LOWER", "EFI_IFR_TO_UPPER", "EFI_IFR_INVALID", "EFI_IFR_ORDERED_LIST",\r
768 "EFI_IFR_VARSTORE", "EFI_IFR_VARSTORE_NAME_VALUE", "EFI_IFR_VARSTORE_EFI", "EFI_IFR_VARSTORE_DEVICE", "EFI_IFR_VERSION", "EFI_IFR_END",\r
769 "EFI_IFR_MATCH", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_EQUAL",\r
770 "EFI_IFR_NOT_EQUAL", "EFI_IFR_GREATER_THAN", "EFI_IFR_GREATER_EQUAL", "EFI_IFR_LESS_THAN", "EFI_IFR_LESS_EQUAL", "EFI_IFR_BITWISE_AND",\r
771 "EFI_IFR_BITWISE_OR", "EFI_IFR_BITWISE_NOT", "EFI_IFR_SHIFT_LEFT", "EFI_IFR_SHIFT_RIGHT", "EFI_IFR_ADD", "EFI_IFR_SUBTRACT",\r
772 "EFI_IFR_MULTIPLY", "EFI_IFR_DIVIDE", "EFI_IFR_MODULO", "EFI_IFR_RULE_REF", "EFI_IFR_QUESTION_REF1", "EFI_IFR_QUESTION_REF2",\r
773 "EFI_IFR_UINT8", "EFI_IFR_UINT16", "EFI_IFR_UINT32", "EFI_IFR_UINT64", "EFI_IFR_TRUE", "EFI_IFR_FALSE",\r
774 "EFI_IFR_TO_UINT", "EFI_IFR_TO_STRING", "EFI_IFR_TO_BOOLEAN", "EFI_IFR_MID", "EFI_IFR_FIND", "EFI_IFR_TOKEN",\r
775 "EFI_IFR_STRING_REF1","EFI_IFR_STRING_REF2", "EFI_IFR_CONDITIONAL", "EFI_IFR_QUESTION_REF3", "EFI_IFR_ZERO", "EFI_IFR_ONE",\r
776 "EFI_IFR_ONES", "EFI_IFR_UNDEFINED", "EFI_IFR_LENGTH", "EFI_IFR_DUP", "EFI_IFR_THIS", "EFI_IFR_SPAN",\r
777 "EFI_IFR_VALUE", "EFI_IFR_DEFAULT", "EFI_IFR_DEFAULTSTORE", "EFI_IFR_INVALID", "EFI_IFR_CATENATE", "EFI_IFR_GUID",\r
778};\r
779\r
780VOID\r
781CIFROBJ_DEBUG_PRINT (\r
782 IN UINT8 OpCode\r
783 )\r
784{\r
785 printf ("======Create IFR [%s]\n", gIfrObjPrintDebugTable[OpCode].mIfrName);\r
786}\r
787#else\r
788\r
789#define CIFROBJ_DEBUG_PRINT(OpCode)\r
790\r
791#endif\r
792\r
793bool gCreateOp = TRUE;\r
794\r
795CIfrObj::CIfrObj (\r
796 IN UINT8 OpCode,\r
797 OUT CHAR8 **IfrObj,\r
798 IN UINT8 ObjBinLen,\r
799 IN BOOLEAN DelayEmit\r
800 )\r
801{\r
802 mDelayEmit = DelayEmit;\r
803 mPkgOffset = gCFormPkg.GetPkgLength ();\r
804 mObjBinLen = (ObjBinLen == 0) ? gOpcodeSizesScopeTable[OpCode].mSize : ObjBinLen;\r
805 mObjBinBuf = ((DelayEmit == FALSE) && (gCreateOp == TRUE)) ? gCFormPkg.IfrBinBufferGet (mObjBinLen) : new CHAR8[EFI_IFR_MAX_LENGTH];\r
806 mRecordIdx = (gCreateOp == TRUE) ? gCIfrRecordInfoDB.IfrRecordRegister (0xFFFFFFFF, mObjBinBuf, mObjBinLen, mPkgOffset) : EFI_IFR_RECORDINFO_IDX_INVALUD;\r
807\r
808 if (IfrObj != NULL) {\r
809 *IfrObj = mObjBinBuf;\r
810 }\r
811\r
812 CIFROBJ_DEBUG_PRINT (OpCode);\r
813}\r
814\r
815CIfrObj::~CIfrObj (\r
816 VOID\r
817 )\r
818{\r
819 if ((mDelayEmit == TRUE) && ((gCreateOp == TRUE))) {\r
820 _EMIT_PENDING_OBJ ();\r
821 }\r
822\r
823 gCIfrRecordInfoDB.IfrRecordInfoUpdate (mRecordIdx, mLineNo, mObjBinBuf, mObjBinLen, mPkgOffset);\r
824}\r
825\r
826/*\r
827 * The definition of CIfrObj's member function\r
828 */\r
829UINT8 gScopeCount = 0;\r
830\r
831CIfrOpHeader::CIfrOpHeader (\r
832 IN UINT8 OpCode, \r
833 IN VOID *StartAddr,\r
834 IN UINT8 Length \r
835 ) : mHeader ((EFI_IFR_OP_HEADER *)StartAddr) \r
836{\r
837 mHeader->OpCode = OpCode;\r
838 mHeader->Length = (Length == 0) ? gOpcodeSizesScopeTable[OpCode].mSize : Length;\r
839 mHeader->Scope = (gOpcodeSizesScopeTable[OpCode].mScope + gScopeCount > 0) ? 1 : 0;\r
840}\r
841\r
842CIfrOpHeader::CIfrOpHeader (\r
843 IN CIfrOpHeader &OpHdr\r
844 )\r
845{\r
846 mHeader = OpHdr.mHeader;\r
847}\r
848\r
849UINT32 CIfrForm::FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE] = {0, };\r