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