summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile
diff options
context:
space:
mode:
Diffstat (limited to 'EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile')
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/EfiVfr.h53
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.cpp594
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.h90
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.cpp197
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.h67
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.cpp830
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.h2252
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrSyntax.g3201
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.cpp2695
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.h341
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/makefile149
11 files changed, 10469 insertions, 0 deletions
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/EfiVfr.h b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/EfiVfr.h
new file mode 100644
index 0000000000..43e40ab6af
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/EfiVfr.h
@@ -0,0 +1,53 @@
+/*++
+
+Copyright (c) 2004 - 2007, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+ EfiVfr.h
+
+Abstract:
+
+ Defines and prototypes for the UEFI VFR compiler internal use.
+
+--*/
+
+#ifndef _EFIVFR_H_
+#define _EFIVFR_H_
+
+#include "Tiano.h"
+#include "TianoHii.h"
+
+#define MAX_PATH 255
+#define MAX_LINE_LEN 4096
+
+#define EFI_IFR_MAX_LENGTH 0xFF
+
+#define EFI_VARSTORE_ID_INVALID 0
+#define EFI_VAROFFSET_INVALID 0xFFFF
+#define EFI_VARSTORE_ID_START 0x20
+#define EFI_STRING_ID_INVALID 0x0
+#define EFI_IMAGE_ID_INVALID 0xFFFF
+
+typedef enum {
+ QUESTION_NORMAL,
+ QUESTION_DATE,
+ QUESTION_TIME,
+} EFI_QUESION_TYPE;
+
+typedef enum {
+ EQUAL,
+ LESS_EQUAL,
+ LESS_THAN,
+ GREATER_THAN,
+ GREATER_EQUAL
+} EFI_COMPARE_TYPE;
+
+#endif
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.cpp b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.cpp
new file mode 100644
index 0000000000..b1b19b90bf
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.cpp
@@ -0,0 +1,594 @@
+#include "stdio.h"
+#include "string.h"
+#include "process.h"
+#include "VfrCompiler.h"
+
+
+VOID
+CVfrCompiler::SET_RUN_STATUS (
+ IN COMPILER_RUN_STATUS Status
+ )
+{
+ mRunStatus = Status;
+}
+
+BOOLEAN
+CVfrCompiler::IS_RUN_STATUS (
+ IN COMPILER_RUN_STATUS Status
+ )
+{
+ return mRunStatus == Status;
+}
+
+VOID
+CVfrCompiler::OptionInitialization (
+ IN INT32 Argc,
+ IN INT8 **Argv
+ )
+{
+ INT32 Index;
+
+ mOptions.VfrFileName[0] = '\0';
+ mOptions.RecordListFile[0] = '\0';
+ mOptions.CreateRecordListFile = FALSE;
+ mOptions.CreateIfrPkgFile = FALSE;
+ mOptions.PkgOutputFileName[0] = '\0';
+ mOptions.COutputFileName[0] = '\0';
+ mOptions.OutputDirectory[0] = '\0';
+ mOptions.PreprocessorOutputFileName[0] = '\0';
+ mOptions.VfrBaseFileName[0] = '\0';
+ mOptions.IncludePaths = NULL;
+ mOptions.CPreprocessorOptions = NULL;
+
+ for (Index = 1; (Index < Argc) && (Argv[Index][0] == '-'); Index++) {
+ if ((_stricmp(Argv[Index], "-?") == 0) || (_stricmp(Argv[Index], "-h") == 0)) {
+ Usage ();
+ SET_RUN_STATUS (STATUS_DEAD);
+ return;
+ } else if (_stricmp(Argv[Index], "-l") == 0) {
+ mOptions.CreateRecordListFile = TRUE;
+ gCIfrRecordInfoDB.TurnOn ();
+ } else if (_stricmp(Argv[Index], "-i") == 0) {
+ Index++;
+ if ((Index >= Argc) || (Argv[Index][0] == '-')) {
+ printf ("%s -i - missing path argument\n", PROGRAM_NAME);
+ goto Fail;
+ }
+
+ AppendIncludePath(Argv[Index]);
+ } else if (_stricmp(Argv[Index], "-od") == 0) {
+ Index++;
+ if ((Index >= Argc) || (Argv[Index][0] == '-')) {
+ printf ("%s -od - missing output directory name\n", PROGRAM_NAME);
+ goto Fail;
+ }
+ strcpy (mOptions.OutputDirectory, Argv[Index]);
+ } else if (_stricmp(Argv[Index], "-ibin") == 0) {
+ mOptions.CreateIfrPkgFile = TRUE;
+ } else if (_stricmp(Argv[Index], "-nostrings") == 0) {
+ } else if (_stricmp(Argv[Index], "-ppflag") == 0) {
+ Index++;
+ if ((Index >= Argc) || (Argv[Index][0] == '-')) {
+ printf ("%s -od - missing C-preprocessor argument\n", PROGRAM_NAME);
+ goto Fail;
+ }
+
+ AppendCPreprocessorOptions (Argv[Index]);
+ } else {
+ printf ("%s unrecognized option %s\n", PROGRAM_NAME, Argv[Index]);
+ Usage ();
+ goto Fail;
+ }
+ }
+
+ if (Index != Argc - 1) {
+ printf ("%s must specify VFR file name", PROGRAM_NAME);
+ Usage ();
+ goto Fail;
+ } else {
+ strcpy (mOptions.VfrFileName, Argv[Index]);
+ }
+
+ if (SetBaseFileName() != 0) {
+ goto Fail;
+ }
+ if (SetPkgOutputFileName () != 0) {
+ goto Fail;
+ }
+ if (SetCOutputFileName() != 0) {
+ goto Fail;
+ }
+ if (SetPreprocessorOutputFileName () != 0) {
+ goto Fail;
+ }
+ if (SetRecordListFileName () != 0) {
+ goto Fail;
+ }
+ return;
+
+Fail:
+ SET_RUN_STATUS (STATUS_FAILED);
+
+ mOptions.VfrFileName[0] = '\0';
+ mOptions.RecordListFile[0] = '\0';
+ mOptions.CreateRecordListFile = FALSE;
+ mOptions.CreateIfrPkgFile = FALSE;
+ mOptions.PkgOutputFileName[0] = '\0';
+ mOptions.COutputFileName[0] = '\0';
+ mOptions.OutputDirectory[0] = '\0';
+ mOptions.PreprocessorOutputFileName[0] = '\0';
+ mOptions.VfrBaseFileName[0] = '\0';
+ if (mOptions.IncludePaths != NULL) {
+ delete mOptions.IncludePaths;
+ mOptions.IncludePaths = NULL;
+ }
+ if (mOptions.CPreprocessorOptions != NULL) {
+ delete mOptions.CPreprocessorOptions;
+ mOptions.CPreprocessorOptions = NULL;
+ }
+}
+
+VOID
+CVfrCompiler::AppendIncludePath (
+ IN INT8 *PathStr
+ )
+{
+ UINT32 Len = 0;
+ INT8 *IncludePaths = NULL;
+
+ Len = strlen (" -I ") + strlen (PathStr) + 1;
+ if (mOptions.IncludePaths != NULL) {
+ Len += strlen (mOptions.IncludePaths);
+ }
+ IncludePaths = new INT8[Len];
+ if (IncludePaths == NULL) {
+ printf ("%s memory allocation failure\n", PROGRAM_NAME);
+ return;
+ }
+ IncludePaths[0] = '\0';
+ if (mOptions.IncludePaths != NULL) {
+ strcat (IncludePaths, mOptions.IncludePaths);
+ }
+ strcat (IncludePaths, " -I ");
+ strcat (IncludePaths, PathStr);
+ if (mOptions.IncludePaths != NULL) {
+ delete mOptions.IncludePaths;
+ }
+ mOptions.IncludePaths = IncludePaths;
+}
+
+VOID
+CVfrCompiler::AppendCPreprocessorOptions (
+ IN INT8 *Options
+ )
+{
+ UINT32 Len = 0;
+ INT8 *Opt = NULL;
+
+ Len = strlen (Options) + strlen (" ") + 1;
+ if (mOptions.CPreprocessorOptions != NULL) {
+ Len += strlen (mOptions.CPreprocessorOptions);
+ }
+ Opt = new INT8[Len];
+ if (Opt == NULL) {
+ printf ("%s memory allocation failure\n", PROGRAM_NAME);
+ return;
+ }
+ Opt[0] = 0;
+ if (mOptions.CPreprocessorOptions != NULL) {
+ strcat (Opt, mOptions.CPreprocessorOptions);
+ }
+ strcat (Opt, " ");
+ strcat (Opt, Options);
+ if (mOptions.CPreprocessorOptions != NULL) {
+ delete mOptions.CPreprocessorOptions;
+ }
+ mOptions.CPreprocessorOptions = Opt;
+}
+
+INT8
+CVfrCompiler::SetBaseFileName (
+ VOID
+ )
+{
+ INT8 *pFileName, *pPath, *pExt;
+
+ if (mOptions.VfrFileName[0] == '\0') {
+ return -1;
+ }
+
+ pFileName = mOptions.VfrFileName;
+ while ((pPath = strchr (pFileName, '\\')) != NULL) {
+ pFileName = pPath + 1;
+ }
+
+ if (pFileName == NULL) {
+ return -1;
+ }
+
+ if ((pExt = strchr (pFileName, '.')) == NULL) {
+ return -1;
+ }
+
+ strncpy (mOptions.VfrBaseFileName, pFileName, pExt - pFileName);
+ mOptions.VfrBaseFileName[pExt - pFileName] = '\0';
+
+ return 0;
+}
+
+INT8
+CVfrCompiler::SetPkgOutputFileName (
+ VOID
+ )
+{
+ if (mOptions.VfrBaseFileName[0] == '\0') {
+ return -1;
+ }
+
+ strcpy (mOptions.PkgOutputFileName, mOptions.OutputDirectory);
+ strcat (mOptions.PkgOutputFileName, mOptions.VfrBaseFileName);
+ strcat (mOptions.PkgOutputFileName, VFR_PACKAGE_FILENAME_EXTENSION);
+
+ return 0;
+}
+
+INT8
+CVfrCompiler::SetCOutputFileName (
+ VOID
+ )
+{
+ if (mOptions.VfrBaseFileName[0] == '\0') {
+ return -1;
+ }
+
+ strcpy (mOptions.COutputFileName, mOptions.OutputDirectory);
+ strcat (mOptions.COutputFileName, mOptions.VfrBaseFileName);
+ strcat (mOptions.COutputFileName, ".c");
+
+ return 0;
+}
+
+INT8
+CVfrCompiler::SetPreprocessorOutputFileName (
+ VOID
+ )
+{
+ if (mOptions.VfrBaseFileName[0] == '\0') {
+ return -1;
+ }
+
+ strcpy (mOptions.PreprocessorOutputFileName, mOptions.OutputDirectory);
+ strcat (mOptions.PreprocessorOutputFileName, mOptions.VfrBaseFileName);
+ strcat (mOptions.PreprocessorOutputFileName, VFR_PREPROCESS_FILENAME_EXTENSION);
+
+ return 0;
+}
+
+INT8
+CVfrCompiler::SetRecordListFileName (
+ VOID
+ )
+{
+ if (mOptions.VfrBaseFileName[0] == '\0') {
+ return -1;
+ }
+
+ strcpy (mOptions.RecordListFile, mOptions.OutputDirectory);
+ strcat (mOptions.RecordListFile, mOptions.VfrBaseFileName);
+ strcat (mOptions.RecordListFile, VFR_RECORDLIST_FILENAME_EXTENSION);
+
+ return 0;
+}
+
+CVfrCompiler::CVfrCompiler (
+ IN INT32 Argc,
+ IN INT8 **Argv
+ )
+{
+ mPreProcessCmd = PREPROCESSOR_COMMAND;
+ mPreProcessOpt = PREPROCESSOR_OPTIONS;
+
+ OptionInitialization(Argc, Argv);
+
+ if ((IS_RUN_STATUS(STATUS_FAILED)) || (IS_RUN_STATUS(STATUS_DEAD))) {
+ return;
+ }
+
+ SET_RUN_STATUS(STATUS_INITIALIZED);
+}
+
+CVfrCompiler::~CVfrCompiler (
+ VOID
+ )
+{
+ if (mOptions.IncludePaths != NULL) {
+ delete mOptions.IncludePaths;
+ mOptions.IncludePaths = NULL;
+ }
+
+ if (mOptions.CPreprocessorOptions != NULL) {
+ delete mOptions.CPreprocessorOptions;
+ mOptions.CPreprocessorOptions = NULL;
+ }
+
+ SET_RUN_STATUS(STATUS_DEAD);
+}
+
+VOID
+CVfrCompiler::Usage (
+ VOID
+ )
+{
+ UINT32 Index;
+ CONST INT8 *Help[] = {
+ " ",
+ "VfrCompile version " VFR_COMPILER_VERSION,
+ " ",
+ " Usage: VfrCompile {options} [VfrFile]",
+ " ",
+ " where options include:",
+ " -? or -h prints this help",
+ " -l create an output IFR listing file",
+ " -i IncPath add IncPath to the search path for VFR included files",
+ " -od OutputDir deposit all output files to directory OutputDir (default=cwd)",
+ " -ibin create an IFR HII pack file"
+ " -ppflag C-preprocessor argument",
+ " where parameters include:",
+ " VfrFile name of the input VFR script file",
+ " ",
+ NULL
+ };
+ for (Index = 0; Help[Index] != NULL; Index++) {
+ fprintf (stdout, "%s\n", Help[Index]);
+ }
+}
+
+VOID
+CVfrCompiler::PreProcess (
+ VOID
+ )
+{
+ FILE *pVfrFile = NULL;
+ UINT32 CmdLen = 0;
+ INT8 *PreProcessCmd = NULL;
+
+ if (!IS_RUN_STATUS(STATUS_INITIALIZED)) {
+ goto Fail;
+ }
+
+ if ((pVfrFile = fopen (mOptions.VfrFileName, "r")) == NULL) {
+ printf ("%s could not open input VFR file - %s\n", PROGRAM_NAME, mOptions.VfrFileName);
+ goto Fail;
+ }
+ fclose (pVfrFile);
+
+ CmdLen = strlen (mPreProcessCmd) + strlen (mPreProcessOpt) +
+ strlen (mOptions.VfrFileName) + strlen (mOptions.PreprocessorOutputFileName);
+ if (mOptions.CPreprocessorOptions != NULL) {
+ CmdLen += strlen (mOptions.CPreprocessorOptions);
+ }
+ if (mOptions.IncludePaths != NULL) {
+ CmdLen += strlen (mOptions.IncludePaths);
+ }
+
+ PreProcessCmd = new INT8[CmdLen + 10];
+ if (PreProcessCmd == NULL) {
+ printf ("%s could not allocate memory\n", PROGRAM_NAME);
+ goto Fail;
+ }
+ strcpy (PreProcessCmd, mPreProcessCmd), strcat (PreProcessCmd, " ");
+ strcat (PreProcessCmd, mPreProcessOpt), strcat (PreProcessCmd, " ");
+ if (mOptions.IncludePaths != NULL) {
+ strcat (PreProcessCmd, mOptions.IncludePaths), strcat (PreProcessCmd, " ");
+ }
+ if (mOptions.CPreprocessorOptions != NULL) {
+ strcat (PreProcessCmd, mOptions.CPreprocessorOptions), strcat (PreProcessCmd, " ");
+ }
+ strcat (PreProcessCmd, mOptions.VfrFileName), strcat (PreProcessCmd, " > ");
+ strcat (PreProcessCmd, mOptions.PreprocessorOutputFileName);
+
+ if (system (PreProcessCmd) != 0) {
+ printf ("%s failed to spawn C preprocessor on VFR file \n\t - %s\n", PROGRAM_NAME, PreProcessCmd);
+ goto Fail;
+ }
+
+ delete PreProcessCmd;
+ SET_RUN_STATUS (STATUS_PREPROCESSED);
+ return;
+
+Fail:
+ if (!IS_RUN_STATUS(STATUS_DEAD)) {
+ SET_RUN_STATUS (STATUS_FAILED);
+ }
+ delete PreProcessCmd;
+}
+
+extern UINT8 VfrParserStart (IN FILE *);
+
+VOID
+CVfrCompiler::Compile (
+ VOID
+ )
+{
+ FILE *VfrFile = NULL;
+
+ if (!IS_RUN_STATUS(STATUS_PREPROCESSED)) {
+ goto Fail;
+ }
+
+ if ((VfrFile = fopen (mOptions.PreprocessorOutputFileName, "r")) == NULL) {
+ printf ("%s failed to open input VFR preprocessor output file - %s\n", PROGRAM_NAME, mOptions.PreprocessorOutputFileName);
+ goto Fail;
+ }
+
+ if (VfrParserStart (VfrFile) != 0) {
+ goto Fail;
+ }
+
+ fclose (VfrFile);
+
+ if (gCFormPkg.HavePendingUnassigned () == TRUE) {
+ gCFormPkg.PendingAssignPrintAll ();
+ goto Fail;
+ }
+
+ SET_RUN_STATUS (STATUS_COMPILEED);
+ return;
+
+Fail:
+ if (!IS_RUN_STATUS(STATUS_DEAD)) {
+ printf ("%s compile error!\n", PROGRAM_NAME);
+ SET_RUN_STATUS (STATUS_FAILED);
+ }
+ if (VfrFile != NULL) {
+ fclose (VfrFile);
+ }
+}
+
+VOID
+CVfrCompiler::GenBinary (
+ VOID
+ )
+{
+ FILE *pFile = NULL;
+
+ if (!IS_RUN_STATUS(STATUS_COMPILEED)) {
+ goto Fail;
+ }
+
+ if (mOptions.CreateIfrPkgFile == TRUE) {
+ if ((pFile = fopen (mOptions.PkgOutputFileName, "wb")) == NULL) {
+ printf ("can not open PkgFileName\n", mOptions.PkgOutputFileName);
+ goto Fail;
+ }
+ if (gCFormPkg.BuildPkg (pFile) != VFR_RETURN_SUCCESS) {
+ fclose (pFile);
+ goto Fail;
+ }
+ fclose (pFile);
+ }
+
+ SET_RUN_STATUS (STATUS_GENBINARY);
+ return;
+
+Fail:
+ if (!IS_RUN_STATUS(STATUS_DEAD)) {
+ SET_RUN_STATUS (STATUS_FAILED);
+ }
+}
+
+static const char *gSourceFileHeader[] = {
+ "//",
+ "// DO NOT EDIT -- auto-generated file",
+ "//",
+ "// This file is generated by the vfrcompiler utility",
+ "//",
+ NULL
+};
+
+VOID
+CVfrCompiler::GenCFile (
+ VOID
+ )
+{
+ FILE *pFile;
+ UINT32 Index;
+
+ if (!IS_RUN_STATUS(STATUS_GENBINARY)) {
+ goto Fail;
+ }
+
+ if ((pFile = fopen (mOptions.COutputFileName, "w")) == NULL) {
+ printf ("failed to open output C file - %s\n", mOptions.COutputFileName);
+ goto Fail;
+ }
+
+ for (Index = 0; gSourceFileHeader[Index] != NULL; Index++) {
+ fprintf (pFile, "%s\n", gSourceFileHeader[Index]);
+ }
+
+ gCVfrBufferConfig.OutputCFile (pFile, mOptions.VfrBaseFileName);
+
+ if (gCFormPkg.GenCFile (mOptions.VfrBaseFileName, pFile) != VFR_RETURN_SUCCESS) {
+ fclose (pFile);
+ goto Fail;
+ }
+ fclose (pFile);
+
+ SET_RUN_STATUS (STATUS_FINISHED);
+ return;
+
+Fail:
+ if (!IS_RUN_STATUS(STATUS_DEAD)) {
+ SET_RUN_STATUS (STATUS_FAILED);
+ }
+}
+
+VOID
+CVfrCompiler::GenRecordListFile (
+ VOID
+ )
+{
+ FILE *pInFile = NULL;
+ FILE *pOutFile = NULL;
+ INT8 LineBuf[MAX_LINE_LEN];
+ UINT32 LineNo;
+
+ if (mOptions.CreateRecordListFile == TRUE) {
+ if ((mOptions.PreprocessorOutputFileName[0] == '\0') || (mOptions.RecordListFile[0] == '\0')) {
+ return;
+ }
+
+ if ((pInFile = fopen (mOptions.PreprocessorOutputFileName, "r")) == NULL) {
+ printf ("%s failed to open input VFR preprocessor output file - %s\n", PROGRAM_NAME, mOptions.PreprocessorOutputFileName);
+ return;
+ }
+
+ if ((pOutFile = fopen (mOptions.RecordListFile, "w")) == NULL) {
+ printf ("%s failed to open record list file for writing - %s\n", PROGRAM_NAME, mOptions.RecordListFile);
+ goto Err1;
+ }
+
+ fprintf (pOutFile, "//\n// VFR compiler version " VFR_COMPILER_VERSION "\n//\n");
+ LineNo = 0;
+ while (!feof (pInFile)) {
+ if (fgets (LineBuf, MAX_LINE_LEN, pInFile) != NULL) {
+ fprintf (pOutFile, "%s", LineBuf);
+ LineNo++;
+ gCIfrRecordInfoDB.IfrRecordOutput (pOutFile, LineNo);
+ }
+ }
+
+ fclose (pOutFile);
+ fclose (pInFile);
+ }
+
+ return;
+
+Err1:
+ fclose (pInFile);
+}
+
+INT32
+main (
+ IN INT32 Argc,
+ IN INT8 **Argv
+ )
+{
+ COMPILER_RUN_STATUS Status;
+ CVfrCompiler Compiler(Argc, Argv);
+
+ Compiler.PreProcess();
+ Compiler.Compile();
+ Compiler.GenBinary();
+ Compiler.GenCFile();
+ Compiler.GenRecordListFile ();
+
+ Status = Compiler.RunStatus ();
+ if ((Status == STATUS_DEAD) || (Status == STATUS_FAILED)) {
+ return 2;
+ }
+
+ return 0;
+}
+
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.h b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.h
new file mode 100644
index 0000000000..a980cb5b1a
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrCompiler.h
@@ -0,0 +1,90 @@
+#ifndef _VFRCOMPILER_H_
+#define _VFRCOMPILER_H_
+
+#include "Tiano.h"
+#include "EfiTypes.h"
+#include "EfiVfr.h"
+#include "VfrFormPkg.h"
+#include "VfrUtilityLib.h"
+
+#define PROGRAM_NAME "VfrCompile"
+#define VFR_COMPILER_VERSION "UEFI 2.1"
+
+//
+// This is how we invoke the C preprocessor on the VFR source file
+// to resolve #defines, #includes, etc. To make C source files
+// shareable between VFR and drivers, define VFRCOMPILE so that
+// #ifdefs can be used in shared .h files.
+//
+#define PREPROCESSOR_COMMAND "cl "
+#define PREPROCESSOR_OPTIONS "/nologo /E /TC /DVFRCOMPILE "
+
+//
+// Specify the filename extensions for the files we generate.
+//
+#define VFR_PREPROCESS_FILENAME_EXTENSION ".i"
+#define VFR_PACKAGE_FILENAME_EXTENSION ".hpk"
+#define VFR_RECORDLIST_FILENAME_EXTENSION ".lst"
+
+typedef struct {
+ INT8 VfrFileName[MAX_PATH];
+ INT8 RecordListFile[MAX_PATH];
+ INT8 PkgOutputFileName[MAX_PATH];
+ INT8 COutputFileName[MAX_PATH];
+ bool CreateRecordListFile;
+ bool CreateIfrPkgFile;
+ INT8 OutputDirectory[MAX_PATH];
+ INT8 PreprocessorOutputFileName[MAX_PATH];
+ INT8 VfrBaseFileName[MAX_PATH]; // name of input VFR file with no path or extension
+ INT8 *IncludePaths;
+ INT8 *CPreprocessorOptions;
+} OPTIONS;
+
+typedef enum {
+ STATUS_INITIALIZED = 1,
+ STATUS_PREPROCESSED,
+ STATUS_COMPILEED,
+ STATUS_GENBINARY,
+ STATUS_FINISHED,
+ STATUS_FAILED,
+ STATUS_DEAD,
+} COMPILER_RUN_STATUS;
+
+class CVfrCompiler {
+private:
+ COMPILER_RUN_STATUS mRunStatus;
+ OPTIONS mOptions;
+ INT8 *mPreProcessCmd;
+ INT8 *mPreProcessOpt;
+
+ VOID OptionInitialization (IN INT32 , IN INT8 **);
+ VOID AppendIncludePath (IN INT8 *);
+ VOID AppendCPreprocessorOptions (IN INT8 *);
+ INT8 SetBaseFileName (VOID);
+ INT8 SetPkgOutputFileName (VOID);
+ INT8 SetCOutputFileName(VOID);
+ INT8 SetPreprocessorOutputFileName (VOID);
+ INT8 SetRecordListFileName (VOID);
+
+ VOID SET_RUN_STATUS (IN COMPILER_RUN_STATUS);
+ BOOLEAN IS_RUN_STATUS (IN COMPILER_RUN_STATUS);
+
+public:
+ COMPILER_RUN_STATUS RunStatus (VOID) {
+ return mRunStatus;
+ }
+
+public:
+ CVfrCompiler (IN INT32 , IN INT8 **);
+ ~CVfrCompiler ();
+
+ VOID Usage (VOID);
+
+ VOID PreProcess (VOID);
+ VOID Compile (VOID);
+ VOID GenBinary (VOID);
+ VOID GenCFile (VOID);
+ VOID GenRecordListFile (VOID);
+};
+
+#endif
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.cpp b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.cpp
new file mode 100644
index 0000000000..e1575770a8
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.cpp
@@ -0,0 +1,197 @@
+#include "stdio.h"
+#include "string.h"
+#include "stdlib.h"
+#include "VfrError.h"
+
+static SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] = {
+ { VFR_RETURN_SUCCESS, NULL },
+ { VFR_RETURN_ERROR_SKIPED, NULL },
+ { VFR_RETURN_FATAL_ERROR, "fatal error!!" },
+
+ { VFR_RETURN_MISMATCHED, "unexpected token" },
+ { VFR_RETURN_INVALID_PARAMETER, "Invalid parameter" },
+ { VFR_RETURN_OUT_FOR_RESOURCES, "system out of memory" },
+ { VFR_RETURN_UNSUPPORTED, "unsupported" },
+ { VFR_RETURN_REDEFINED, "already defined" },
+ { VFR_RETURN_FORMID_REDEFINED, "form id already defined" },
+ { VFR_RETURN_QUESTIONID_REDEFINED, "question id already defined" },
+ { VFR_RETURN_VARSTOREID_REDEFINED, "varstore id already defined" },
+ { VFR_RETURN_UNDEFINED, "undefined" },
+ { VFR_RETURN_VAR_NOTDEFINED_BY_QUESTION, "some variable has not defined by a question"},
+ { VFR_RETURN_GET_EFIVARSTORE_ERROR, "get efi varstore error"},
+ { VFR_RETURN_EFIVARSTORE_USE_ERROR, "can not use the efi varstore like this" },
+ { VFR_RETURN_EFIVARSTORE_SIZE_ERROR, "unsupport efi varstore size should be <= 8 bytes" },
+ { VFR_RETURN_GET_NVVARSTORE_ERROR, "get name value varstore error" },
+ { VFR_RETURN_QVAR_REUSE, "variable reused by more than one question" },
+ { VFR_RETURN_FLAGS_UNSUPPORTED, "flags unsupported" },
+ { VFR_RETURN_ERROR_ARRARY_NUM, "array number error" },
+ { VFR_RETURN_DATA_STRING_ERROR, "data field string error or not support"},
+ { VFR_RETURN_CODEUNDEFINED, "Undefined Error Code" }
+};
+
+CVfrErrorHandle::CVfrErrorHandle (
+ VOID
+ )
+{
+ mScopeRecordListHead = NULL;
+ mScopeRecordListTail = NULL;
+ mVfrErrorHandleTable = VFR_ERROR_HANDLE_TABLE;
+}
+
+CVfrErrorHandle::~CVfrErrorHandle (
+ VOID
+ )
+{
+ SVfrFileScopeRecord *pNode = NULL;
+
+ while (mScopeRecordListHead != NULL) {
+ pNode = mScopeRecordListHead;
+ mScopeRecordListHead = mScopeRecordListHead->mNext;
+ delete pNode;
+ }
+
+ mScopeRecordListHead = NULL;
+ mScopeRecordListTail = NULL;
+ mVfrErrorHandleTable = NULL;
+}
+
+SVfrFileScopeRecord::SVfrFileScopeRecord (
+ IN INT8 *Record,
+ IN UINT32 LineNum
+ )
+{
+ UINT32 Index;
+ INT8 *FileName = NULL;
+ INT8 *Str = NULL;
+
+ mWholeScopeLine = LineNum;
+ mNext = NULL;
+
+ Str = strchr (Record, ' ');
+ mScopeLineStart = atoi (++Str);
+
+ Str = strchr (Str, '\"');
+ FileName = ++Str;
+
+ while((Str = strstr (FileName, "\\\\")) != NULL) {
+ FileName = Str + 2;
+ }
+ if ((mFileName = new INT8[strlen(FileName)]) != NULL) {
+ for (Index = 0; FileName[Index] != '\"'; Index++) {
+ mFileName[Index] = FileName[Index];
+ }
+ mFileName[Index] = '\0';
+ }
+
+ return;
+}
+
+SVfrFileScopeRecord::~SVfrFileScopeRecord (
+ VOID
+ )
+{
+ if (mFileName != NULL) {
+ delete mFileName;
+ }
+}
+
+VOID
+CVfrErrorHandle::ParseFileScopeRecord (
+ IN INT8 *Record,
+ IN UINT32 WholeScopeLine
+ )
+{
+ INT8 *FullPathName = NULL;
+ SVfrFileScopeRecord *pNode = NULL;
+
+ if (Record == NULL) {
+ return;
+ }
+
+ if ((pNode = new SVfrFileScopeRecord(Record, WholeScopeLine)) == NULL) {
+ return;
+ }
+
+ if (mScopeRecordListHead == NULL) {
+ mScopeRecordListTail = mScopeRecordListHead = pNode;
+ } else {
+ mScopeRecordListTail->mNext = pNode;
+ mScopeRecordListTail = pNode;
+ }
+}
+
+VOID
+CVfrErrorHandle::GetFileNameLineNum (
+ IN UINT32 LineNum,
+ OUT INT8 **FileName,
+ OUT UINT32 *FileLine
+ )
+{
+ SVfrFileScopeRecord *pNode = NULL;
+
+ if ((FileName == NULL) || (FileLine == NULL)) {
+ return;
+ }
+
+ *FileName = NULL;
+ *FileLine = 0xFFFFFFFF;
+
+ for (pNode = mScopeRecordListHead; pNode->mNext != NULL; pNode = pNode->mNext) {
+ if ((LineNum > pNode->mWholeScopeLine) && (pNode->mNext->mWholeScopeLine > LineNum)) {
+ *FileName = pNode->mFileName;
+ *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;
+ return ;
+ }
+ }
+
+ *FileName = pNode->mFileName;
+ *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;
+}
+
+VOID
+CVfrErrorHandle::PrintError (
+ IN UINT32 LineNum,
+ IN INT8 *TokName,
+ IN INT8 *ErrorMsg
+ )
+{
+ INT8 *FileName = NULL;
+ UINT32 FileLine;
+
+ GetFileNameLineNum (LineNum, &FileName, &FileLine);
+ printf ("%s line %d: error %s %s\n", FileName, FileLine, TokName, ErrorMsg);
+}
+
+UINT8
+CVfrErrorHandle::HandleError (
+ IN EFI_VFR_RETURN_CODE ErrorCode,
+ IN UINT32 LineNum,
+ IN INT8 *TokName
+ )
+{
+ UINT32 Index;
+ INT8 *FileName = NULL;
+ UINT32 FileLine;
+ INT8 *ErrorMsg = NULL;
+
+ if (mVfrErrorHandleTable == NULL) {
+ return 1;
+ }
+
+ for (Index = 0; mVfrErrorHandleTable[Index].mErrorCode != VFR_RETURN_CODEUNDEFINED; Index++) {
+ if (ErrorCode == mVfrErrorHandleTable[Index].mErrorCode) {
+ ErrorMsg = mVfrErrorHandleTable[Index].mErrorMsg;
+ break;
+ }
+ }
+
+ if (ErrorMsg != NULL) {
+ GetFileNameLineNum (LineNum, &FileName, &FileLine);
+ printf ("%s line %d: error %s %s\n", FileName, FileLine, TokName, ErrorMsg);
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+CVfrErrorHandle gCVfrErrorHandle;
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.h b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.h
new file mode 100644
index 0000000000..5e8ac51ec9
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrError.h
@@ -0,0 +1,67 @@
+#ifndef _VFRERROR_H_
+#define _VFRERROR_H_
+
+#include "Tiano.h"
+#include "EfiTypes.h"
+
+typedef enum {
+ VFR_RETURN_SUCCESS = 0,
+ VFR_RETURN_ERROR_SKIPED,
+ VFR_RETURN_FATAL_ERROR,
+ VFR_RETURN_MISMATCHED,
+ VFR_RETURN_INVALID_PARAMETER,
+ VFR_RETURN_OUT_FOR_RESOURCES,
+ VFR_RETURN_UNSUPPORTED,
+ VFR_RETURN_REDEFINED,
+ VFR_RETURN_FORMID_REDEFINED,
+ VFR_RETURN_QUESTIONID_REDEFINED,
+ VFR_RETURN_VARSTOREID_REDEFINED,
+ VFR_RETURN_UNDEFINED,
+ VFR_RETURN_VAR_NOTDEFINED_BY_QUESTION,
+ VFR_RETURN_GET_EFIVARSTORE_ERROR,
+ VFR_RETURN_EFIVARSTORE_USE_ERROR,
+ VFR_RETURN_EFIVARSTORE_SIZE_ERROR,
+ VFR_RETURN_GET_NVVARSTORE_ERROR,
+ VFR_RETURN_QVAR_REUSE,
+ VFR_RETURN_FLAGS_UNSUPPORTED,
+ VFR_RETURN_ERROR_ARRARY_NUM,
+ VFR_RETURN_DATA_STRING_ERROR,
+ VFR_RETURN_CODEUNDEFINED
+} EFI_VFR_RETURN_CODE;
+
+typedef struct _SVFR_ERROR_HANDLE {
+ EFI_VFR_RETURN_CODE mErrorCode;
+ INT8 *mErrorMsg;
+} SVFR_ERROR_HANDLE;
+
+struct SVfrFileScopeRecord {
+ INT8 *mFileName;
+ UINT32 mWholeScopeLine;
+ UINT32 mScopeLineStart;
+ SVfrFileScopeRecord *mNext;
+
+ SVfrFileScopeRecord (IN INT8 *, IN UINT32);
+ ~SVfrFileScopeRecord();
+};
+
+class CVfrErrorHandle {
+private:
+ SVFR_ERROR_HANDLE *mVfrErrorHandleTable;
+ SVfrFileScopeRecord *mScopeRecordListHead;
+ SVfrFileScopeRecord *mScopeRecordListTail;
+
+public:
+ CVfrErrorHandle (VOID);
+ ~CVfrErrorHandle (VOID);
+
+ VOID ParseFileScopeRecord (IN INT8 *, IN UINT32);
+ VOID GetFileNameLineNum (IN UINT32, OUT INT8 **, OUT UINT32 *);
+ UINT8 HandleError (IN EFI_VFR_RETURN_CODE, IN UINT32 LineNum = 0, IN INT8 *TokName = "\0");
+ VOID PrintError (IN UINT32 LineNum = 0, IN INT8 *TokName = "\0", IN INT8 *ErrorMsg = "\0");
+};
+
+#define CHECK_ERROR_RETURN(f, v) do { EFI_VFR_RETURN_CODE r; if ((r = (f)) != (v)) { return r; } } while (0)
+
+extern CVfrErrorHandle gCVfrErrorHandle;
+
+#endif
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.cpp b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.cpp
new file mode 100644
index 0000000000..2ac1b681bf
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.cpp
@@ -0,0 +1,830 @@
+#include "stdio.h"
+#include "VfrFormPkg.h"
+
+/*
+ * The definition of CFormPkg's member function
+ */
+
+SPendingAssign::SPendingAssign (
+ IN INT8 *Key,
+ IN VOID *Addr,
+ IN UINT32 Len,
+ IN UINT32 LineNo
+ )
+{
+ if (Key != NULL) {
+ mKey = new INT8[strlen (Key) + 1];
+ if (mKey != NULL) {
+ strcpy (mKey, Key);
+ }
+ } else {
+ mKey = NULL;
+ }
+ mAddr = Addr;
+ mLen = Len;
+ mFlag = PENDING;
+ mLineNo = LineNo;
+ mNext = NULL;
+}
+
+SPendingAssign::~SPendingAssign (
+ VOID
+ )
+{
+ if (mKey != NULL) {
+ delete mKey;
+ }
+ mAddr = NULL;
+ mLen = 0;
+ mLineNo = 0;
+ mNext = NULL;
+}
+
+VOID
+SPendingAssign::SetAddrAndLen (
+ IN VOID *Addr,
+ IN UINT32 LineNo
+ )
+{
+ mAddr = Addr;
+ mLineNo = LineNo;
+}
+
+VOID
+SPendingAssign::AssignValue (
+ IN VOID *Addr,
+ IN UINT32 Len
+ )
+{
+ memcpy (mAddr, Addr, (mLen < Len ? mLen : Len));
+ mFlag = ASSIGNED;
+}
+
+INT8 *
+SPendingAssign::GetKey (
+ VOID
+ )
+{
+ return mKey;
+}
+
+CFormPkg::CFormPkg (
+ IN UINT32 BufferSize = 4096
+ )
+{
+ CHAR8 *BufferStart;
+ CHAR8 *BufferEnd;
+ SBufferNode *Node;
+
+ mPkgLength = 0;
+ mBufferNodeQueueHead = NULL;
+ mCurrBufferNode = NULL;
+
+ Node = new SBufferNode;
+ if (Node == NULL) {
+ return ;
+ }
+ BufferStart = new CHAR8[BufferSize];
+ if (BufferStart == NULL) {
+ return;
+ }
+ BufferEnd = BufferStart + BufferSize;
+
+ memset (BufferStart, 0, BufferSize);
+ Node->mBufferStart = BufferStart;
+ Node->mBufferEnd = BufferEnd;
+ Node->mBufferFree = BufferStart;
+ Node->mNext = NULL;
+
+ mBufferSize = BufferSize;
+ mBufferNodeQueueHead = Node;
+ mBufferNodeQueueTail = Node;
+ mCurrBufferNode = Node;
+}
+
+CFormPkg::~CFormPkg ()
+{
+ SBufferNode *pBNode;
+ SPendingAssign *pPNode;
+
+ while (mBufferNodeQueueHead != NULL) {
+ pBNode = mBufferNodeQueueHead;
+ mBufferNodeQueueHead = mBufferNodeQueueHead->mNext;
+ if (pBNode->mBufferStart != NULL) {
+ delete pBNode->mBufferStart;
+ delete pBNode;
+ }
+ }
+ mBufferNodeQueueTail = NULL;
+ mCurrBufferNode = NULL;
+
+ while (PendingAssignList != NULL) {
+ pPNode = PendingAssignList;
+ PendingAssignList = PendingAssignList->mNext;
+ delete pPNode;
+ }
+ PendingAssignList = NULL;
+}
+
+CHAR8 *
+CFormPkg::IfrBinBufferGet (
+ IN UINT32 Len
+ )
+{
+ CHAR8 *BinBuffer = NULL;
+
+ if ((Len == 0) || (Len > mBufferSize)) {
+ return NULL;
+ }
+
+ if ((mCurrBufferNode->mBufferFree + Len) <= mCurrBufferNode->mBufferEnd) {
+ BinBuffer = mCurrBufferNode->mBufferFree;
+ mCurrBufferNode->mBufferFree += Len;
+ } else {
+ SBufferNode *Node;
+
+ Node = new SBufferNode;
+ if (Node == NULL) {
+ return NULL;
+ }
+
+ Node->mBufferStart = new CHAR8[mBufferSize];
+ if (Node->mBufferStart == NULL) {
+ delete Node;
+ return NULL;
+ } else {
+ memset (Node->mBufferStart, 0, mBufferSize);
+ Node->mBufferEnd = Node->mBufferStart + mBufferSize;
+ Node->mBufferFree = Node->mBufferStart;
+ Node->mNext = NULL;
+ }
+
+ if (mBufferNodeQueueTail == NULL) {
+ mBufferNodeQueueHead = mBufferNodeQueueTail = Node;
+ } else {
+ mBufferNodeQueueTail->mNext = Node;
+ mBufferNodeQueueTail = Node;
+ }
+ mCurrBufferNode = Node;
+
+ //
+ // Now try again.
+ //
+ BinBuffer = mCurrBufferNode->mBufferFree;
+ mCurrBufferNode->mBufferFree += Len;
+ }
+
+ mPkgLength += Len;
+
+ return BinBuffer;
+}
+
+inline
+UINT32
+CFormPkg::GetPkgLength (
+ VOID
+ )
+{
+ return mPkgLength;
+}
+
+VOID
+CFormPkg::Open (
+ VOID
+ )
+{
+ mReadBufferNode = mBufferNodeQueueHead;
+ mReadBufferOffset = 0;
+}
+
+VOID
+CFormPkg::Close (
+ VOID
+ )
+{
+ mReadBufferNode = NULL;
+ mReadBufferOffset = 0;
+}
+
+UINT32
+CFormPkg::Read (
+ IN CHAR8 *Buffer,
+ IN UINT32 Size
+ )
+{
+ UINT32 Index;
+
+ if ((Size == 0) || (Buffer == NULL)) {
+ return 0;
+ }
+
+ if (mReadBufferNode == NULL) {
+ return 0;
+ }
+
+ for (Index = 0; Index < Size; Index++) {
+ if ((mReadBufferNode->mBufferStart + mReadBufferOffset) < mReadBufferNode->mBufferFree) {
+ Buffer[Index] = mReadBufferNode->mBufferStart[mReadBufferOffset++];
+ } else {
+ if ((mReadBufferNode = mReadBufferNode->mNext) == NULL) {
+ return Index;
+ } else {
+ mReadBufferOffset = 0;
+ Buffer[Index] = mReadBufferNode->mBufferStart[mReadBufferOffset++];
+ }
+ }
+ }
+
+ return Size;
+}
+
+EFI_VFR_RETURN_CODE
+CFormPkg::BuildPkgHdr (
+ OUT EFI_HII_PACKAGE_HEADER **PkgHdr
+ )
+{
+ if (PkgHdr == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ if (((*PkgHdr) = new EFI_HII_PACKAGE_HEADER) == NULL) {
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+
+ (*PkgHdr)->Type = EFI_HII_PACKAGE_FORM;
+ (*PkgHdr)->Length = mPkgLength + sizeof (EFI_HII_PACKAGE_HEADER);
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CFormPkg::BuildPkg (
+ IN FILE *Output
+ )
+{
+ EFI_VFR_RETURN_CODE Ret;
+ CHAR8 Buffer[1024];
+ UINT32 Size;
+ EFI_HII_PACKAGE_HEADER *PkgHdr;
+
+ if (Output == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ if ((Ret = BuildPkgHdr(&PkgHdr)) != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+ fwrite (PkgHdr, sizeof (EFI_HII_PACKAGE_HEADER), 1, Output);
+ delete PkgHdr;
+
+ Open ();
+ while ((Size = Read (Buffer, 1024)) != 0) {
+ fwrite (Buffer, Size, 1, Output);
+ }
+ Close ();
+
+ return VFR_RETURN_SUCCESS;
+}
+
+VOID
+CFormPkg::_WRITE_PKG_LINE (
+ IN FILE *pFile,
+ IN UINT32 LineBytes,
+ IN INT8 *LineHeader,
+ IN INT8 *BlkBuf,
+ IN UINT32 BlkSize
+ )
+{
+ UINT32 Index;
+
+ if ((pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {
+ return;
+ }
+
+ for (Index = 0; Index < BlkSize; Index++) {
+ if ((Index % LineBytes) == 0) {
+ fprintf (pFile, "\n%s", LineHeader);
+ }
+ fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);
+ }
+}
+
+VOID
+CFormPkg::_WRITE_PKG_END (
+ IN FILE *pFile,
+ IN UINT32 LineBytes,
+ IN INT8 *LineHeader,
+ IN INT8 *BlkBuf,
+ IN UINT32 BlkSize
+ )
+{
+ UINT32 Index;
+
+ if ((BlkSize == 0) || (pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {
+ return;
+ }
+
+ for (Index = 0; Index < BlkSize - 1; Index++) {
+ if ((Index % LineBytes) == 0) {
+ fprintf (pFile, "\n%s", LineHeader);
+ }
+ fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);
+ }
+
+ if ((Index % LineBytes) == 0) {
+ fprintf (pFile, "\n%s", LineHeader);
+ }
+ fprintf (pFile, "0x%02X\n", (UINT8)BlkBuf[Index]);
+}
+
+#define BYTES_PRE_LINE 0x10
+
+EFI_VFR_RETURN_CODE
+CFormPkg::GenCFile (
+ IN INT8 *BaseName,
+ IN FILE *pFile
+ )
+{
+ EFI_VFR_RETURN_CODE Ret;
+ INT8 Buffer[BYTES_PRE_LINE * 8];
+ EFI_HII_PACKAGE_HEADER *PkgHdr;
+ UINT32 PkgLength = 0;
+ UINT32 ReadSize = 0;
+
+ if ((BaseName == NULL) || (pFile == NULL)) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ fprintf (pFile, "\nunsigned char %sBin[] = {\n", BaseName);
+
+ if ((Ret = BuildPkgHdr(&PkgHdr)) != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+
+ fprintf (pFile, " // ARRAY LENGTH\n");
+ PkgLength = PkgHdr->Length + sizeof (UINT32);
+ _WRITE_PKG_LINE(pFile, BYTES_PRE_LINE, " ", (INT8 *)&PkgLength, sizeof (UINT32));
+
+ fprintf (pFile, "\n\n // PACKAGE HEADER\n");
+ _WRITE_PKG_LINE(pFile, BYTES_PRE_LINE, " ", (INT8 *)PkgHdr, sizeof (EFI_HII_PACKAGE_HEADER));
+ PkgLength = sizeof (EFI_HII_PACKAGE_HEADER);
+
+ fprintf (pFile, "\n\n // PACKAGE DATA\n");
+ Open ();
+ while ((ReadSize = Read ((CHAR8 *)Buffer, BYTES_PRE_LINE * 8)) != 0) {
+ PkgLength += ReadSize;
+ if (PkgLength < PkgHdr->Length) {
+ _WRITE_PKG_LINE (pFile, BYTES_PRE_LINE, " ", Buffer, ReadSize);
+ } else {
+ _WRITE_PKG_END (pFile, BYTES_PRE_LINE, " ", Buffer, ReadSize);
+ }
+ }
+ Close ();
+
+ delete PkgHdr;
+ fprintf (pFile, "\n};\n");
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CFormPkg::AssignPending (
+ IN INT8 *Key,
+ IN VOID *ValAddr,
+ IN UINT32 ValLen,
+ IN UINT32 LineNo
+ )
+{
+ SPendingAssign *pNew;
+
+ pNew = new SPendingAssign (Key, ValAddr, ValLen, LineNo);
+ if (pNew == NULL) {
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+
+ pNew->mNext = PendingAssignList;
+ PendingAssignList = pNew;
+ return VFR_RETURN_SUCCESS;
+}
+
+VOID
+CFormPkg::DoPendingAssign (
+ IN INT8 *Key,
+ IN VOID *ValAddr,
+ IN UINT32 ValLen
+ )
+{
+ SPendingAssign *pNode;
+
+ if ((Key == NULL) || (ValAddr == NULL)) {
+ return;
+ }
+
+ for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mKey, Key) == 0) {
+ pNode->AssignValue (ValAddr, ValLen);
+ }
+ }
+}
+
+bool
+CFormPkg::HavePendingUnassigned (
+ VOID
+ )
+{
+ SPendingAssign *pNode;
+
+ for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mFlag == PENDING) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+VOID
+CFormPkg::PendingAssignPrintAll (
+ VOID
+ )
+{
+ SPendingAssign *pNode;
+
+ for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mFlag == PENDING) {
+ gCVfrErrorHandle.PrintError (pNode->mLineNo, pNode->mKey, "can not assign value because not defined");
+ }
+ }
+}
+
+CFormPkg gCFormPkg;
+
+SIfrRecord::SIfrRecord (
+ VOID
+ )
+{
+ mIfrBinBuf = NULL;
+ mBinBufLen = 0;
+ mLineNo = 0xFFFFFFFF;
+ mOffset = 0xFFFFFFFF;
+ mNext = NULL;
+}
+
+SIfrRecord::~SIfrRecord (
+ VOID
+ )
+{
+ if (mIfrBinBuf != NULL) {
+ delete mIfrBinBuf;
+ mIfrBinBuf = NULL;
+ }
+ mLineNo = 0xFFFFFFFF;
+ mOffset = 0xFFFFFFFF;
+ mBinBufLen = 0;
+ mNext = NULL;
+}
+
+CIfrRecordInfoDB::CIfrRecordInfoDB (
+ VOID
+ )
+{
+ mSwitch = FALSE;
+ mRecordCount = EFI_IFR_RECORDINFO_IDX_START;
+ mIfrRecordListHead = NULL;
+ mIfrRecordListTail = NULL;
+}
+
+CIfrRecordInfoDB::~CIfrRecordInfoDB (
+ VOID
+ )
+{
+ SIfrRecord *pNode;
+
+ while (mIfrRecordListHead != NULL) {
+ pNode = mIfrRecordListHead;
+ mIfrRecordListHead = mIfrRecordListHead->mNext;
+ delete pNode;
+ }
+}
+
+SIfrRecord *
+CIfrRecordInfoDB::GetRecordInfoFromIdx (
+ IN UINT32 RecordIdx
+ )
+{
+ UINT32 Idx;
+ SIfrRecord *pNode = NULL;
+
+ if (RecordIdx == EFI_IFR_RECORDINFO_IDX_INVALUD) {
+ return NULL;
+ }
+
+ for (Idx = (EFI_IFR_RECORDINFO_IDX_START + 1), pNode = mIfrRecordListHead;
+ (Idx != RecordIdx) && (pNode != NULL);
+ Idx++, pNode = pNode->mNext)
+ ;
+
+ return pNode;
+}
+
+UINT32
+CIfrRecordInfoDB::IfrRecordRegister (
+ IN UINT32 LineNo,
+ IN CHAR8 *IfrBinBuf,
+ IN UINT8 BinBufLen,
+ IN UINT32 Offset
+ )
+{
+ SIfrRecord *pNew;
+
+ if (mSwitch == FALSE) {
+ return EFI_IFR_RECORDINFO_IDX_INVALUD;
+ }
+
+ if ((pNew = new SIfrRecord) == NULL) {
+ return EFI_IFR_RECORDINFO_IDX_INVALUD;
+ }
+
+ if (mIfrRecordListHead == NULL) {
+ mIfrRecordListHead = pNew;
+ mIfrRecordListTail = pNew;
+ } else {
+ mIfrRecordListTail->mNext = pNew;
+ mIfrRecordListTail = pNew;
+ }
+ mRecordCount++;
+
+ return mRecordCount;
+}
+
+VOID
+CIfrRecordInfoDB::IfrRecordInfoUpdate (
+ IN UINT32 RecordIdx,
+ IN UINT32 LineNo,
+ IN CHAR8 *BinBuf,
+ IN UINT8 BinBufLen,
+ IN UINT32 Offset
+ )
+{
+ SIfrRecord *pNode;
+
+ if ((pNode = GetRecordInfoFromIdx (RecordIdx)) == NULL) {
+ return;
+ }
+
+ pNode->mLineNo = LineNo;
+ pNode->mOffset = Offset;
+ pNode->mBinBufLen = BinBufLen;
+ if (BinBuf != NULL) {
+ if (pNode->mIfrBinBuf != NULL) {
+ delete pNode->mIfrBinBuf;
+ }
+ pNode->mIfrBinBuf = new CHAR8[BinBufLen];
+ if (pNode->mIfrBinBuf != NULL) {
+ memcpy (pNode->mIfrBinBuf, BinBuf, BinBufLen);
+ }
+ }
+}
+
+VOID
+CIfrRecordInfoDB::IfrRecordOutput (
+ IN FILE *File,
+ IN UINT32 LineNo
+ )
+{
+ SIfrRecord *pNode;
+ UINT8 Index;
+
+ if (mSwitch == FALSE) {
+ return;
+ }
+
+ if (File == NULL) {
+ return;
+ }
+
+ for (pNode = mIfrRecordListHead; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mLineNo == LineNo) {
+ fprintf (File, ">%08X: ", pNode->mOffset);
+ if (pNode->mIfrBinBuf != NULL) {
+ for (Index = 0; Index < pNode->mBinBufLen; Index++) {
+ fprintf (File, "%02X ", pNode->mIfrBinBuf[Index]);
+ }
+ }
+ fprintf (File, "\n");
+ }
+ }
+}
+
+CIfrRecordInfoDB gCIfrRecordInfoDB;
+
+VOID
+CIfrObj::_EMIT_PENDING_OBJ (
+ VOID
+ )
+{
+ CHAR8 *ObjBinBuf = NULL;
+
+ ObjBinBuf = gCFormPkg.IfrBinBufferGet (mObjBinLen);
+ if (ObjBinBuf != NULL) {
+ memcpy (ObjBinBuf, mObjBinBuf, mObjBinLen);
+ }
+
+ if (mObjBinBuf != NULL) {
+ delete mObjBinBuf;
+ }
+}
+
+/*
+ * The definition of CIfrObj's member function
+ */
+static struct {
+ UINT8 mSize;
+ UINT8 mScope;
+} gOpcodeSizesScopeTable[] = {
+ { 0, 0 }, // EFI_IFR_INVALID - 0x00
+ { sizeof (EFI_IFR_FORM), 1 }, // EFI_IFR_FORM_OP
+ { sizeof (EFI_IFR_SUBTITLE), 1 }, // EFI_IFR_SUBTITLE_OP
+ { sizeof (EFI_IFR_TEXT), 0 }, // EFI_IFR_TEXT_OP
+ { sizeof (EFI_IFR_IMAGE), 0 }, // EFI_IFR_IMAGE_OP
+ { sizeof (EFI_IFR_ONE_OF), 1 }, // EFI_IFR_ONE_OF_OP - 0x05
+ { sizeof (EFI_IFR_CHECKBOX), 1}, // EFI_IFR_CHECKBOX_OP
+ { sizeof (EFI_IFR_NUMERIC), 1 }, // EFI_IFR_NUMERIC_OP
+ { sizeof (EFI_IFR_PASSWORD), 1 }, // EFI_IFR_PASSWORD_OP
+ { sizeof (EFI_IFR_ONE_OF_OPTION), 0 }, // EFI_IFR_ONE_OF_OPTION_OP
+ { sizeof (EFI_IFR_SUPPRESS_IF), 1 }, // EFI_IFR_SUPPRESS_IF - 0x0A
+ { sizeof (EFI_IFR_LOCKED), 0 }, // EFI_IFR_LOCKED_OP
+ { sizeof (EFI_IFR_ACTION), 1 }, // EFI_IFR_ACTION_OP
+ { sizeof (EFI_IFR_RESET_BUTTON), 1 }, // EFI_IFR_RESET_BUTTON_OP
+ { sizeof (EFI_IFR_FORM_SET), 1 }, // EFI_IFR_FORM_SET_OP -0xE
+ { sizeof (EFI_IFR_REF), 0 }, // EFI_IFR_REF_OP
+ { sizeof (EFI_IFR_NO_SUBMIT_IF), 1}, // EFI_IFR_NO_SUBMIT_IF_OP -0x10
+ { sizeof (EFI_IFR_INCONSISTENT_IF), 1 }, // EFI_IFR_INCONSISTENT_IF_OP
+ { sizeof (EFI_IFR_EQ_ID_VAL), 0 }, // EFI_IFR_EQ_ID_VAL_OP
+ { sizeof (EFI_IFR_EQ_ID_ID), 0 }, // EFI_IFR_EQ_ID_ID_OP
+ { sizeof (EFI_IFR_EQ_ID_LIST), 0 }, // EFI_IFR_EQ_ID_LIST_OP - 0x14
+ { sizeof (EFI_IFR_AND), 0 }, // EFI_IFR_AND_OP
+ { sizeof (EFI_IFR_OR), 0 }, // EFI_IFR_OR_OP
+ { sizeof (EFI_IFR_NOT), 0 }, // EFI_IFR_NOT_OP
+ { sizeof (EFI_IFR_RULE), 1 }, // EFI_IFR_RULE_OP
+ { sizeof (EFI_IFR_GRAY_OUT_IF), 1 }, // EFI_IFR_GRAYOUT_IF_OP - 0x19
+ { sizeof (EFI_IFR_DATE), 1 }, // EFI_IFR_DATE_OP
+ { sizeof (EFI_IFR_TIME), 1 }, // EFI_IFR_TIME_OP
+ { sizeof (EFI_IFR_STRING), 1 }, // EFI_IFR_STRING_OP
+ { sizeof (EFI_IFR_REFRESH), 1 }, // EFI_IFR_REFRESH_OP
+ { sizeof (EFI_IFR_DISABLE_IF), 1 }, // EFI_IFR_DISABLE_IF_OP - 0x1E
+ { 0, 0 }, // 0x1F
+ { sizeof (EFI_IFR_TO_LOWER), 0 }, // EFI_IFR_TO_LOWER_OP - 0x20
+ { sizeof (EFI_IFR_TO_UPPER), 0 }, // EFI_IFR_TO_UPPER_OP - 0x21
+ { 0, 0 }, // 0x22
+ { sizeof (EFI_IFR_ORDERED_LIST), 1 }, // EFI_IFR_ORDERED_LIST_OP - 0x23
+ { sizeof (EFI_IFR_VARSTORE), 0 }, // EFI_IFR_VARSTORE_OP
+ { sizeof (EFI_IFR_VARSTORE_NAME_VALUE), 0 }, // EFI_IFR_VARSTORE_NAME_VALUE_OP
+ { sizeof (EFI_IFR_VARSTORE_EFI), 0 }, // EFI_IFR_VARSTORE_EFI_OP
+ { sizeof (EFI_IFR_VARSTORE_DEVICE), 1 }, // EFI_IFR_VARSTORE_DEVICE_OP
+ { sizeof (EFI_IFR_VERSION), 0 }, // EFI_IFR_VERSION_OP - 0x28
+ { sizeof (EFI_IFR_END), 0 }, // EFI_IFR_END_OP
+ { sizeof (EFI_IFR_MATCH), 1 }, // EFI_IFR_MATCH_OP - 0x2A
+ { 0, 0 }, { 0, 0} , { 0, 0} , { 0, 0} , // 0x2B ~ 0x2E
+ { sizeof (EFI_IFR_EQUAL), 0 }, // EFI_IFR_EQUAL_OP - 0x2F
+ { sizeof (EFI_IFR_NOT_EQUAL), 0 }, // EFI_IFR_NOT_EQUAL_OP
+ { sizeof (EFI_IFR_GREATER_THAN), 0 }, // EFI_IFR_GREATER_THAN_OP
+ { sizeof (EFI_IFR_GREATER_EQUAL), 0 }, // EFI_IFR_GREATER_EQUAL_OP
+ { sizeof (EFI_IFR_LESS_THAN), 0 }, // EFI_IFR_LESS_THAN_OP
+ { sizeof (EFI_IFR_LESS_EQUAL), 0 }, // EFI_IFR_LESS_EQUAL_OP - 0x34
+ { sizeof (EFI_IFR_BITWISE_AND), 0 }, // EFI_IFR_BITWISE_AND_OP
+ { sizeof (EFI_IFR_BITWISE_OR), 0 }, // EFI_IFR_BITWISE_OR_OP
+ { sizeof (EFI_IFR_BITWISE_NOT), 0 }, // EFI_IFR_BITWISE_NOT_OP
+ { sizeof (EFI_IFR_SHIFT_LEFT), 0 }, // EFI_IFR_SHIFT_LEFT_OP
+ { sizeof (EFI_IFR_SHIFT_RIGHT), 0 }, // EFI_IFR_SHIFT_RIGHT_OP
+ { sizeof (EFI_IFR_ADD), 0 }, // EFI_IFR_ADD_OP - 0x3A
+ { sizeof (EFI_IFR_SUBTRACT), 0 }, // EFI_IFR_SUBTRACT_OP
+ { sizeof (EFI_IFR_MULTIPLY), 0 }, // EFI_IFR_MULTIPLY_OP
+ { sizeof (EFI_IFR_DIVIDE), 0 }, // EFI_IFR_DIVIDE_OP
+ { sizeof (EFI_IFR_MODULO), 0 }, // EFI_IFR_MODULO_OP - 0x3E
+ { sizeof (EFI_IFR_RULE_REF), 0 }, // EFI_IFR_RULE_REF_OP
+ { sizeof (EFI_IFR_QUESTION_REF1), 0 }, // EFI_IFR_QUESTION_REF1_OP
+ { sizeof (EFI_IFR_QUESTION_REF2), 0 }, // EFI_IFR_QUESTION_REF2_OP - 0x41
+ { sizeof (EFI_IFR_UINT8), 0}, // EFI_IFR_UINT8
+ { sizeof (EFI_IFR_UINT16), 0}, // EFI_IFR_UINT16
+ { sizeof (EFI_IFR_UINT32), 0}, // EFI_IFR_UINT32
+ { sizeof (EFI_IFR_UINT64), 0}, // EFI_IFR_UTNT64
+ { sizeof (EFI_IFR_TRUE), 0 }, // EFI_IFR_TRUE_OP - 0x46
+ { sizeof (EFI_IFR_FALSE), 0 }, // EFI_IFR_FALSE_OP
+ { sizeof (EFI_IFR_TO_UINT), 0 }, // EFI_IFR_TO_UINT_OP
+ { sizeof (EFI_IFR_TO_STRING), 0 }, // EFI_IFR_TO_STRING_OP
+ { sizeof (EFI_IFR_TO_BOOLEAN), 0 }, // EFI_IFR_TO_BOOLEAN_OP
+ { sizeof (EFI_IFR_MID), 0 }, // EFI_IFR_MID_OP
+ { sizeof (EFI_IFR_FIND), 0 }, // EFI_IFR_FIND_OP
+ { sizeof (EFI_IFR_TOKEN), 0 }, // EFI_IFR_TOKEN_OP
+ { sizeof (EFI_IFR_STRING_REF1), 0 }, // EFI_IFR_STRING_REF1_OP - 0x4E
+ { sizeof (EFI_IFR_STRING_REF2), 0 }, // EFI_IFR_STRING_REF2_OP
+ { sizeof (EFI_IFR_CONDITIONAL), 0 }, // EFI_IFR_CONDITIONAL_OP
+ { sizeof (EFI_IFR_QUESTION_REF3), 0 }, // EFI_IFR_QUESTION_REF3_OP
+ { sizeof (EFI_IFR_ZERO), 0 }, // EFI_IFR_ZERO_OP
+ { sizeof (EFI_IFR_ONE), 0 }, // EFI_IFR_ONE_OP
+ { sizeof (EFI_IFR_ONES), 0 }, // EFI_IFR_ONES_OP
+ { sizeof (EFI_IFR_UNDEFINED), 0 }, // EFI_IFR_UNDEFINED_OP
+ { sizeof (EFI_IFR_LENGTH), 0 }, // EFI_IFR_LENGTH_OP
+ { sizeof (EFI_IFR_DUP), 0 }, // EFI_IFR_DUP_OP - 0x57
+ { sizeof (EFI_IFR_THIS), 0 }, // EFI_IFR_THIS_OP
+ { sizeof (EFI_IFR_SPAN), 0 }, // EFI_IFR_SPAN_OP
+ { sizeof (EFI_IFR_VALUE), 1 }, // EFI_IFR_VALUE_OP
+ { sizeof (EFI_IFR_DEFAULT), 0 }, // EFI_IFR_DEFAULT_OP
+ { sizeof (EFI_IFR_DEFAULTSTORE), 0 }, // EFI_IFR_DEFAULTSTORE_OP - 0x5C
+ { 0, 0}, // 0x5D
+ { sizeof (EFI_IFR_CATENATE), 0 }, // EFI_IFR_CATENATE_OP
+ { sizeof (EFI_IFR_GUID), 0 }, // EFI_IFR_GUID_OP
+};
+
+#ifdef CIFROBJ_DEUBG
+static struct {
+ INT8 *mIfrName;
+} gIfrObjPrintDebugTable[] = {
+ "EFI_IFR_INVALID", "EFI_IFR_FORM", "EFI_IFR_SUBTITLE", "EFI_IFR_TEXT", "EFI_IFR_IMAGE", "EFI_IFR_ONE_OF",
+ "EFI_IFR_CHECKBOX", "EFI_IFR_NUMERIC", "EFI_IFR_PASSWORD", "EFI_IFR_ONE_OF_OPTION", "EFI_IFR_SUPPRESS_IF", "EFI_IFR_LOCKED",
+ "EFI_IFR_ACTION", "EFI_IFR_RESET_BUTTON", "EFI_IFR_FORM_SET", "EFI_IFR_REF", "EFI_IFR_NO_SUBMIT_IF", "EFI_IFR_INCONSISTENT_IF",
+ "EFI_IFR_EQ_ID_VAL", "EFI_IFR_EQ_ID_ID", "EFI_IFR_EQ_ID_LIST", "EFI_IFR_AND", "EFI_IFR_OR", "EFI_IFR_NOT",
+ "EFI_IFR_RULE", "EFI_IFR_GRAY_OUT_IF", "EFI_IFR_DATE", "EFI_IFR_TIME", "EFI_IFR_STRING", "EFI_IFR_REFRESH",
+ "EFI_IFR_DISABLE_IF", "EFI_IFR_INVALID", "EFI_IFR_TO_LOWER", "EFI_IFR_TO_UPPER", "EFI_IFR_INVALID", "EFI_IFR_ORDERED_LIST",
+ "EFI_IFR_VARSTORE", "EFI_IFR_VARSTORE_NAME_VALUE", "EFI_IFR_VARSTORE_EFI", "EFI_IFR_VARSTORE_DEVICE", "EFI_IFR_VERSION", "EFI_IFR_END",
+ "EFI_IFR_MATCH", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_INVALID", "EFI_IFR_EQUAL",
+ "EFI_IFR_NOT_EQUAL", "EFI_IFR_GREATER_THAN", "EFI_IFR_GREATER_EQUAL", "EFI_IFR_LESS_THAN", "EFI_IFR_LESS_EQUAL", "EFI_IFR_BITWISE_AND",
+ "EFI_IFR_BITWISE_OR", "EFI_IFR_BITWISE_NOT", "EFI_IFR_SHIFT_LEFT", "EFI_IFR_SHIFT_RIGHT", "EFI_IFR_ADD", "EFI_IFR_SUBTRACT",
+ "EFI_IFR_MULTIPLY", "EFI_IFR_DIVIDE", "EFI_IFR_MODULO", "EFI_IFR_RULE_REF", "EFI_IFR_QUESTION_REF1", "EFI_IFR_QUESTION_REF2",
+ "EFI_IFR_UINT8", "EFI_IFR_UINT16", "EFI_IFR_UINT32", "EFI_IFR_UINT64", "EFI_IFR_TRUE", "EFI_IFR_FALSE",
+ "EFI_IFR_TO_UINT", "EFI_IFR_TO_STRING", "EFI_IFR_TO_BOOLEAN", "EFI_IFR_MID", "EFI_IFR_FIND", "EFI_IFR_TOKEN",
+ "EFI_IFR_STRING_REF1","EFI_IFR_STRING_REF2", "EFI_IFR_CONDITIONAL", "EFI_IFR_QUESTION_REF3", "EFI_IFR_ZERO", "EFI_IFR_ONE",
+ "EFI_IFR_ONES", "EFI_IFR_UNDEFINED", "EFI_IFR_LENGTH", "EFI_IFR_DUP", "EFI_IFR_THIS", "EFI_IFR_SPAN",
+ "EFI_IFR_VALUE", "EFI_IFR_DEFAULT", "EFI_IFR_DEFAULTSTORE", "EFI_IFR_INVALID", "EFI_IFR_CATENATE", "EFI_IFR_GUID",
+};
+
+VOID
+CIFROBJ_DEBUG_PRINT (
+ IN UINT8 OpCode
+ )
+{
+ printf ("======Create IFR [%s]\n", gIfrObjPrintDebugTable[OpCode].mIfrName);
+}
+#else
+
+#define CIFROBJ_DEBUG_PRINT(OpCode)
+
+#endif
+
+bool gCreateOp = TRUE;
+
+CIfrObj::CIfrObj (
+ IN UINT8 OpCode,
+ OUT CHAR8 **IfrObj,
+ IN UINT8 ObjBinLen,
+ IN BOOLEAN DelayEmit
+ )
+{
+ mDelayEmit = DelayEmit;
+ mPkgOffset = gCFormPkg.GetPkgLength ();
+ mObjBinLen = (ObjBinLen == 0) ? gOpcodeSizesScopeTable[OpCode].mSize : ObjBinLen;
+ mObjBinBuf = ((DelayEmit == FALSE) && (gCreateOp == TRUE)) ? gCFormPkg.IfrBinBufferGet (mObjBinLen) : new CHAR8[EFI_IFR_MAX_LENGTH];
+ mRecordIdx = (gCreateOp == TRUE) ? gCIfrRecordInfoDB.IfrRecordRegister (0xFFFFFFFF, mObjBinBuf, mObjBinLen, mPkgOffset) : EFI_IFR_RECORDINFO_IDX_INVALUD;
+
+ if (IfrObj != NULL) {
+ *IfrObj = mObjBinBuf;
+ }
+
+ CIFROBJ_DEBUG_PRINT (OpCode);
+}
+
+CIfrObj::~CIfrObj (
+ VOID
+ )
+{
+ if ((mDelayEmit == TRUE) && ((gCreateOp == TRUE))) {
+ _EMIT_PENDING_OBJ ();
+ }
+
+ gCIfrRecordInfoDB.IfrRecordInfoUpdate (mRecordIdx, mLineNo, mObjBinBuf, mObjBinLen, mPkgOffset);
+}
+
+/*
+ * The definition of CIfrObj's member function
+ */
+UINT8 gScopeCount = 0;
+
+CIfrOpHeader::CIfrOpHeader (
+ IN UINT8 OpCode,
+ IN VOID *StartAddr,
+ IN UINT8 Length
+ ) : mHeader ((EFI_IFR_OP_HEADER *)StartAddr)
+{
+ mHeader->OpCode = OpCode;
+ mHeader->Length = (Length == 0) ? gOpcodeSizesScopeTable[OpCode].mSize : Length;
+ mHeader->Scope = (gOpcodeSizesScopeTable[OpCode].mScope + gScopeCount > 0) ? 1 : 0;
+}
+
+CIfrOpHeader::CIfrOpHeader (
+ IN CIfrOpHeader &OpHdr
+ )
+{
+ mHeader = OpHdr.mHeader;
+}
+
+UINT32 CIfrForm::FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE] = {0, };
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.h b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.h
new file mode 100644
index 0000000000..67afbdd369
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrFormPkg.h
@@ -0,0 +1,2252 @@
+#ifndef _EFIIFRCLASS_H_
+#define _EFIIFRCLASS_H_
+
+#include "string.h"
+#include "EfiVfr.h"
+#include "VfrError.h"
+#include "VfrUtilityLib.h"
+
+/*
+ * The functions below are used for flags setting
+ */
+static inline BOOLEAN _FLAGS_ZERO (
+ IN UINT8 &Flags
+ )
+{
+ return Flags == 0;
+}
+
+static inline VOID _FLAG_CLEAR (
+ IN UINT8 &Flags,
+ IN UINT8 Mask
+ )
+{
+ Flags &= (~Mask);
+}
+
+static inline UINT8 _FLAG_TEST_AND_CLEAR (
+ IN UINT8 &Flags,
+ IN UINT8 Mask
+ )
+{
+ UINT8 Ret = Flags & Mask;
+ Flags &= (~Mask);
+ return Ret;
+}
+
+static inline UINT8 _IS_EQUAL (
+ IN UINT8 &Flags,
+ IN UINT8 Value
+ )
+{
+ return Flags == Value;
+}
+
+/*
+ * The definition of CIfrBin
+ */
+typedef enum {
+ PENDING,
+ ASSIGNED
+} ASSIGN_FLAG;
+
+struct SPendingAssign {
+ INT8 *mKey; // key ! unique
+ VOID *mAddr;
+ UINT32 mLen;
+ ASSIGN_FLAG mFlag;
+ UINT32 mLineNo;
+ struct SPendingAssign *mNext;
+
+ SPendingAssign (IN INT8 *, IN VOID *, IN UINT32, IN UINT32);
+ ~SPendingAssign ();
+
+ VOID SetAddrAndLen (IN VOID *, IN UINT32);
+ VOID AssignValue (IN VOID *, IN UINT32);
+ INT8 * GetKey (VOID);
+};
+
+struct SBufferNode {
+ CHAR8 *mBufferStart;
+ CHAR8 *mBufferEnd;
+ CHAR8 *mBufferFree;
+ struct SBufferNode *mNext;
+};
+
+class CFormPkg {
+private:
+ UINT32 mBufferSize;
+ SBufferNode *mBufferNodeQueueHead;
+ SBufferNode *mBufferNodeQueueTail;
+ SBufferNode *mCurrBufferNode;
+
+ SBufferNode *mReadBufferNode;
+ UINT32 mReadBufferOffset;
+
+ UINT32 mPkgLength;
+
+ VOID _WRITE_PKG_LINE (IN FILE *, IN UINT32 , IN INT8 *, IN INT8 *, IN UINT32);
+ VOID _WRITE_PKG_END (IN FILE *, IN UINT32 , IN INT8 *, IN INT8 *, IN UINT32);
+
+private:
+ SPendingAssign *PendingAssignList;
+
+public:
+ CFormPkg (IN UINT32 BufferSize);
+ ~CFormPkg ();
+
+ CHAR8 * IfrBinBufferGet (IN UINT32);
+ inline UINT32 GetPkgLength (VOID);
+
+ VOID Open ();
+ UINT32 Read (IN CHAR8 *, IN UINT32);
+ VOID Close ();
+
+ EFI_VFR_RETURN_CODE BuildPkgHdr (OUT EFI_HII_PACKAGE_HEADER **);
+ EFI_VFR_RETURN_CODE BuildPkg (IN FILE *);
+ EFI_VFR_RETURN_CODE GenCFile (IN INT8 *, IN FILE *);
+
+public:
+ EFI_VFR_RETURN_CODE AssignPending (IN INT8 *, IN VOID *, IN UINT32, IN UINT32);
+ VOID DoPendingAssign (IN INT8 *, IN VOID *, IN UINT32);
+ bool HavePendingUnassigned (VOID);
+ VOID PendingAssignPrintAll (VOID);
+};
+
+extern CFormPkg gCFormPkg;
+
+struct SIfrRecord {
+ UINT32 mLineNo;
+ CHAR8 *mIfrBinBuf;
+ UINT8 mBinBufLen;
+ UINT32 mOffset;
+ SIfrRecord *mNext;
+
+ SIfrRecord (VOID);
+ ~SIfrRecord (VOID);
+};
+
+#define EFI_IFR_RECORDINFO_IDX_INVALUD 0xFFFFFF
+#define EFI_IFR_RECORDINFO_IDX_START 0x0
+
+class CIfrRecordInfoDB {
+private:
+ bool mSwitch;
+ UINT32 mRecordCount;
+ SIfrRecord *mIfrRecordListHead;
+ SIfrRecord *mIfrRecordListTail;
+
+ SIfrRecord * GetRecordInfoFromIdx (IN UINT32);
+public:
+ CIfrRecordInfoDB (VOID);
+ ~CIfrRecordInfoDB (VOID);
+
+ inline VOID TurnOn (VOID) {
+ mSwitch = TRUE;
+ }
+
+ inline VOID TurnOff (VOID) {
+ mSwitch = FALSE;
+ }
+
+ UINT32 IfrRecordRegister (IN UINT32, IN CHAR8 *, IN UINT8, IN UINT32);
+ VOID IfrRecordInfoUpdate (IN UINT32, IN UINT32, IN CHAR8*, IN UINT8, IN UINT32);
+ VOID IfrRecordOutput (IN FILE *, IN UINT32 LineNo);
+};
+
+extern CIfrRecordInfoDB gCIfrRecordInfoDB;
+
+/*
+ * The definition of CIfrObj
+ */
+extern bool gCreateOp;
+
+class CIfrObj {
+private:
+ bool mDelayEmit;
+
+ CHAR8 *mObjBinBuf;
+ UINT8 mObjBinLen;
+ UINT32 mLineNo;
+ UINT32 mRecordIdx;
+ UINT32 mPkgOffset;
+
+ VOID _EMIT_PENDING_OBJ (VOID);
+
+public:
+ CIfrObj (IN UINT8 OpCode, OUT CHAR8 **IfrObj = NULL, IN UINT8 ObjBinLen = 0, IN BOOLEAN DelayEmit = FALSE);
+ virtual ~CIfrObj(VOID);
+
+ inline VOID SetLineNo (IN UINT32 LineNo) {
+ mLineNo = LineNo;
+ }
+
+ inline CHAR8 * GetObjBinAddr (VOID) {
+ return mObjBinBuf;
+ }
+
+ inline UINT8 GetObjBinLen (VOID) {
+ return mObjBinLen;
+ }
+
+ inline bool ExpendObjBin (IN UINT8 Size) {
+ if ((mDelayEmit == TRUE) && ((mObjBinLen + Size) > mObjBinLen)) {
+ mObjBinLen += Size;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ }
+};
+
+/*
+ * The definition of CIfrOpHeader
+ */
+class CIfrOpHeader {
+private:
+ EFI_IFR_OP_HEADER *mHeader;
+
+public:
+ CIfrOpHeader (IN UINT8 OpCode, IN VOID *StartAddr, IN UINT8 Length = 0);
+ CIfrOpHeader (IN CIfrOpHeader &);
+
+ VOID IncLength (UINT8 Size) {
+ if ((mHeader->Length + Size) > mHeader->Length) {
+ mHeader->Length += Size;
+ }
+ }
+
+ VOID DecLength (UINT8 Size) {
+ if (mHeader->Length >= Size) {
+ mHeader -= Size;
+ }
+ }
+
+ UINT8 GetLength () {
+ return mHeader->Length;
+ }
+
+ UINT8 GetScope () {
+ return mHeader->Scope;
+ }
+
+ VOID SetScope (IN UINT8 Scope) {
+ mHeader->Scope = Scope;
+ }
+};
+
+extern UINT8 gScopeCount;
+
+/*
+ * The definition of CIfrStatementHeader
+ */
+class CIfrStatementHeader {
+private:
+ EFI_IFR_STATEMENT_HEADER *mHeader;
+
+public:
+ CIfrStatementHeader (
+ IN EFI_IFR_STATEMENT_HEADER *StartAddr
+ ) : mHeader ((EFI_IFR_STATEMENT_HEADER *)StartAddr) {
+ mHeader = StartAddr;
+ mHeader->Help = EFI_STRING_ID_INVALID;
+ mHeader->Prompt = EFI_STRING_ID_INVALID;
+ }
+
+ EFI_IFR_STATEMENT_HEADER *GetStatementHeader () {
+ return mHeader;
+ }
+
+ VOID SetPrompt (IN EFI_STRING_ID Prompt) {
+ mHeader->Prompt = Prompt;
+ }
+
+ VOID SetHelp (IN EFI_STRING_ID Help) {
+ mHeader->Help = Help;
+ }
+};
+
+/*
+ * The definition of CIfrQuestionHeader
+ */
+#define EFI_IFR_QUESTION_FLAG_DEFAULT 0
+
+class CIfrQuestionHeader : public CIfrStatementHeader {
+private:
+ EFI_IFR_QUESTION_HEADER *mHeader;
+
+ EFI_IFR_STATEMENT_HEADER * QH2SH (EFI_IFR_QUESTION_HEADER *Qheader) {
+ return &(Qheader)->Header;
+ }
+
+public:
+ EFI_QUESTION_ID QUESTION_ID (VOID) {
+ return mHeader->QuestionId;
+ }
+
+ EFI_VARSTORE_ID VARSTORE_ID (VOID) {
+ return mHeader->VarStoreId;
+ }
+
+ VOID VARSTORE_INFO (OUT EFI_VARSTORE_INFO *Info) {
+ if (Info != NULL) {
+ Info->mVarStoreId = mHeader->VarStoreId;
+ memcpy (&Info->mVarStoreId, &mHeader->VarStoreInfo, sizeof (Info->mVarStoreId));
+ }
+ }
+
+ UINT8 FLAGS (VOID) {
+ return mHeader->Flags;
+ }
+
+public:
+ CIfrQuestionHeader (
+ IN EFI_IFR_QUESTION_HEADER *StartAddr,
+ IN UINT8 Flags = EFI_IFR_QUESTION_FLAG_DEFAULT
+ ) : CIfrStatementHeader (QH2SH(StartAddr)) {
+ mHeader = StartAddr;
+ mHeader->QuestionId = EFI_QUESTION_ID_INVALID;
+ mHeader->VarStoreId = EFI_VARSTORE_ID_INVALID;
+ mHeader->VarStoreInfo.VarName = EFI_STRING_ID_INVALID;
+ mHeader->VarStoreInfo.VarOffset = EFI_VAROFFSET_INVALID;
+ mHeader->Flags = Flags;
+ }
+
+ VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
+ mHeader->QuestionId = QuestionId;
+ }
+
+ VOID SetVarStoreInfo (IN EFI_VARSTORE_INFO *Info) {
+ mHeader->VarStoreId = Info->mVarStoreId;
+ mHeader->VarStoreInfo.VarName = Info->mInfo.mVarName;
+ mHeader->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 Flags) {
+ if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_READ_ONLY)) {
+ mHeader->Flags |= EFI_IFR_FLAG_READ_ONLY;
+ }
+
+ _FLAG_CLEAR (Flags, 0x02);
+
+ if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_CALLBACK)) {
+ mHeader->Flags |= EFI_IFR_FLAG_CALLBACK;
+ }
+
+ _FLAG_CLEAR (Flags, 0x08);
+
+ if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_RESET_REQUIRED)) {
+ mHeader->Flags |= EFI_IFR_FLAG_RESET_REQUIRED;
+ }
+
+ _FLAG_CLEAR (Flags, 0x20);
+
+ if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_OPTIONS_ONLY)) {
+ mHeader->Flags |= EFI_IFR_FLAG_OPTIONS_ONLY;
+ }
+
+ return _FLAGS_ZERO (Flags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+};
+
+static CIfrQuestionHeader *gCurrentQuestion = NULL;
+
+/*
+ * The definition of CIfrMinMaxStepData
+ */
+class CIfrMinMaxStepData {
+private:
+ MINMAXSTEP_DATA *mMinMaxStepData;
+
+public:
+ CIfrMinMaxStepData (MINMAXSTEP_DATA *DataAddr) : mMinMaxStepData (DataAddr) {
+ mMinMaxStepData->u64.MinValue = 0;
+ mMinMaxStepData->u64.MaxValue = 0;
+ mMinMaxStepData->u64.Step = 0;
+ }
+
+ VOID SetMinMaxStepData (IN UINT64 MinValue, IN UINT64 MaxValue, IN UINT64 Step) {
+ mMinMaxStepData->u64.MinValue = MinValue;
+ mMinMaxStepData->u64.MaxValue = MaxValue;
+ mMinMaxStepData->u64.Step = Step;
+ }
+
+ VOID SetMinMaxStepData (IN UINT32 MinValue, IN UINT32 MaxValue, IN UINT32 Step) {
+ mMinMaxStepData->u32.MinValue = MinValue;
+ mMinMaxStepData->u32.MaxValue = MaxValue;
+ mMinMaxStepData->u32.Step = Step;
+ }
+
+ VOID SetMinMaxStepData (IN UINT16 MinValue, IN UINT16 MaxValue, IN UINT16 Step) {
+ mMinMaxStepData->u16.MinValue = MinValue;
+ mMinMaxStepData->u16.MaxValue = MaxValue;
+ mMinMaxStepData->u16.Step = Step;
+ }
+
+ VOID SetMinMaxStepData (IN UINT8 MinValue, IN UINT8 MaxValue, IN UINT8 Step) {
+ mMinMaxStepData->u8.MinValue = MinValue;
+ mMinMaxStepData->u8.MaxValue = MaxValue;
+ mMinMaxStepData->u8.Step = Step;
+ }
+
+};
+
+/*
+ * The definition of all of the UEFI IFR Objects
+ */
+class CIfrFormSet : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_FORM_SET *mFormSet;
+
+public:
+ CIfrFormSet () : CIfrObj (EFI_IFR_FORM_SET_OP, (CHAR8 **)&mFormSet),
+ CIfrOpHeader (EFI_IFR_FORM_SET_OP, &mFormSet->Header) {
+ mFormSet->Help = EFI_STRING_ID_INVALID;
+ mFormSet->FormSetTitle = EFI_STRING_ID_INVALID;
+ memset (&mFormSet->Guid, 0, sizeof (EFI_GUID));
+ }
+
+ VOID SetGuid (IN EFI_GUID *Guid) {
+ memcpy (&mFormSet->Guid, Guid, sizeof (EFI_GUID));
+ }
+
+ VOID SetFormSetTitle (IN EFI_STRING_ID FormSetTitle) {
+ mFormSet->FormSetTitle = FormSetTitle;
+ }
+
+ VOID SetHelp (IN EFI_STRING_ID Help) {
+ mFormSet->Help = Help;
+ }
+};
+
+class CIfrEnd : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_END *mEnd;
+
+public:
+ CIfrEnd () : CIfrObj (EFI_IFR_END_OP, (CHAR8 **)&mEnd),
+ CIfrOpHeader (EFI_IFR_END_OP, &mEnd->Header) {}
+};
+
+class CIfrDefaultStore : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_DEFAULTSTORE *mDefaultStore;
+
+public:
+ CIfrDefaultStore () : CIfrObj (EFI_IFR_DEFAULTSTORE_OP, (CHAR8 **)&mDefaultStore),
+ CIfrOpHeader (EFI_IFR_DEFAULTSTORE_OP, &mDefaultStore->Header) {
+ mDefaultStore->DefaultId = EFI_VARSTORE_ID_INVALID;
+ mDefaultStore->DefaultName = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetDefaultName (IN EFI_STRING_ID DefaultName) {
+ mDefaultStore->DefaultName = DefaultName;
+ }
+
+ VOID SetDefaultId (IN UINT16 DefaultId) {
+ mDefaultStore->DefaultId = DefaultId;
+ }
+};
+
+#define EFI_FORM_ID_MAX 0xFFFF
+#define EFI_FREE_FORM_ID_BITMAP_SIZE ((EFI_FORM_ID_MAX + 1) / EFI_BITS_PER_UINT32)
+
+class CIfrForm : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_FORM *mForm;
+
+ STATIC UINT32 FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE];
+
+ STATIC BOOLEAN ChekFormIdFree (IN EFI_FORM_ID FormId) {
+ UINT32 Index = (FormId / EFI_BITS_PER_UINT32);
+ UINT32 Offset = (FormId % EFI_BITS_PER_UINT32);
+
+ return (FormIdBitMap[Index] & (0x80000000 >> Offset)) == 0;
+ }
+
+ STATIC VOID MarkFormIdUsed (IN EFI_FORM_ID FormId) {
+ UINT32 Index = (FormId / EFI_BITS_PER_UINT32);
+ UINT32 Offset = (FormId % EFI_BITS_PER_UINT32);
+
+ FormIdBitMap[Index] |= (0x80000000 >> Offset);
+ }
+
+public:
+ CIfrForm () : CIfrObj (EFI_IFR_FORM_OP, (CHAR8 **)&mForm),
+ CIfrOpHeader (EFI_IFR_FORM_OP, &mForm->Header) {
+ mForm->FormId = 0;
+ mForm->FormTitle = EFI_STRING_ID_INVALID;
+ }
+
+ EFI_VFR_RETURN_CODE SetFormId (IN EFI_FORM_ID FormId) {
+ if (CIfrForm::ChekFormIdFree (FormId) == FALSE) {
+ return VFR_RETURN_FORMID_REDEFINED;
+ }
+ mForm->FormId = FormId;
+ CIfrForm::MarkFormIdUsed (FormId);
+ return VFR_RETURN_SUCCESS;
+ }
+
+ VOID SetFormTitle (IN EFI_STRING_ID FormTitle) {
+ mForm->FormTitle = FormTitle;
+ }
+};
+
+class CIfrVarStore : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_VARSTORE *mVarStore;
+
+public:
+ CIfrVarStore () : CIfrObj (EFI_IFR_VARSTORE_OP, (CHAR8 **)&mVarStore, sizeof (EFI_IFR_VARSTORE), TRUE),
+ CIfrOpHeader (EFI_IFR_VARSTORE_OP, &mVarStore->Header) {
+ mVarStore->VarStoreId = EFI_VARSTORE_ID_INVALID;
+ mVarStore->Size = 0;
+ memset (&mVarStore->Guid, 0, sizeof (EFI_GUID));
+ mVarStore->Name[0] = '\0';
+ }
+
+ VOID SetGuid (IN EFI_GUID *Guid) {
+ memcpy (&mVarStore->Guid, Guid, sizeof (EFI_GUID));
+ }
+
+ VOID SetVarStoreId (IN EFI_VARSTORE_ID VarStoreId) {
+ mVarStore->VarStoreId = VarStoreId;
+ }
+
+ VOID SetSize (IN UINT16 Size) {
+ mVarStore->Size = Size;
+ }
+
+ VOID SetName (IN INT8 *Name) {
+ UINT8 Len;
+
+ if (Name != NULL) {
+ Len = strlen (Name);
+ if (Len != 0) {
+ if (ExpendObjBin (Len) == TRUE) {
+ IncLength (Len);
+ strcpy ((INT8 *)(mVarStore->Name), Name);
+ }
+ }
+ }
+ }
+};
+
+class CIfrVarStoreEfi : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_VARSTORE_EFI *mVarStoreEfi;
+
+public:
+ CIfrVarStoreEfi () : CIfrObj (EFI_IFR_VARSTORE_EFI_OP, (CHAR8 **)&mVarStoreEfi),
+ CIfrOpHeader (EFI_IFR_VARSTORE_EFI_OP, &mVarStoreEfi->Header) {
+ mVarStoreEfi->VarStoreId = EFI_VAROFFSET_INVALID;
+ memset (&mVarStoreEfi->Guid, 0, sizeof (EFI_GUID));
+ }
+
+ VOID SetGuid (IN EFI_GUID *Guid) {
+ memcpy (&mVarStoreEfi->Guid, Guid, sizeof (EFI_GUID));
+ }
+
+ VOID SetVarStoreId (IN UINT16 VarStoreId) {
+ mVarStoreEfi->VarStoreId = VarStoreId;
+ }
+
+ VOID SetAttributes (IN UINT32 Attributes) {
+ mVarStoreEfi->Attributes = Attributes;
+ }
+};
+
+class CIfrVarStoreNameValue : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_VARSTORE_NAME_VALUE *mVarStoreNameValue;
+
+public:
+ CIfrVarStoreNameValue () : CIfrObj (EFI_IFR_VARSTORE_NAME_VALUE_OP, (CHAR8 **)&mVarStoreNameValue),
+ CIfrOpHeader (EFI_IFR_VARSTORE_NAME_VALUE_OP, &mVarStoreNameValue->Header) {
+ mVarStoreNameValue->VarStoreId = EFI_VAROFFSET_INVALID;
+ memset (&mVarStoreNameValue->Guid, 0, sizeof (EFI_GUID));
+ }
+
+ VOID SetGuid (IN EFI_GUID *Guid) {
+ memcpy (&mVarStoreNameValue->Guid, Guid, sizeof (EFI_GUID));
+ }
+
+ VOID SetVarStoreId (IN UINT16 VarStoreId) {
+ mVarStoreNameValue->VarStoreId = VarStoreId;
+ }
+};
+
+class CIfrImage : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_IMAGE *mImage;
+
+public:
+ CIfrImage () : CIfrObj (EFI_IFR_IMAGE_OP, (CHAR8 **)&mImage),
+ CIfrOpHeader (EFI_IFR_FORM_OP, &mImage->Header) {
+ mImage->Id = EFI_IMAGE_ID_INVALID;
+ }
+
+ VOID SetImageId (IN EFI_IMAGE_ID ImageId) {
+ mImage->Id = ImageId;
+ }
+};
+
+class CIfrLocked : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_LOCKED *mLocked;
+
+public:
+ CIfrLocked () : CIfrObj (EFI_IFR_LOCKED_OP, (CHAR8 **)&mLocked),
+ CIfrOpHeader (EFI_IFR_LOCKED_OP, &mLocked->Header) {}
+};
+
+class CIfrRule : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_RULE *mRule;
+
+public:
+ CIfrRule () : CIfrObj (EFI_IFR_RULE_OP, (CHAR8 **)&mRule),
+ mRule ((EFI_IFR_RULE *)GetObjBinAddr()),
+ CIfrOpHeader (EFI_IFR_RULE_OP, &mRule->Header) {
+ mRule->RuleId = EFI_RULE_ID_INVALID;
+ }
+
+ VOID SetRuleId (IN UINT8 RuleId) {
+ mRule->RuleId = RuleId;
+ }
+};
+
+static EFI_IFR_TYPE_VALUE gZeroEfiIfrTypeValue = {0, };
+
+class CIfrDefault : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_DEFAULT *mDefault;
+
+public:
+ CIfrDefault (
+ IN UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD,
+ IN UINT8 Type = EFI_IFR_TYPE_OTHER,
+ IN EFI_IFR_TYPE_VALUE Value = gZeroEfiIfrTypeValue
+ ) : CIfrObj (EFI_IFR_DEFAULT_OP, (CHAR8 **)&mDefault),
+ CIfrOpHeader (EFI_IFR_DEFAULT_OP, &mDefault->Header) {
+ mDefault->Type = Type;
+ mDefault->Value = Value;
+ mDefault->DefaultId = DefaultId;
+ }
+
+ VOID SetDefaultId (IN UINT16 DefaultId) {
+ mDefault->DefaultId = DefaultId;
+ }
+
+ VOID SetType (IN UINT8 Type) {
+ mDefault->Type = Type;
+ }
+
+ VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {
+ mDefault->Value = Value;
+ }
+};
+
+class CIfrValue : public CIfrObj, public CIfrOpHeader{
+private:
+ EFI_IFR_VALUE *mValue;
+
+public:
+ CIfrValue () : CIfrObj (EFI_IFR_VALUE_OP, (CHAR8 **)&mValue),
+ CIfrOpHeader (EFI_IFR_VALUE_OP, &mValue->Header) {}
+
+};
+
+class CIfrSubtitle : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {
+private:
+ EFI_IFR_SUBTITLE *mSubtitle;
+
+public:
+ CIfrSubtitle () : CIfrObj (EFI_IFR_SUBTITLE_OP, (CHAR8 **)&mSubtitle),
+ CIfrOpHeader (EFI_IFR_SUBTITLE_OP, &mSubtitle->Header),
+ CIfrStatementHeader (&mSubtitle->Statement) {
+ mSubtitle->Flags = 0;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_FLAGS_HORIZONTAL)) {
+ mSubtitle->Flags |= EFI_IFR_FLAGS_HORIZONTAL;
+ }
+
+ return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+};
+
+class CIfrText : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {
+private:
+ EFI_IFR_TEXT *mText;
+
+public:
+ CIfrText () : CIfrObj (EFI_IFR_TEXT_OP, (CHAR8 **)&mText),
+ CIfrOpHeader (EFI_IFR_TEXT_OP, &mText->Header),
+ CIfrStatementHeader (&mText->Statement) {
+ mText->TextTwo = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetTextTwo (IN EFI_STRING_ID StringId) {
+ mText->TextTwo = StringId;
+ }
+};
+
+class CIfrRef : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_REF *mRef;
+
+public:
+ CIfrRef () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef),
+ CIfrOpHeader (EFI_IFR_REF_OP, &mRef->Header),
+ CIfrQuestionHeader (&mRef->Question) {
+ mRef->FormId = 0;
+ }
+
+ VOID SetFormId (IN EFI_FORM_ID FormId) {
+ mRef->FormId = FormId;
+ }
+};
+
+class CIfrRef2 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_REF2 *mRef2;
+
+public:
+ CIfrRef2 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef2, sizeof (EFI_IFR_REF2)),
+ CIfrOpHeader (EFI_IFR_REF_OP, &mRef2->Header, sizeof (EFI_IFR_REF2)),
+ CIfrQuestionHeader (&mRef2->Question) {
+ mRef2->FormId = 0;
+ mRef2->QuestionId = EFI_QUESTION_ID_INVALID;
+ }
+
+ VOID SetFormId (IN EFI_FORM_ID FormId) {
+ mRef2->FormId = FormId;
+ }
+
+ EFI_VFR_RETURN_CODE SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {
+ return VFR_RETURN_UNDEFINED;
+ }
+ mRef2->QuestionId = QuestionId;
+ return VFR_RETURN_SUCCESS;
+ }
+};
+
+class CIfrRef3 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_REF3 *mRef3;
+
+public:
+ CIfrRef3 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef3, sizeof(EFI_IFR_REF3)),
+ CIfrOpHeader (EFI_IFR_REF_OP, &mRef3->Header, sizeof (EFI_IFR_REF3)),
+ CIfrQuestionHeader (&mRef3->Question) {
+ mRef3->FormId = 0;
+ mRef3->QuestionId = EFI_QUESTION_ID_INVALID;
+ memset (&mRef3->FormSetId, 0, sizeof (EFI_GUID));
+ }
+
+ VOID SetFormId (IN EFI_FORM_ID FormId) {
+ mRef3->FormId = FormId;
+ }
+
+ VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
+ mRef3->QuestionId = QuestionId;
+ }
+
+ VOID SetFormSetId (IN EFI_GUID FormSetId) {
+ mRef3->FormSetId = FormSetId;
+ }
+};
+
+class CIfrRef4 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_REF4 *mRef4;
+
+public:
+ CIfrRef4 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef4, sizeof(EFI_IFR_REF3)),
+ CIfrOpHeader (EFI_IFR_REF_OP, &mRef4->Header, sizeof (EFI_IFR_REF3)),
+ CIfrQuestionHeader (&mRef4->Question) {
+ mRef4->FormId = 0;
+ mRef4->QuestionId = EFI_QUESTION_ID_INVALID;
+ memset (&mRef4->FormSetId, 0, sizeof (EFI_GUID));
+ mRef4->DevicePath = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetFormId (IN EFI_FORM_ID FormId) {
+ mRef4->FormId = FormId;
+ }
+
+ VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
+ mRef4->QuestionId = QuestionId;
+ }
+
+ VOID SetFormSetId (IN EFI_GUID FormSetId) {
+ mRef4->FormSetId = FormSetId;
+ }
+
+ VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
+ mRef4->DevicePath = DevicePath;
+ }
+};
+
+class CIfrResetButton : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {
+private:
+ EFI_IFR_RESET_BUTTON *mResetButton;
+
+public:
+ CIfrResetButton () : CIfrObj (EFI_IFR_RESET_BUTTON_OP, (CHAR8 **)&mResetButton),
+ CIfrOpHeader (EFI_IFR_RESET_BUTTON_OP, &mResetButton->Header),
+ CIfrStatementHeader (&mResetButton->Question.Header) {
+ mResetButton->DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
+ }
+
+ VOID SetDefaultId (IN UINT16 DefaultId) {
+ mResetButton->DefaultId = DefaultId;
+ }
+};
+
+class CIfrCheckBox : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_CHECKBOX *mCheckBox;
+
+public:
+ CIfrCheckBox () : CIfrObj (EFI_IFR_CHECKBOX_OP, (CHAR8 **)&mCheckBox),
+ CIfrOpHeader (EFI_IFR_CHECKBOX_OP, &mCheckBox->Header),
+ CIfrQuestionHeader (&mCheckBox->Question) {
+ mCheckBox->Flags = EFI_IFR_CHECKBOX_DEFAULT;
+ gCurrentQuestion = this;
+ }
+
+ ~CIfrCheckBox () {
+ gCurrentQuestion = NULL;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, UINT8 LFlags) {
+ EFI_VFR_RETURN_CODE Ret;
+
+ Ret = CIfrQuestionHeader::SetFlags (HFlags);
+ if (Ret != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_CHECKBOX_DEFAULT)) {
+ mCheckBox->Flags |= EFI_IFR_CHECKBOX_DEFAULT;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_CHECKBOX_DEFAULT_MFG)) {
+ mCheckBox->Flags |= EFI_IFR_CHECKBOX_DEFAULT_MFG;
+ }
+
+ return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+};
+
+class CIfrAction : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_ACTION *mAction;
+
+public:
+ CIfrAction () : CIfrObj (EFI_IFR_ACTION_OP, (CHAR8 **)&mAction),
+ CIfrOpHeader (EFI_IFR_ACTION_OP, &mAction->Header),
+ CIfrQuestionHeader (&mAction->Question) {
+ mAction->QuestionConfig = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetQuestionConfig (IN EFI_STRING_ID QuestionConfig) {
+ mAction->QuestionConfig = QuestionConfig;
+ }
+};
+
+class CIfrDate : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_DATE *mDate;
+
+public:
+ CIfrDate () : CIfrObj (EFI_IFR_DATE_OP, (CHAR8 **)&mDate),
+ CIfrOpHeader (EFI_IFR_DATE_OP, &mDate->Header),
+ CIfrQuestionHeader (&mDate->Question) {
+ mDate->Flags = 0;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
+ EFI_VFR_RETURN_CODE Ret;
+
+ Ret = CIfrQuestionHeader::SetFlags (HFlags);
+ if (Ret != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_YEAR_SUPPRESS)) {
+ mDate->Flags |= EFI_QF_DATE_YEAR_SUPPRESS;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_MONTH_SUPPRESS)) {
+ mDate->Flags |= EFI_QF_DATE_MONTH_SUPPRESS;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_DAY_SUPPRESS)) {
+ mDate->Flags |= EFI_QF_DATE_DAY_SUPPRESS;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_NORMAL)) {
+ mDate->Flags |= QF_DATE_STORAGE_NORMAL;
+ } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_TIME)) {
+ mDate->Flags |= QF_DATE_STORAGE_TIME;
+ } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_WAKEUP)) {
+ mDate->Flags |= QF_DATE_STORAGE_WAKEUP;
+ }
+
+ return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+};
+
+class CIfrNumeric : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader, public CIfrMinMaxStepData {
+private:
+ EFI_IFR_NUMERIC *mNumeric;
+
+public:
+ CIfrNumeric () : CIfrObj (EFI_IFR_NUMERIC_OP, (CHAR8 **)&mNumeric),
+ CIfrOpHeader (EFI_IFR_NUMERIC_OP, &mNumeric->Header),
+ CIfrQuestionHeader (&mNumeric->Question),
+ CIfrMinMaxStepData (&mNumeric->data) {
+ mNumeric->Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC;
+ gCurrentQuestion = this;
+ }
+
+ ~CIfrNumeric () {
+ gCurrentQuestion = NULL;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
+ EFI_VFR_RETURN_CODE Ret;
+
+ Ret = CIfrQuestionHeader::SetFlags (HFlags);
+ if (Ret != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+
+ if (LFlags & EFI_IFR_DISPLAY) {
+ mNumeric->Flags = LFlags;
+ } else {
+ mNumeric->Flags = LFlags | EFI_IFR_DISPLAY_UINT_DEC;
+ }
+ return VFR_RETURN_SUCCESS;
+ }
+};
+
+class CIfrOneOf : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader, public CIfrMinMaxStepData {
+private:
+ EFI_IFR_ONE_OF *mOneOf;
+
+public:
+ CIfrOneOf () : CIfrObj (EFI_IFR_ONE_OF_OP, (CHAR8 **)&mOneOf),
+ CIfrOpHeader (EFI_IFR_ONE_OF_OP, &mOneOf->Header),
+ CIfrQuestionHeader (&mOneOf->Question),
+ CIfrMinMaxStepData (&mOneOf->data) {
+ mOneOf->Flags = 0;
+ gCurrentQuestion = this;
+ }
+
+ ~CIfrOneOf () {
+ gCurrentQuestion = NULL;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
+ EFI_VFR_RETURN_CODE Ret;
+
+ Ret = CIfrQuestionHeader::SetFlags (HFlags);
+ if (Ret != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+
+ if (LFlags & EFI_IFR_DISPLAY) {
+ mOneOf->Flags = LFlags;
+ } else {
+ mOneOf->Flags = LFlags | EFI_IFR_DISPLAY_UINT_DEC;
+ }
+ return VFR_RETURN_SUCCESS;
+ }
+};
+
+class CIfrString : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_STRING *mString;
+
+public:
+ CIfrString () : CIfrObj (EFI_IFR_STRING_OP, (CHAR8 **)&mString),
+ CIfrOpHeader (EFI_IFR_STRING_OP, &mString->Header),
+ CIfrQuestionHeader (&mString->Question) {
+ mString->Flags = 0;
+ mString->MinSize = 0;
+ mString->MaxSize = 0;
+ gCurrentQuestion = this;
+ }
+
+ ~CIfrString () {
+ gCurrentQuestion = NULL;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
+ EFI_VFR_RETURN_CODE Ret;
+
+ Ret = CIfrQuestionHeader::SetFlags (HFlags);
+ if (Ret != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_STRING_MULTI_LINE)) {
+ mString->Flags |= EFI_IFR_STRING_MULTI_LINE;
+ }
+
+ return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+
+ VOID SetMinSize (IN UINT8 Flags) {
+ mString->MinSize = Flags;
+ }
+
+ VOID SetMaxSize (IN UINT8 MaxSize) {
+ mString->MaxSize = MaxSize;
+ }
+};
+
+class CIfrPassword : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_PASSWORD *mPassword;
+
+public:
+ CIfrPassword () : CIfrObj (EFI_IFR_PASSWORD_OP, (CHAR8 **)&mPassword),
+ CIfrOpHeader (EFI_IFR_PASSWORD_OP, &mPassword->Header),
+ CIfrQuestionHeader (&mPassword->Question) {
+ mPassword->MinSize = 0;
+ mPassword->MaxSize = 0;
+ gCurrentQuestion = this;
+ }
+
+ ~CIfrPassword () {
+ gCurrentQuestion = NULL;
+ }
+
+ VOID SetMinSize (IN UINT16 MinSize) {
+ mPassword->MinSize = MinSize;
+ }
+
+ VOID SetMaxSize (IN UINT16 MaxSize) {
+ mPassword->MaxSize = MaxSize;
+ }
+};
+
+class CIfrOrderedList : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_ORDERED_LIST *mOrderedList;
+
+public:
+ CIfrOrderedList () : CIfrObj (EFI_IFR_ORDERED_LIST_OP, (CHAR8 **)&mOrderedList),
+ CIfrOpHeader (EFI_IFR_ORDERED_LIST_OP, &mOrderedList->Header),
+ CIfrQuestionHeader (&mOrderedList->Question) {
+ mOrderedList->MaxContainers = 0;
+ mOrderedList->Flags = 0;
+ gCurrentQuestion = this;
+ }
+
+ ~CIfrOrderedList () {
+ gCurrentQuestion = NULL;
+ }
+
+ VOID SetMaxContainers (IN UINT8 MaxContainers) {
+ mOrderedList->MaxContainers = MaxContainers;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
+ EFI_VFR_RETURN_CODE Ret;
+
+ Ret = CIfrQuestionHeader::SetFlags (HFlags);
+ if (Ret != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_UNIQUE_SET)) {
+ mOrderedList->Flags |= EFI_IFR_UNIQUE_SET;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_NO_EMPTY_SET)) {
+ mOrderedList->Flags |= EFI_IFR_NO_EMPTY_SET;
+ }
+
+ return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+};
+
+class CIfrTime : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
+private:
+ EFI_IFR_TIME *mTime;
+
+public:
+ CIfrTime () : CIfrObj (EFI_IFR_TIME_OP, (CHAR8 **)&mTime),
+ CIfrOpHeader (EFI_IFR_TIME_OP, &mTime->Header),
+ CIfrQuestionHeader (&mTime->Question) {
+ mTime->Flags = 0;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
+ EFI_VFR_RETURN_CODE Ret;
+
+ Ret = CIfrQuestionHeader::SetFlags (HFlags);
+ if (Ret != VFR_RETURN_SUCCESS) {
+ return Ret;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_HOUR_SUPPRESS)) {
+ mTime->Flags |= QF_TIME_HOUR_SUPPRESS;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_MINUTE_SUPPRESS)) {
+ mTime->Flags |= QF_TIME_MINUTE_SUPPRESS;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_SECOND_SUPPRESS)) {
+ mTime->Flags |= QF_TIME_SECOND_SUPPRESS;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_NORMAL)) {
+ mTime->Flags |= QF_TIME_STORAGE_NORMAL;
+ } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_TIME)) {
+ mTime->Flags |= QF_TIME_STORAGE_TIME;
+ } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_WAKEUP)) {
+ mTime->Flags |= QF_TIME_STORAGE_WAKEUP;
+ }
+
+ return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+};
+
+class CIfrDisableIf : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_DISABLE_IF *mDisableIf;
+
+public:
+ CIfrDisableIf () : CIfrObj (EFI_IFR_DISABLE_IF_OP, (CHAR8 **)&mDisableIf),
+ mDisableIf ((EFI_IFR_DISABLE_IF *) GetObjBinAddr()),
+ CIfrOpHeader (EFI_IFR_DISABLE_IF_OP, &mDisableIf->Header) {}
+};
+
+class CIfrSuppressIf : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_SUPPRESS_IF *mSuppressIf;
+
+public:
+ CIfrSuppressIf () : CIfrObj (EFI_IFR_SUPPRESS_IF_OP, (CHAR8 **)&mSuppressIf),
+ CIfrOpHeader (EFI_IFR_SUPPRESS_IF_OP, &mSuppressIf->Header) {}
+};
+
+class CIfrGrayOutIf : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_GRAY_OUT_IF *mGrayOutIf;
+
+public:
+ CIfrGrayOutIf () : CIfrObj (EFI_IFR_GRAY_OUT_IF_OP, (CHAR8 **)&mGrayOutIf),
+ CIfrOpHeader (EFI_IFR_GRAY_OUT_IF_OP, &mGrayOutIf->Header) {}
+};
+
+class CIfrInconsistentIf : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_INCONSISTENT_IF *mInconsistentIf;
+
+public:
+ CIfrInconsistentIf () : CIfrObj (EFI_IFR_INCONSISTENT_IF_OP, (CHAR8 **)&mInconsistentIf),
+ CIfrOpHeader (EFI_IFR_INCONSISTENT_IF_OP, &mInconsistentIf->Header) {
+ mInconsistentIf->Error = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetError (IN EFI_STRING_ID Error) {
+ mInconsistentIf->Error = Error;
+ }
+};
+
+class CIfrNoSubmitIf : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_NO_SUBMIT_IF *mNoSubmitIf;
+
+public:
+ CIfrNoSubmitIf () : CIfrObj (EFI_IFR_NO_SUBMIT_IF_OP, (CHAR8 **)&mNoSubmitIf),
+ CIfrOpHeader (EFI_IFR_NO_SUBMIT_IF_OP, &mNoSubmitIf->Header) {
+ mNoSubmitIf->Error = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetError (IN EFI_STRING_ID Error) {
+ mNoSubmitIf->Error = Error;
+ }
+};
+
+class CIfrRefresh : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_REFRESH *mRefresh;
+
+public:
+ CIfrRefresh () : CIfrObj (EFI_IFR_REFRESH_OP, (CHAR8 **)&mRefresh),
+ CIfrOpHeader (EFI_IFR_REFRESH_OP, &mRefresh->Header) {
+ mRefresh->RefreshInterval = 0;
+ }
+
+ VOID SetRefreshInterval (IN UINT8 RefreshInterval) {
+ mRefresh->RefreshInterval = RefreshInterval;
+ }
+};
+
+class CIfrVarStoreDevice : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_VARSTORE_DEVICE *mVarStoreDevice;
+
+public:
+ CIfrVarStoreDevice () : CIfrObj (EFI_IFR_VARSTORE_DEVICE_OP, (CHAR8 **)&mVarStoreDevice),
+ CIfrOpHeader (EFI_IFR_VARSTORE_DEVICE_OP, &mVarStoreDevice->Header) {
+ mVarStoreDevice->DevicePath = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
+ mVarStoreDevice->DevicePath = DevicePath;
+ }
+};
+
+class CIfrOneOfOption : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_ONE_OF_OPTION *mOneOfOption;
+
+public:
+ CIfrOneOfOption () : CIfrObj (EFI_IFR_ONE_OF_OPTION_OP, (CHAR8 **)&mOneOfOption),
+ CIfrOpHeader (EFI_IFR_ONE_OF_OPTION_OP, &mOneOfOption->Header) {
+ mOneOfOption->Flags = 0;
+ mOneOfOption->Option = EFI_STRING_ID_INVALID;
+ mOneOfOption->Type = EFI_IFR_TYPE_OTHER;
+ memset (&mOneOfOption->Value, 0, sizeof (mOneOfOption->Value));
+ }
+
+ VOID SetOption (IN EFI_STRING_ID Option) {
+ mOneOfOption->Option = Option;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_OPTION_DEFAULT)) {
+ mOneOfOption->Flags |= EFI_IFR_OPTION_DEFAULT;
+ }
+
+ if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_OPTION_DEFAULT_MFG)) {
+ mOneOfOption->Flags |= EFI_IFR_OPTION_DEFAULT_MFG;
+ }
+
+ if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_8)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_8);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_8;
+ } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_16)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_16);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_16;
+ } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_32)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_32);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_32;
+ } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_64)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_64);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_64;
+ } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_BOOLEAN)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_BOOLEAN);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_BOOLEAN;
+ } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_TIME)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_TIME);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_TIME;
+ } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_DATE)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_DATE);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_DATE;
+ } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_STRING)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_STRING);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_STRING;
+ } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_OTHER)) {
+ _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_OTHER);
+ mOneOfOption->Flags |= EFI_IFR_TYPE_OTHER;
+ }
+
+ return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+
+ VOID SetType (IN UINT8 Type) {
+ mOneOfOption->Type = Type;
+ }
+
+ VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {
+ mOneOfOption->Value = Value;
+ }
+
+ UINT8 GetFlags (VOID) {
+ return mOneOfOption->Flags;
+ }
+};
+
+static EFI_GUID IfrTianoGuid = EFI_IFR_TIANO_GUID;
+
+class CIfrClass : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_GUID_CLASS *mClass;
+
+public:
+ CIfrClass () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mClass, sizeof (EFI_IFR_GUID_CLASS)),
+ CIfrOpHeader (EFI_IFR_GUID_OP, &mClass->Header, sizeof (EFI_IFR_GUID_CLASS)) {
+ mClass->ExtendOpCode = EFI_IFR_EXTEND_OP_CLASS;
+ mClass->Guid = IfrTianoGuid;
+ mClass->Class = EFI_NON_DEVICE_CLASS;
+ }
+
+ VOID SetClass (IN UINT16 Class) {
+ mClass->Class = Class;
+ }
+};
+
+class CIfrSubClass : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_GUID_SUBCLASS *mSubClass;
+
+public:
+ CIfrSubClass () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mSubClass, sizeof (EFI_IFR_GUID_SUBCLASS)),
+ CIfrOpHeader (EFI_IFR_GUID_OP, &mSubClass->Header, sizeof (EFI_IFR_GUID_SUBCLASS)) {
+ mSubClass->ExtendOpCode = EFI_IFR_EXTEND_OP_SUBCLASS;
+ mSubClass->Guid = IfrTianoGuid;
+ mSubClass->SubClass = EFI_SETUP_APPLICATION_SUBCLASS;
+ }
+
+ VOID SetSubClass (IN UINT16 SubClass) {
+ mSubClass->SubClass = SubClass;
+ }
+};
+
+class CIfrLabel : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_GUID_LABEL *mLabel;
+
+public:
+ CIfrLabel () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mLabel, sizeof (EFI_IFR_GUID_LABEL)),
+ CIfrOpHeader (EFI_IFR_GUID_OP, &mLabel->Header, sizeof (EFI_IFR_GUID_LABEL)) {
+ mLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+ mLabel->Guid = IfrTianoGuid;
+ }
+
+ VOID SetNumber (IN UINT16 Number) {
+ mLabel->Number = Number;
+ }
+};
+
+class CIfrBanner : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_GUID_BANNER *mBanner;
+
+public:
+ CIfrBanner () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mBanner, sizeof (EFI_IFR_GUID_BANNER)),
+ CIfrOpHeader (EFI_IFR_GUID_OP, &mBanner->Header, sizeof (EFI_IFR_GUID_BANNER)) {
+ mBanner->ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;
+ mBanner->Guid = IfrTianoGuid;
+ }
+
+ VOID SetTitle (IN EFI_STRING_ID StringId) {
+ mBanner->Title = StringId;
+ }
+
+ VOID SetLine (IN UINT16 Line) {
+ mBanner->LineNumber = Line;
+ }
+
+ VOID SetAlign (IN UINT8 Align) {
+ mBanner->Alignment = Align;
+ }
+};
+
+class CIfrTimeout : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_GUID_TIMEOUT *mTimeout;
+
+public:
+ CIfrTimeout (IN UINT16 Timeout = 0) : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mTimeout, sizeof (EFI_IFR_GUID_TIMEOUT)),
+ CIfrOpHeader (EFI_IFR_GUID_OP, &mTimeout->Header, sizeof (EFI_IFR_GUID_TIMEOUT)) {
+ mTimeout->ExtendOpCode = EFI_IFR_EXTEND_OP_TIMEOUT;
+ mTimeout->Guid = IfrTianoGuid;
+ mTimeout->TimeOut = Timeout;
+ }
+
+ VOID SetTimeout (IN UINT16 Timeout) {
+ mTimeout->TimeOut = Timeout;
+ }
+};
+
+class CIfrDup : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_DUP *mDup;
+
+public:
+ CIfrDup (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_DUP_OP, (CHAR8 **)&mDup),
+ CIfrOpHeader (EFI_IFR_DUP_OP, &mDup->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrEqIdId : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_EQ_ID_ID *mEqIdId;
+
+public:
+ CIfrEqIdId (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_EQ_ID_ID_OP, (CHAR8 **)&mEqIdId),
+ CIfrOpHeader (EFI_IFR_EQ_ID_ID_OP, &mEqIdId->Header) {
+ SetLineNo (LineNo);
+ mEqIdId->QuestionId1 = EFI_QUESTION_ID_INVALID;
+ mEqIdId->QuestionId2 = EFI_QUESTION_ID_INVALID;
+ }
+
+ VOID SetQuestionId1 (
+ IN EFI_QUESTION_ID QuestionId,
+ IN INT8 *VarIdStr,
+ IN UINT32 LineNo
+ ) {
+ if (QuestionId != EFI_QUESTION_ID_INVALID) {
+ mEqIdId->QuestionId1 = QuestionId;
+ } else {
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId1), sizeof (EFI_QUESTION_ID), LineNo);
+ }
+ }
+
+ VOID SetQuestionId2 (
+ IN EFI_QUESTION_ID QuestionId,
+ IN INT8 *VarIdStr,
+ IN UINT32 LineNo
+ ) {
+ if (QuestionId != EFI_QUESTION_ID_INVALID) {
+ mEqIdId->QuestionId2 = QuestionId;
+ } else {
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId2), sizeof (EFI_QUESTION_ID), LineNo);
+ }
+ }
+};
+
+class CIfrEqIdVal : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_EQ_ID_VAL *mEqIdVal;
+
+public:
+ CIfrEqIdVal (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_EQ_ID_VAL_OP, (CHAR8 **)&mEqIdVal),
+ CIfrOpHeader (EFI_IFR_EQ_ID_VAL_OP, &mEqIdVal->Header) {
+ SetLineNo (LineNo);
+ mEqIdVal->QuestionId = EFI_QUESTION_ID_INVALID;
+ }
+
+ VOID SetQuestionId (
+ IN EFI_QUESTION_ID QuestionId,
+ IN INT8 *VarIdStr,
+ IN UINT32 LineNo
+ ) {
+ if (QuestionId != EFI_QUESTION_ID_INVALID) {
+ mEqIdVal->QuestionId = QuestionId;
+ } else {
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVal->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);
+ }
+ }
+
+ VOID SetValue (IN UINT16 Value) {
+ mEqIdVal->Value = Value;
+ }
+};
+
+class CIfrEqIdList : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_EQ_ID_LIST *mEqIdVList;
+
+public:
+ CIfrEqIdList (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_EQ_ID_LIST_OP, (CHAR8 **)&mEqIdVList, sizeof (EFI_IFR_EQ_ID_LIST), TRUE),
+ CIfrOpHeader (EFI_IFR_EQ_ID_LIST_OP, &mEqIdVList->Header) {
+ SetLineNo (LineNo);
+ mEqIdVList->QuestionId = EFI_QUESTION_ID_INVALID;
+ mEqIdVList->ListLength = 0;
+ mEqIdVList->ValueList[0] = 0;
+ }
+
+ VOID SetQuestionId (
+ IN EFI_QUESTION_ID QuestionId,
+ IN INT8 *VarIdStr,
+ IN UINT32 LineNo
+ ) {
+ if (QuestionId != EFI_QUESTION_ID_INVALID) {
+ mEqIdVList->QuestionId = QuestionId;
+ } else {
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVList->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);
+ }
+ }
+
+ VOID SetListLength (IN UINT16 ListLength) {
+ mEqIdVList->ListLength = ListLength;
+ }
+
+ VOID SetValueList (IN UINT16 Index, IN UINT16 Value) {
+ if (Index == 0) {
+ mEqIdVList->ValueList[0] = Value;
+ return;
+ }
+
+ if (ExpendObjBin (sizeof (UINT16)) ==TRUE) {
+ IncLength (sizeof (UINT16));
+ mEqIdVList->ValueList[Index] = Value;
+ }
+ }
+};
+
+class CIfrQuestionRef1 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_QUESTION_REF1 *mQuestionRef1;
+
+public:
+ CIfrQuestionRef1 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_QUESTION_REF1_OP, (CHAR8 **)&mQuestionRef1),
+ CIfrOpHeader (EFI_IFR_QUESTION_REF1_OP, &mQuestionRef1->Header) {
+ SetLineNo (LineNo);
+ mQuestionRef1->QuestionId = EFI_QUESTION_ID_INVALID;
+ }
+
+ VOID SetQuestionId (
+ IN EFI_QUESTION_ID QuestionId,
+ IN INT8 *VarIdStr,
+ IN UINT32 LineNo
+ ) {
+ if (QuestionId != EFI_QUESTION_ID_INVALID) {
+ mQuestionRef1->QuestionId = QuestionId;
+ } else {
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mQuestionRef1->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);
+ }
+ }
+};
+
+class CIfrQuestionRef2 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_QUESTION_REF2 *mQuestionRef2;
+
+public:
+ CIfrQuestionRef2 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_QUESTION_REF2_OP, (CHAR8 **)&mQuestionRef2),
+ CIfrOpHeader (EFI_IFR_QUESTION_REF2_OP, &mQuestionRef2->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrQuestionRef3 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_QUESTION_REF3 *mQuestionRef3;
+
+public:
+ CIfrQuestionRef3 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP, (CHAR8 **)&mQuestionRef3),
+ CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP, &mQuestionRef3->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrQuestionRef3_2 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_QUESTION_REF3_2 *mQuestionRef3_2;
+
+public:
+ CIfrQuestionRef3_2 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP, (CHAR8 **)&mQuestionRef3_2, sizeof (EFI_IFR_QUESTION_REF3_2)),
+ CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP, &mQuestionRef3_2->Header, sizeof (EFI_IFR_QUESTION_REF3_2)) {
+ SetLineNo (LineNo);
+ mQuestionRef3_2->DevicePath = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
+ mQuestionRef3_2->DevicePath = DevicePath;
+ }
+};
+
+class CIfrQuestionRef3_3 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_QUESTION_REF3_3 *mQuestionRef3_3;
+
+public:
+ CIfrQuestionRef3_3 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP, (CHAR8 **)&mQuestionRef3_3, sizeof (EFI_IFR_QUESTION_REF3_3)),
+ CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP, &mQuestionRef3_3->Header, sizeof (EFI_IFR_QUESTION_REF3_3)) {
+ SetLineNo (LineNo);
+ mQuestionRef3_3->DevicePath = EFI_STRING_ID_INVALID;
+ memset (&mQuestionRef3_3->Guid, 0, sizeof (EFI_GUID));
+ }
+
+ VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
+ mQuestionRef3_3->DevicePath = DevicePath;
+ }
+
+ VOID SetGuid (IN EFI_GUID *Guid) {
+ mQuestionRef3_3->Guid = *Guid;
+ }
+};
+
+class CIfrRuleRef : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_RULE_REF *mRuleRef;
+
+public:
+ CIfrRuleRef (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_RULE_REF_OP, (CHAR8 **)&mRuleRef),
+ CIfrOpHeader (EFI_IFR_RULE_REF_OP, &mRuleRef->Header) {
+ SetLineNo (LineNo);
+ mRuleRef->RuleId = EFI_RULE_ID_INVALID;
+ }
+
+ VOID SetRuleId (IN UINT8 RuleId) {
+ mRuleRef->RuleId = RuleId;
+ }
+};
+
+class CIfrStringRef1 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_STRING_REF1 *mStringRef1;
+
+public:
+ CIfrStringRef1 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_STRING_REF1_OP, (CHAR8 **)&mStringRef1),
+ CIfrOpHeader (EFI_IFR_STRING_REF1_OP, &mStringRef1->Header) {
+ SetLineNo (LineNo);
+ mStringRef1->StringId = EFI_STRING_ID_INVALID;
+ }
+
+ VOID SetStringId (IN EFI_STRING_ID StringId) {
+ mStringRef1->StringId = StringId;
+ }
+};
+
+class CIfrStringRef2 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_STRING_REF2 *mStringRef2;
+
+public:
+ CIfrStringRef2 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_STRING_REF2_OP, (CHAR8 **)&mStringRef2),
+ CIfrOpHeader (EFI_IFR_STRING_REF2_OP, &mStringRef2->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrThis : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_THIS *mThis;
+
+public:
+ CIfrThis (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_THIS_OP, (CHAR8 **)&mThis),
+ CIfrOpHeader (EFI_IFR_THIS_OP, &mThis->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrUint8 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_UINT8 *mUint8;
+
+public:
+ CIfrUint8 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_UINT8_OP, (CHAR8 **)&mUint8),
+ CIfrOpHeader (EFI_IFR_UINT8_OP, &mUint8->Header) {
+ SetLineNo (LineNo);
+ }
+
+ VOID SetValue (IN UINT8 Value) {
+ mUint8->Value = Value;
+ }
+};
+
+class CIfrUint16 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_UINT16 *mUint16;
+
+public:
+ CIfrUint16 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_UINT16_OP, (CHAR8 **)&mUint16),
+ CIfrOpHeader (EFI_IFR_UINT16_OP, &mUint16->Header) {
+ SetLineNo (LineNo);
+ }
+
+ VOID SetValue (IN UINT16 Value) {
+ mUint16->Value = Value;
+ }
+};
+
+class CIfrUint32 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_UINT32 *mUint32;
+
+public:
+ CIfrUint32 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_UINT32_OP, (CHAR8 **)&mUint32),
+ CIfrOpHeader (EFI_IFR_UINT32_OP, &mUint32->Header) {
+ SetLineNo (LineNo);
+ }
+
+ VOID SetValue (IN UINT32 Value) {
+ mUint32->Value = Value;
+ }
+};
+
+class CIfrUint64 : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_UINT64 *mUint64;
+
+public:
+ CIfrUint64 (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_UINT64_OP, (CHAR8 **)&mUint64),
+ CIfrOpHeader (EFI_IFR_UINT64_OP, &mUint64->Header) {
+ SetLineNo (LineNo);
+ }
+
+ VOID SetValue (IN UINT64 Value) {
+ mUint64->Value = Value;
+ }
+};
+
+class CIfrTrue : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_TRUE *mTrue;
+
+public:
+ CIfrTrue (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_TRUE_OP, (CHAR8 **)&mTrue),
+ CIfrOpHeader (EFI_IFR_TRUE_OP, &mTrue->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrFalse : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_FALSE *mFalse;
+
+public:
+ CIfrFalse (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_FALSE_OP, (CHAR8 **)&mFalse),
+ CIfrOpHeader (EFI_IFR_FALSE_OP, &mFalse->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrOne : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_ONE *mOne;
+
+public:
+ CIfrOne (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_ONE_OP, (CHAR8 **)&mOne),
+ CIfrOpHeader (EFI_IFR_ONE_OP, &mOne->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrOnes : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_ONES *mOnes;
+
+public:
+ CIfrOnes (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_ONES_OP, (CHAR8 **)&mOnes),
+ CIfrOpHeader (EFI_IFR_ONES_OP, &mOnes->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrZero : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_ZERO *mZero;
+
+public:
+ CIfrZero (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_ZERO_OP, (CHAR8 **)&mZero),
+ CIfrOpHeader (EFI_IFR_ZERO_OP, &mZero->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrUndefined : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_UNDEFINED *mUndefined;
+
+public:
+ CIfrUndefined (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_UNDEFINED_OP, (CHAR8 **)&mUndefined),
+ CIfrOpHeader (EFI_IFR_UNDEFINED_OP, &mUndefined->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrVersion : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_VERSION *mVersion;
+
+public:
+ CIfrVersion (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_VERSION_OP, (CHAR8 **)&mVersion),
+ CIfrOpHeader (EFI_IFR_VERSION_OP, &mVersion->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrLength : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_LENGTH *mLength;
+
+public:
+ CIfrLength (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_LENGTH_OP, (CHAR8 **)&mLength),
+ CIfrOpHeader (EFI_IFR_LENGTH_OP, &mLength->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrNot : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_NOT *mNot;
+
+public:
+ CIfrNot (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_NOT_OP, (CHAR8 **)&mNot),
+ CIfrOpHeader (EFI_IFR_NOT_OP, &mNot->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrBitWiseNot : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_BITWISE_NOT *mBitWise;
+
+public:
+ CIfrBitWiseNot (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_BITWISE_NOT_OP, (CHAR8 **)&mBitWise),
+ CIfrOpHeader (EFI_IFR_BITWISE_NOT_OP, &mBitWise->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrToBoolean : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_TO_BOOLEAN *mToBoolean;
+
+public:
+ CIfrToBoolean (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_TO_BOOLEAN_OP, (CHAR8 **)&mToBoolean),
+ CIfrOpHeader (EFI_IFR_TO_BOOLEAN_OP, &mToBoolean->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrToString : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_TO_STRING *mToString;
+
+public:
+ CIfrToString (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_TO_STRING_OP, (CHAR8 **)&mToString),
+ CIfrOpHeader (EFI_IFR_TO_STRING_OP, &mToString->Header) {
+ SetLineNo (LineNo);
+ }
+
+ VOID SetFormat (IN UINT8 Format) {
+ mToString->Format = Format;
+ }
+};
+
+class CIfrToUint : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_TO_UINT *mToUint;
+
+public:
+ CIfrToUint (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_TO_UINT_OP, (CHAR8 **)&mToUint),
+ CIfrOpHeader (EFI_IFR_TO_UINT_OP, &mToUint->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrToUpper : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_TO_UPPER *mToUpper;
+
+public:
+ CIfrToUpper (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_TO_UPPER_OP, (CHAR8 **)&mToUpper),
+ CIfrOpHeader (EFI_IFR_TO_UPPER_OP, &mToUpper->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrToLower : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_TO_LOWER *mToLower;
+
+public:
+ CIfrToLower (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_TO_LOWER_OP, (CHAR8 **)&mToLower),
+ CIfrOpHeader (EFI_IFR_TO_LOWER_OP, &mToLower->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrAdd : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_ADD *mAdd;
+
+public:
+ CIfrAdd (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_ADD_OP, (CHAR8 **)&mAdd),
+ CIfrOpHeader (EFI_IFR_ADD_OP, &mAdd->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrBitWiseAnd : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_BITWISE_AND *mBitWiseAnd;
+
+public:
+ CIfrBitWiseAnd (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_BITWISE_AND_OP, (CHAR8 **)&mBitWiseAnd),
+ CIfrOpHeader (EFI_IFR_BITWISE_AND_OP, &mBitWiseAnd->Header) {
+ SetLineNo(LineNo);
+ }
+};
+
+class CIfrBitWiseOr : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_BITWISE_OR *mBitWiseOr;
+
+public:
+ CIfrBitWiseOr (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_BITWISE_OR_OP, (CHAR8 **)&mBitWiseOr),
+ CIfrOpHeader (EFI_IFR_BITWISE_OR_OP, &mBitWiseOr->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrAnd : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_AND *mAnd;
+
+public:
+ CIfrAnd (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_AND_OP, (CHAR8 **)&mAnd),
+ CIfrOpHeader (EFI_IFR_AND_OP, &mAnd->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrCatenate : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_CATENATE *mCatenate;
+
+public:
+ CIfrCatenate (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_CATENATE_OP, (CHAR8 **)&mCatenate),
+ CIfrOpHeader (EFI_IFR_CATENATE_OP, &mCatenate->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrDivide : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_DIVIDE *mDivide;
+
+public:
+ CIfrDivide (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_DIVIDE_OP, (CHAR8 **)&mDivide),
+ CIfrOpHeader (EFI_IFR_DIVIDE_OP, &mDivide->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrEqual : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_EQUAL *mEqual;
+
+public:
+ CIfrEqual (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_EQUAL_OP, (CHAR8 **)&mEqual),
+ CIfrOpHeader (EFI_IFR_EQUAL_OP, &mEqual->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrGreaterEqual : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_GREATER_EQUAL *mGreaterEqual;
+
+public:
+ CIfrGreaterEqual (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_GREATER_EQUAL_OP, (CHAR8 **)&mGreaterEqual),
+ CIfrOpHeader (EFI_IFR_GREATER_EQUAL_OP, &mGreaterEqual->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrGreaterThan : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_GREATER_THAN *mGreaterThan;
+
+public:
+ CIfrGreaterThan (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_GREATER_THAN_OP, (CHAR8 **)&mGreaterThan),
+ CIfrOpHeader (EFI_IFR_GREATER_THAN_OP, &mGreaterThan->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrLessEqual : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_LESS_EQUAL *mLessEqual;
+
+public:
+ CIfrLessEqual (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_LESS_EQUAL_OP, (CHAR8 **)&mLessEqual),
+ CIfrOpHeader (EFI_IFR_LESS_EQUAL_OP, &mLessEqual->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrLessThan : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_LESS_THAN *mLessThan;
+
+public:
+ CIfrLessThan (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_LESS_THAN_OP, (CHAR8 **)&mLessThan),
+ CIfrOpHeader (EFI_IFR_LESS_THAN_OP, &mLessThan->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrMatch : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_MATCH *mMatch;
+
+public:
+ CIfrMatch (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_MATCH_OP, (CHAR8 **)&mMatch),
+ CIfrOpHeader (EFI_IFR_MATCH_OP, &mMatch->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrMultiply : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_MULTIPLY *mMultiply;
+
+public:
+ CIfrMultiply (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_MULTIPLY_OP, (CHAR8 **)&mMultiply),
+ CIfrOpHeader (EFI_IFR_MULTIPLY_OP, &mMultiply->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrModulo : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_MODULO *mModulo;
+
+public:
+ CIfrModulo (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_MODULO_OP, (CHAR8 **)&mModulo),
+ CIfrOpHeader (EFI_IFR_MODULO_OP, &mModulo->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrNotEqual : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_NOT_EQUAL *mNotEqual;
+
+public:
+ CIfrNotEqual (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_NOT_EQUAL_OP, (CHAR8 **)&mNotEqual),
+ CIfrOpHeader (EFI_IFR_NOT_EQUAL_OP, &mNotEqual->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrOr : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_OR *mOr;
+
+public:
+ CIfrOr (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_OR_OP, (CHAR8 **)&mOr),
+ CIfrOpHeader (EFI_IFR_OR_OP, &mOr->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrShiftLeft : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_SHIFT_LEFT *mShiftLeft;
+
+public:
+ CIfrShiftLeft (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_SHIFT_LEFT_OP, (CHAR8 **)&mShiftLeft),
+ CIfrOpHeader (EFI_IFR_SHIFT_LEFT_OP, &mShiftLeft->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrShiftRight : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_SHIFT_RIGHT *mShiftRight;
+
+public:
+ CIfrShiftRight (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_SHIFT_RIGHT_OP, (CHAR8 **)&mShiftRight),
+ CIfrOpHeader (EFI_IFR_SHIFT_RIGHT_OP, &mShiftRight->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrSubtract : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_SUBTRACT *mSubtract;
+
+public:
+ CIfrSubtract (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_SUBTRACT_OP, (CHAR8 **)&mSubtract),
+ CIfrOpHeader (EFI_IFR_SUBTRACT_OP, &mSubtract->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrConditional : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_CONDITIONAL *mConditional;
+
+public:
+ CIfrConditional (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_CONDITIONAL_OP, (CHAR8 **)&mConditional),
+ CIfrOpHeader (EFI_IFR_CONDITIONAL_OP, &mConditional->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrFind : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_FIND *mFind;
+
+public:
+ CIfrFind (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_FIND_OP, (CHAR8 **)&mFind),
+ CIfrOpHeader (EFI_IFR_FIND_OP, &mFind->Header) {
+ SetLineNo (LineNo);
+ }
+
+ VOID SetFormat (IN UINT8 Format) {
+ mFind->Format = Format;
+ }
+};
+
+class CIfrMid : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_MID *mMid;
+
+public:
+ CIfrMid (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_MID_OP, (CHAR8 **)&mMid),
+ CIfrOpHeader (EFI_IFR_MID_OP, &mMid->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrToken : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_TOKEN *mToken;
+
+public:
+ CIfrToken (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_TOKEN_OP, (CHAR8 **)&mToken),
+ CIfrOpHeader (EFI_IFR_TOKEN_OP, &mToken->Header) {
+ SetLineNo (LineNo);
+ }
+};
+
+class CIfrSpan : public CIfrObj, public CIfrOpHeader {
+private:
+ EFI_IFR_SPAN *mSpan;
+
+public:
+ CIfrSpan (
+ IN UINT32 LineNo
+ ) : CIfrObj (EFI_IFR_SPAN_OP, (CHAR8 **)&mSpan),
+ CIfrOpHeader (EFI_IFR_SPAN_OP, &mSpan->Header) {
+ SetLineNo (LineNo);
+ mSpan->Flags = EFI_IFR_FLAGS_FIRST_MATCHING;
+ }
+
+ EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {
+ if (_IS_EQUAL (LFlags, EFI_IFR_FLAGS_FIRST_MATCHING)) {
+ mSpan->Flags |= EFI_IFR_FLAGS_FIRST_MATCHING;
+ } else if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_FLAGS_FIRST_NON_MATCHING)) {
+ mSpan->Flags |= EFI_IFR_FLAGS_FIRST_NON_MATCHING;
+ }
+
+ return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
+ }
+};
+
+#endif
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrSyntax.g b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrSyntax.g
new file mode 100644
index 0000000000..6029d9e2d8
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrSyntax.g
@@ -0,0 +1,3201 @@
+#header<<
+
+#include "EfiVfr.h"
+#include "VfrFormPkg.h"
+#include "VfrError.h"
+#include "VfrUtilityLib.h"
+#include "AToken.h"
+#include "ATokPtr.h"
+>>
+
+<<
+#include "stdio.h"
+#include "PBlackBox.h"
+#include "DLexerBase.h"
+#include "VfrLexer.h"
+#include "AToken.h"
+
+#define GET_LINENO(Obj) ((Obj)->getLine())
+#define SET_LINE_INFO(Obj, L) {(Obj).SetLineNo((L)->getLine());} while (0)
+#define CRT_END_OP(Obj) {CIfrEnd EObj; EObj.SetLineNo ((Obj)->getLine());} while (0)
+
+typedef ANTLRCommonToken ANTLRToken;
+
+class CVfrDLGLexer : public VfrLexer
+{
+public:
+ CVfrDLGLexer (DLGFileInput *F) : VfrLexer (F) {};
+ INT32 errstd (char *Text)
+ {
+ printf ("unrecognized input '%s'\n", Text);
+ }
+};
+
+UINT8
+VfrParserStart (
+ IN FILE *File
+ )
+{
+ ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File);
+ return VfrParser.parser()->vfrProgram();
+}
+>>
+
+#lexaction
+<<
+#include <Error.h>
+
+>>
+
+//
+// Define a lexical class for parsing quoted strings. Basically
+// starts with a double quote, and ends with a double quote that
+// is not preceeded with a backslash.
+//
+#lexclass QUOTED_STRING
+#token TheString "~[\"]*\"" << mode (START); >>
+
+//
+// Define a lexclass for skipping over C++ style comments
+//
+#lexclass CPP_COMMENT
+#token "~[\n]*" << skip (); >>
+#token "\n" << skip (); mode (START); newline (); >>
+
+//
+// Standard lexclass is START
+//
+#lexclass START
+
+//
+// Find start of C++ style comments
+//
+#token "//" << skip (); mode (CPP_COMMENT); >>
+
+//
+// Skip whitespace
+//
+#token "[\ \t]" << skip (); >>
+
+//
+// Skip over newlines, but count them
+//
+#token "\n" << skip (); newline (); >>
+
+//
+// Skip over 'extern' in any included .H file
+//
+#token "extern" << skip (); mode (CPP_COMMENT); >>
+
+//
+// Tokens for the different keywords. Syntax is:
+// TokenName("ErrorMessageText") "TokenString"
+// where:
+// TokenName is the token name (must be capitalized) that is used in the rules
+// ErrorMessageText is the string the compiler emits when it detects a syntax error
+// TokenString is the actual matching string used in the user script
+//
+#token FormPkgType("formpkgtype") "formpkgtype"
+#token OpenBrace("{") "\{"
+#token CloseBrace("}") "\}"
+#token OpenParen("(") "\("
+#token CloseParen(")") "\)"
+#token OpenBracket("[") "\["
+#token CloseBracket("]") "\]"
+
+#token LineDefinition "#line\ [0-9]+\ \"~[\"]+\"[\ \t]*\n" << gCVfrErrorHandle.ParseFileScopeRecord (begexpr (), line ()); skip (); newline (); >>
+#token DevicePath("devicepath") "devicepath"
+#token FormSet("formset") "formset"
+#token FormSetId("formsetid") "formsetid"
+#token EndFormSet("endformset") "endformset"
+#token Title("title") "title"
+#token FormId("formid") "formid"
+#token OneOf("oneof") "oneof"
+#token EndoneOf("endoneof") "endoneof"
+#token Prompt("prompt") "prompt"
+#token OrderedList("orderedlist") "orderedlist"
+#token MaxContainers("maxcontainers") "maxcontainers"
+#token EndList("endlist") "endlist"
+#token EndForm("endform") "endform"
+#token EndOneOf("endoneof") "endoneof"
+#token Form("form") "form"
+#token Subtitle("subtitle") "subtitle"
+#token Help("help") "help"
+#token Text("text") "text"
+#token Option("option") "option"
+#token FLAGS("flags") "flags"
+#token Date("date") "date"
+#token EndDate("enddate") "enddate"
+#token Year("year") "year"
+#token Month("month") "month"
+#token Day("day") "day"
+#token Time("time") "time"
+#token EndTime("endtime") "endtime"
+#token Hour("hour") "hour"
+#token Minute("minute") "minute"
+#token Second("second") "second"
+#token GrayOutIf("grayoutif") "grayoutif"
+#token Label("label") "label"
+#token Timeout("timeout") "timeout"
+#token Inventory("inventory") "inventory"
+#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"
+#token Struct("struct") "struct"
+#token Uint64("UINT64") "UINT64"
+#token Uint32("UINT32") "UINT32"
+#token Uint16("UINT16") "UINT16"
+#token Char16("CHAR16") "CHAR16"
+#token Uint8("UINT8") "UINT8"
+#token GUID("guid") "guid"
+#token CheckBox("checkbox") "checkbox"
+#token EndCheckBox("endcheckbox") "endcheckbox"
+#token Numeric("numeric") "numeric"
+#token EndNumeric("endnumeric") "endnumeric"
+#token Minimum("minimum") "minimum"
+#token Maximum("maximum") "maximum"
+#token STEP("step") "step"
+#token Default("default") "default"
+#token Password("password") "password"
+#token EndPassword("endpassword") "endpassword"
+#token String("string") "string"
+#token EndString("endstring") "endstring"
+#token MinSize("minsize") "minsize"
+#token MaxSize("maxsize") "maxsize"
+#token Encoding("encoding") "encoding"
+#token SuppressIf("suppressif") "suppressif"
+#token DisableIf("disableif") "disableif"
+#token Hidden("hidden") "hidden"
+#token Goto("goto") "goto"
+#token FormSetGuid("formsetguid") "formsetguid"
+#token InconsistentIf("inconsistentif") "inconsistentif"
+#token NoSubmitIf("nosubmitif") "nosubmitif"
+#token EndIf("endif") "endif"
+#token Key("key") "key"
+#token DefaultFlag("DEFAULT") "DEFAULT"
+#token ManufacturingFlag("MANUFACTURING") "MANUFACTURING"
+#token InteractiveFlag("INTERACTIVE") "INTERACTIVE"
+#token NVAccessFlag("NV_ACCESS") "NV_ACCESS"
+#token ResetRequiredFlag("RESET_REQUIRED") "RESET_REQUIRED"
+#token LateCheckFlag("LATE_CHECK") "LATE_CHECK"
+#token ReadOnlyFlag("READ_ONLY") "READ_ONLY"
+#token CallBackFlag("INTERACTIVE") "INTERACTIVE"
+#token OptionOnlyFlag("OPTIONS_ONLY") "OPTIONS_ONLY"
+#token Class("class") "class"
+#token Subclass("subclass") "subclass"
+#token TypeDef("typedef") "typedef"
+#token Restore("restore") "restore"
+#token Save("save") "save"
+#token Defaults("defaults") "defaults"
+#token Banner("banner") "banner"
+#token Align("align") "align"
+#token Left("left") "left"
+#token Right("right") "right"
+#token Center("center") "center"
+#token Line("line") "line"
+#token Name("name") "name"
+
+#token VarId("varid") "varid"
+#token Question("question") "question"
+#token QuestionId("questionid") "questionid"
+#token Image("image") "image"
+#token Locked("locked") "locked"
+#token Rule("rule") "rule"
+#token EndRule("endrule") "endrule"
+#token Value("value") "value"
+#token ResetButton("resetbutton") "resetbutton"
+#token EndResetButton("endresetbutton") "endresetbutton"
+#token DefaultStore("defaultstore") "defaultstore"
+#token Attribute("attribute") "attribute"
+#token Varstore("varstore") "varstore"
+#token Efivarstore("efivarstore") "efivarstore"
+#token VarSize("varsize") "varsize"
+#token NameValueVarStore("namevaluevarstore") "namevaluevarstore"
+#token Action("action") "action"
+#token Config("config") "config"
+#token EndAction("endaction") "endaction"
+#token Refresh("refresh") "refresh"
+#token Interval("interval") "interval"
+#token VarstoreDevice("varstoredevice") "varstoredevice"
+//
+// Define the class and subclass tokens
+//
+#token ClassNonDevice("NONDEVICE") "NON_DEVICE"
+#token ClassDiskDevice("DISK_DEVICE") "DISK_DEVICE"
+#token ClassVideoDevice("VIDEO_DEVICE") "VIDEO_DEVICE"
+#token ClassNetworkDevice("NETWORK_DEVICE") "NETWORK_DEVICE"
+#token ClassInputDevice("INPUT_DEVICE") "INPUT_DEVICE"
+#token ClassOnBoardDevice("ONBOARD_DEVICE") "ONBOARD_DEVICE"
+#token ClassOtherDevice("OTHER_DEVICE") "OTHER_DEVICE"
+
+#token SubclassSetupApplication("SETUP_APPLICATION") "SETUP_APPLICATION"
+#token SubclassGeneralApplication("GENERAL_APPLICATION") "GENERAL_APPLICATION"
+#token SubclassFrontPage("FRONT_PAGE") "FRONT_PAGE"
+#token SubclassSingleUse("SINGLE_USE") "SINGLE_USE"
+
+//
+// This is the overall definition of a VFR form definition script.
+//
+
+vfrProgram > [UINT8 Return] :
+ << mParserStatus = 0; >>
+ (
+ (
+ "\#pragma" "pack" "\(" A:Number "\)" << _PCATCH(mCVfrVarDataTypeDB.Pack (_STOU32(A->getText())), A); >>
+ vfrDataStructDefinition
+ "\#pragma" "pack" "\(" "\)" << mCVfrVarDataTypeDB.UnPack (); >>
+ )
+ |
+ (
+ vfrDataStructDefinition
+ )
+ )*
+ vfrFromSetDefinition
+ << $Return = mParserStatus; >>
+ ;
+
+//*****************************************************************************
+//
+// the syntax of data struct definition
+//
+vfrDataStructDefinition :
+ { TypeDef } Struct << mCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
+ { NonNVDataMap }
+ {
+ N1:StringIdentifier << _PCATCH(mCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
+ }
+ OpenBrace
+ vfrDataStructFields
+ CloseBrace
+ {
+ N2:StringIdentifier << _PCATCH(mCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
+ }
+ ";" << mCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>
+ ;
+
+vfrDataStructFields :
+ (
+ dataStructField64 |
+ dataStructField32 |
+ dataStructField16 |
+ dataStructField8 |
+ dataStructFieldBool |
+ dataStructFieldString |
+ dataStructFieldDate |
+ dataStructFieldTime |
+ dataStructFieldUser
+ )*
+ ;
+
+dataStructField64 :
+ << UINT32 ArrayNum = 0; >>
+ "UINT64"
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT64", ArrayNum), N); >>
+ ;
+
+dataStructField32 :
+ << UINT32 ArrayNum = 0; >>
+ "UINT32"
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT32", ArrayNum), N); >>
+ ;
+
+dataStructField16 :
+ << UINT32 ArrayNum = 0; >>
+ ("UINT16" | "CHAR16")
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT16", ArrayNum), N); >>
+ ;
+
+dataStructField8 :
+ << UINT32 ArrayNum = 0; >>
+ "UINT8"
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT8", ArrayNum), N); >>
+ ;
+
+dataStructFieldBool :
+ << UINT32 ArrayNum = 0; >>
+ "BOOLEAN"
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "BOOLEAN", ArrayNum), N); >>
+ ;
+
+dataStructFieldString :
+ << UINT32 ArrayNum = 0; >>
+ "EFI_STRING_ID"
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_STRING_ID", ArrayNum), N); >>
+ ;
+
+dataStructFieldDate :
+ << UINT32 ArrayNum = 0; >>
+ "EFI_HII_DATE"
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_DATE", ArrayNum), N); >>
+ ;
+
+dataStructFieldTime :
+ << UINT32 ArrayNum = 0; >>
+ "EFI_HII_TIME"
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_TIME", ArrayNum), N); >>
+ ;
+
+dataStructFieldUser :
+ << UINT32 ArrayNum = 0; >>
+ T:StringIdentifier
+ N:StringIdentifier
+ {
+ OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText()); >>
+ }
+ ";" << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>
+ ;
+
+//*****************************************************************************
+//
+// the syntax of from set definition
+//
+vfrFromSetDefinition :
+ <<
+ EFI_GUID Guid;
+ CIfrFormSet FSObj;
+ UINT16 C, SC;
+ >>
+ L:FormSet << SET_LINE_INFO (FSObj, L); >>
+ GUID "="
+ OpenBrace
+ G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number ","
+ G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number
+ CloseBrace
+ <<
+ _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (),
+ G4->getText (), G5->getText (), G6->getText (),
+ G7->getText (), G8->getText (), G9->getText (),
+ G10->getText (), G11->getText ());
+ FSObj.SetGuid (&Guid);
+ >>
+ ","
+ Title "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << FSObj.SetFormSetTitle (_STOSID(S1->getText())); >>
+ Help "=" "STRING_TOKEN" "\(" S2:Number "\)" "," << FSObj.SetHelp (_STOSID(S2->getText())); >>
+ {
+ Class "=" classDefinition[C] "," << {CIfrClass CObj; CObj.SetClass(C);} >>
+ }
+ {
+ Subclass "=" subclassDefinition[SC] "," << {CIfrSubClass SCObj; SCObj.SetSubClass(SC);} >>
+ }
+ <<
+ _DeclareStandardDefaultStorage (GET_LINENO (L));
+ //_DeclareDefaultLinearVarStore (GET_LINENO (L));
+ >>
+ vfrFormSetList
+ E:EndFormSet << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrFormSetList :
+ (
+ vfrFormDefinition |
+ vfrStatementImage |
+ vfrStatementVarStoreLinear |
+ vfrStatementVarStoreEfi |
+ vfrStatementVarStoreNameValue |
+ vfrStatementDefaultStore |
+ vfrStatementDisableIfFromSet
+ )*
+ ;
+
+vfrStatementDefaultStore :
+ << UINT16 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>
+ D:DefaultStore N:StringIdentifier ","
+ Prompt "=" "STRING_TOKEN" "\(" S:Number "\)"
+ {
+ "," Attribute "=" A:Number << DefaultId = _STOU16(A->getText()); >>
+ }
+ <<
+ if (mCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {
+ CIfrDefaultStore DSObj;
+ _PCATCH(mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText()), DefaultId)), D->getLine();
+ DSObj.SetLineNo(D->getLine());
+ DSObj.SetDefaultName (_STOSID(S->getText()));
+ DSObj.SetDefaultId (DefaultId);
+ } else {
+ _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText()))), D->getLine();
+ }
+ >>
+ ";"
+ ;
+
+vfrStatementVarStoreLinear :
+ <<
+ EFI_GUID Guid;
+ CIfrVarStore VSObj;
+ INT8 *TypeName;
+ UINT32 LineNum;
+ EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;
+ UINT32 Size;
+ >>
+ V:Varstore << VSObj.SetLineNo(V->getLine()); >>
+ (
+ TN:StringIdentifier "," << TypeName = TN->getText(); LineNum = TN->getLine(); >>
+ | U8:"UINT8" "," << TypeName = "UINT8"; LineNum = U8->getLine(); >>
+ | U16:"UINT16" "," << TypeName = "UINT16"; LineNum = U16->getLine(); >>
+ | U32:"UINT32" "," << TypeName = "UINT32"; LineNum = U32->getLine(); >>
+ | U64:"UINT64" "," << TypeName = "UINT64"; LineNum = U64->getLine(); >>
+ | D:"EFI_HII_DATE" "," << TypeName = "EFI_HII_DATE"; LineNum = D->getLine(); >>
+ | T:"EFI_HII_TIME" "," << TypeName = "EFI_HII_TIME"; LineNum = T->getLine(); >>
+ )
+ { Key "=" Number "," } // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR
+ {
+ VarId "=" ID:Number "," << VarStoreId = _STOU16(ID->getText()); >>
+ }
+ Name "=" SN:StringIdentifier ","
+ GUID "="
+ OpenBrace
+ G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number ","
+ G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number
+ CloseBrace
+ <<
+ _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (),
+ G4->getText (), G5->getText (), G6->getText (),
+ G7->getText (), G8->getText (), G9->getText (),
+ G10->getText (), G11->getText ());
+ >>
+ <<
+ _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (
+ SN->getText(),
+ &Guid,
+ &mCVfrVarDataTypeDB,
+ TypeName,
+ VarStoreId
+ ), LineNum);
+ >>
+ <<
+ VSObj.SetGuid (&Guid);
+ _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);
+ VSObj.SetVarStoreId (VarStoreId);
+ _PCATCH(mCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);
+ VSObj.SetSize (Size);
+ VSObj.SetName (SN->getText());
+ >>
+ ";"
+ ;
+
+vfrStatementVarStoreEfi :
+ <<
+ EFI_GUID Guid;
+ CIfrVarStoreEfi VSEObj;
+ EFI_VARSTORE_ID VarStoreId;
+ UINT32 Attr = 0;
+ >>
+ E:Efivarstore << VSEObj.SetLineNo(E->getLine()); >>
+ SN:StringIdentifier ","
+ Attribute "=" vfrVarStoreEfiAttr[Attr] ( "\|" vfrVarStoreEfiAttr[Attr] )* ","
+ << VSEObj.SetAttributes (Attr); >>
+ Name "=" "STRING_TOKEN" "\(" VN:Number "\)" ","
+ VarSize "=" N:Number ","
+ GUID "="
+ OpenBrace
+ G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number ","
+ G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number
+ CloseBrace
+ <<
+ _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (),
+ G4->getText (), G5->getText (), G6->getText (),
+ G7->getText (), G8->getText (), G9->getText (),
+ G10->getText (), G11->getText ());
+ >>
+ << mCVfrDataStorage.DeclareEfiVarStore (SN->getText(), &Guid, _STOSID(VN->getText()), _STOU32(N->getText())); >>
+ <<
+ VSEObj.SetGuid (&Guid);
+ _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);
+ VSEObj.SetVarStoreId (VarStoreId);
+ >>
+ ";"
+ ;
+
+vfrVarStoreEfiAttr [UINT32 & Attr] :
+ N:Number << $Attr |= _STOU32(N->getText()); >>
+ ;
+
+vfrStatementVarStoreNameValue :
+ <<
+ EFI_GUID Guid;
+ CIfrVarStoreNameValue VSNVObj;
+ EFI_VARSTORE_ID VarStoreId;
+ >>
+ L:NameValueVarStore << VSNVObj.SetLineNo(L->getLine()); >>
+ SN:StringIdentifier "," << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText()), SN); >>
+ (
+ Name "=" "STRING_TOKEN" "\(" N:Number "\)" "," << _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText())), SN); >>
+ )+
+ GUID "="
+ OpenBrace
+ G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number ","
+ G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number
+ CloseBrace
+ <<
+ _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (),
+ G4->getText (), G5->getText (), G6->getText (),
+ G7->getText (), G8->getText (), G9->getText (),
+ G10->getText (), G11->getText ());
+ >>
+ << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>
+ <<
+ VSNVObj.SetGuid (&Guid);
+ _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);
+ VSNVObj.SetVarStoreId (VarStoreId);
+ >>
+ ";"
+ ;
+
+//
+// keep classDeinition and validClassNames for compatibility but not generate
+// any IFR object
+//
+classDefinition[UINT16 & Class] :
+ << $Class = 0; >>
+ validClassNames[$Class] ( "\|" validClassNames[$Class] )*
+ ;
+
+validClassNames[UINT16 & Class] :
+ ClassNonDevice << $Class |= EFI_NON_DEVICE_CLASS; >>
+ | ClassDiskDevice << $Class |= EFI_DISK_DEVICE_CLASS; >>
+ | ClassVideoDevice << $Class |= EFI_VIDEO_DEVICE_CLASS; >>
+ | ClassNetworkDevice << $Class |= EFI_NETWORK_DEVICE_CLASS; >>
+ | ClassInputDevice << $Class |= EFI_INPUT_DEVICE_CLASS; >>
+ | ClassOnBoardDevice << $Class |= EFI_ON_BOARD_DEVICE_CLASS; >>
+ | ClassOtherDevice << $Class |= EFI_OTHER_DEVICE_CLASS; >>
+ | N:Number << $Class |= _STOU16(N->getText()); >>
+ ;
+
+subclassDefinition[UINT16 & SubClass] :
+ << $SubClass = 0; >>
+ SubclassSetupApplication << $SubClass |= EFI_SETUP_APPLICATION_SUBCLASS; >>
+ | SubclassGeneralApplication << $SubClass |= EFI_GENERAL_APPLICATION_SUBCLASS; >>
+ | SubclassFrontPage << $SubClass |= EFI_FRONT_PAGE_SUBCLASS; >>
+ | SubclassSingleUse << $SubClass |= EFI_SINGLE_USE_SUBCLASS; >>
+ | N:Number << $SubClass |= _STOU16(N->getText()); >>
+ ;
+
+vfrStatementDisableIfFromSet :
+ << CIfrDisableIf DIObj; >>
+ D:DisableIf << DIObj.SetLineNo(D->getLine()); >>
+ vfrStatementExpression[0] ";"
+ vfrFormSetList
+ E:EndIf << CRT_END_OP (E); >>
+ ";"
+ ;
+
+//*****************************************************************************
+//
+// the syntax of question header and statement header
+//
+vfrStatementHeader[CIfrStatementHeader *SHObj] :
+ Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText())); >>
+ Help "=" "STRING_TOKEN" "\(" S2:Number "\)" << $SHObj->SetHelp (_STOSID(S2->getText())); >>
+ ;
+
+vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:
+ <<
+ EFI_VARSTORE_INFO Info;
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ INT8 *QName = NULL;
+ INT8 *VarIdStr = NULL;
+ >>
+ {
+ Name "=" QN:StringIdentifier "," <<
+ QName = QN->getText();
+ _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");
+ >>
+ }
+ { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }
+ {
+ QuestionId "=" ID:Number "," <<
+ QId = _STOQID(ID->getText());
+ _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number");
+ >>
+ }
+ <<
+ switch (QType) {
+ case QUESTION_NORMAL:
+ mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);
+ break;
+ case QUESTION_DATE:
+ mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);
+ break;
+ case QUESTION_TIME:
+ mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);
+ break;
+ default:
+ _PCATCH(VFR_RETURN_FATAL_ERROR);
+ }
+ $QHObj.SetQuestionId (QId);
+ $QHObj.SetVarStoreInfo (&Info);
+ >>
+ vfrStatementHeader[&$QHObj]
+ << _SAVE_CURRQEST_VARINFO (Info); >>
+ << if (VarIdStr != NULL) delete VarIdStr; >>
+ ;
+
+vfrQuestionHeaderWithNoStorage[CIfrQuestionHeader *QHObj] :
+ <<
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ INT8 *QName = NULL;
+ >>
+ {
+ Name "=" QN:StringIdentifier "," <<
+ QName = QN->getText();
+ _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");
+ >>
+ }
+ {
+ QuestionId "=" ID:Number "," <<
+ QId = _STOQID(ID->getText());
+ _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "redefined quesiont ID");
+ >>
+ }
+ <<
+ mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);
+ $QHObj->SetQuestionId (QId);
+ >>
+ vfrStatementHeader[$QHObj]
+ ;
+
+questionheaderFlagsField[UINT8 & Flags] :
+ ReadOnlyFlag << $Flags |= 0x01; >>
+ | CallBackFlag << $Flags |= 0x04; >>
+ | ResetRequiredFlag << $Flags |= 0x10; >>
+ | OptionOnlyFlag << $Flags |= 0x80; >>
+ ;
+
+vfrStorageVarId[EFI_VARSTORE_INFO & Info, INT8 *&QuestVarIdStr] :
+ <<
+ UINT32 Idx;
+ UINT32 LineNo;
+ EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;
+ INT8 *VarIdStr = NULL;
+ INT8 *VarStr = NULL;
+ INT8 *SName = NULL;
+ INT8 *TName = NULL;
+ >>
+ (
+ SN1:StringIdentifier << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>
+ OpenBracket I1:Number CloseBracket << Idx = _STOU32(I1->getText()); _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, I1->getText()); _STRCAT(&VarIdStr, "]"); >>
+ <<
+ _PCATCH(mCVfrDataStorage.GetVarStoreType (SName, VarStoreType), SN1);
+ _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1);
+ _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);
+ >>
+ )
+ |
+ (
+ SN2:StringIdentifier << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>
+ <<
+ _PCATCH(mCVfrDataStorage.GetVarStoreType (SName, VarStoreType), SN2);
+ _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);
+ if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {
+ _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);
+ _STRCAT(&VarStr, TName);
+ }
+ >>
+
+ (
+ "." <<
+ _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);
+ _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");
+ >>
+ SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>
+ {
+ OpenBracket I2:Number CloseBracket << _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, I2->getText()); _STRCAT(&VarIdStr, "]"); >>
+ << _STRCAT(&VarStr, "["); _STRCAT(&VarStr, I2->getText()); _STRCAT(&VarStr, "]"); >>
+ }
+ )* <<
+ switch (VarStoreType) {
+ case EFI_VFR_VARSTORE_EFI:
+ _PCATCH(mCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);
+ break;
+ case EFI_VFR_VARSTORE_BUFFER:
+ _PCATCH(mCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine());
+ //_PCATCH(mCVfrDataStorage.BufferVarStoreRequestElementAdd (SName, Info), SN2);
+ break;
+ case EFI_VFR_VARSTORE_NAME:
+ default: break;
+ }
+
+ QuestVarIdStr = VarIdStr;
+ if (VarStr != NULL) {delete VarStr;}
+ >>
+ )
+ ;
+
+vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, INT8 *&VarIdStr, UINT32 &LineNo] :
+ << VarIdStr = NULL; LineNo = 0; >>
+ (
+ SN1:StringIdentifier << _STRCAT(&VarIdStr, SN1->getText()); LineNo = SN1->getLine(); >>
+ OpenBracket I1:Number CloseBracket << _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, I1->getText()); _STRCAT(&VarIdStr, "]"); >>
+ << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>
+ )
+ |
+ (
+ SN2:StringIdentifier << _STRCAT (&VarIdStr, SN2->getText()); LineNo = SN2->getLine(); >>
+ (
+ "." << _STRCAT (&VarIdStr, "."); >>
+ SF:StringIdentifier << _STRCAT(&VarIdStr, SF->getText()); >>
+ {
+ OpenBracket I2:Number CloseBracket << _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, I2->getText()); _STRCAT(&VarIdStr, "]"); >>
+ }
+ )*
+ << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>
+ )
+ ;
+
+vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :
+ N1:Number <<
+ switch ($Type) {
+ case EFI_IFR_TYPE_NUM_SIZE_8 :
+ $Value.u8 = _STOU8(N1->getText());
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_16 :
+ $Value.u16 = _STOU16(N1->getText());
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_32 :
+ $Value.u32 = _STOU32(N1->getText());
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_64 :
+ $Value.u64 = _STOU64(N1->getText());
+ break;
+ case EFI_IFR_TYPE_BOOLEAN :
+ $Value.b = _STOU8(N1->getText());
+ break;
+ case EFI_IFR_TYPE_STRING :
+ $Value.string = _STOU16(N1->getText());
+ break;
+ case EFI_IFR_TYPE_TIME :
+ case EFI_IFR_TYPE_DATE :
+ default :
+ break;
+ }
+ >>
+ | B1:True << $Value.b = TRUE; >>
+ | B2:False << $Value.b = FALSE; >>
+ | O1:One << $Value.u8 = _STOU8(O1->getText()); >>
+ | O2:Ones << $Value.u64 = _STOU64(O2->getText()); >>
+ | Z:Zero << $Value.u8 = _STOU8(Z->getText()); >>
+ | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time = _STOT(HOUR->getText(), MINUTE->getText(), SECOND->getText()); >>
+ | YEAR:Number "/" MONTH:Number "/" DAY:Number << $Value.date = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText()); >>
+ | "STRING_TOKEN" "\(" S1:Number "\)" << $Value.string = _STOSID(S1->getText()); >>
+ ;
+
+//*****************************************************************************
+//
+// the syntax of form definition
+//
+vfrFormDefinition :
+ << CIfrForm FObj; >>
+ F:Form << FObj.SetLineNo(F->getLine()); >>
+ FormId "=" S1:Number "," << _PCATCH(FObj.SetFormId (_STOFID(S1->getText())), S1); >>
+ Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";" << FObj.SetFormTitle (_STOSID(S2->getText())); >>
+ (
+ vfrStatementImage |
+ vfrStatementLocked |
+ vfrStatementRules |
+ vfrStatementDefault |
+ vfrStatementStat |
+ vfrStatementQuestions |
+ vfrStatementConditional |
+ vfrStatementLabel |
+ vfrStatementBanner
+ // Just for framework vfr compatibility
+ //vfrStatementInvalid
+ )*
+ E:EndForm << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrStatementRules :
+ << CIfrRule RObj; >>
+ R:Rule << RObj.SetLineNo(R->getLine()); >>
+ S1:StringIdentifier "," <<
+ mCVfrRulesDB.RegisterRule (S1->getText());
+ RObj.SetRuleId (mCVfrRulesDB.GetRuleId(S1->getText()));
+ >>
+ vfrStatementExpression[0]
+ E:EndRule << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrStatementDefault :
+ <<
+ BOOLEAN IsExp = FALSE;
+ EFI_IFR_TYPE_VALUE Val;
+ CIfrDefault DObj;
+ EFI_DEFAULT_ID DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
+ INT8 *VarStoreName = NULL;
+ EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;
+ >>
+ D:Default << DObj.SetLineNo(D->getLine()); >>
+ (
+ (
+ vfrStatementValue "," << IsExp = TRUE; DObj.SetScope (1); >>
+ | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","
+ << DObj.SetType (_GET_CURRQEST_DATATYPE()); DObj.SetValue(Val); >>
+ )
+ {
+ DefaultStore "=" SN:StringIdentifier "," << _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); DObj.SetDefaultId (DefaultId); >>
+ }
+ <<
+ _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());
+ _PCATCH(mCVfrDataStorage.GetVarStoreType (VarStoreName, VarStoreType), D->getLine());
+ if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) {
+ _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (
+ DefaultId,
+ _GET_CURRQEST_VARTINFO(),
+ VarStoreName,
+ _GET_CURRQEST_DATATYPE (),
+ Val), D->getLine());
+ }
+ >>
+ )
+ ;
+
+vfrStatementStat :
+ vfrStatementSubTitle |
+ vfrStatementStaticText |
+ vfrStatementCrossReference
+ ;
+
+vfrStatementQuestions :
+ vfrStatementBooleanType |
+ vfrStatementDate |
+ vfrStatementNumericType |
+ vfrStatementStringType |
+ vfrStatementOrderedList |
+ vfrStatementTime
+ ;
+
+vfrStatementConditional :
+ vfrStatementDisableIfStat |
+ vfrStatementSuppressIfStat |
+ vfrStatementGrayOutIfStat
+ ;
+
+vfrStatementInvalid :
+ << _CRT_OP (FALSE); >>
+ (
+ vfrStatementInvalidHidden |
+ vfrStatementInvalidInconsistentIf |
+ vfrStatementInvalidInventory |
+ vfrStatementInvalidSaveRestoreDefaults
+ )
+ << _CRT_OP (TRUE); >>
+ ;
+
+flagsField :
+ Number | InteractiveFlag | ManufacturingFlag | DefaultFlag |
+ NVAccessFlag | ResetRequiredFlag | LateCheckFlag
+ ;
+
+vfrStatementValue :
+ << CIfrValue VObj; >>
+ V:Value << VObj.SetLineNo(V->getLine()); >>
+ "=" vfrStatementExpression[0]
+ ;
+
+vfrStatementSubTitle :
+ << CIfrSubtitle SObj; >>
+ L:Subtitle << SObj.SetLineNo(L->getLine()); >>
+ Text "=" "STRING_TOKEN" "\(" S:Number "\)" << SObj.SetPrompt (_STOSID(S->getText())); >>
+ {
+ "," FLAGS "=" vfrSubtitleFlags[SObj]
+ }
+ { vfrStatementStatTagList "," }
+ E:";" << CRT_END_OP (E); >>
+ ;
+
+vfrSubtitleFlags [CIfrSubtitle & SObj] :
+ << UINT8 LFlags = 0; >>
+ subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )*
+ << _PCATCH(SObj.SetFlags (LFlags)); >>
+ ;
+
+subtitleFlagsField [UINT8 & Flags] :
+ N:Number << $Flags |= _STOU8(N->getText()); >>
+ | "HORIZONTAL" << $Flags |= 0x01; >>
+ ;
+
+vfrStatementStaticText :
+ <<
+ UINT8 Flags = 0;
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ EFI_STRING_ID TxtTwo = EFI_STRING_ID_INVALID;
+ >>
+ T:Text
+ Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","
+ Text "=" "STRING_TOKEN" "\(" S2:Number "\)"
+ {
+ "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)" << TxtTwo = _STOSID(S3->getText()); >>
+ }
+ {
+ "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*
+ "," Key "=" KN:Number
+ }
+ <<
+ if (Flags & EFI_IFR_FLAG_CALLBACK) {
+ CIfrAction AObj;
+ mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);
+ AObj.SetQuestionId (QId);
+ AObj.SetPrompt (_STOSID(S2->getText()));
+ AObj.SetHelp (_STOSID(S1->getText()));
+ _PCATCH(AObj.SetFlags (Flags), F->getLine());
+ AssignQuestionKey (AObj, KN);
+ CRT_END_OP (T);
+ } else {
+ CIfrText TObj;
+ TObj.SetLineNo (T->getLine());
+ TObj.SetHelp (_STOSID(S1->getText()));
+ TObj.SetPrompt (_STOSID(S2->getText()));
+ TObj.SetTextTwo (TxtTwo);
+ }
+ >>
+ { "," vfrStatementStatTagList }
+ ";"
+ ;
+
+staticTextFlagsField[UINT8 & HFlags] :
+ N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
+ | questionheaderFlagsField[HFlags]
+ ;
+
+vfrStatementCrossReference :
+ vfrStatementGoto |
+ vfrStatementResetButton
+ ;
+
+vfrStatementGoto :
+ <<
+ UINT8 RefType = 1;
+ EFI_STRING_ID DevPath;
+ EFI_GUID FSId;
+ EFI_FORM_ID FId;
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ UINT32 BitMask;
+ CIfrQuestionHeader *QHObj = NULL;
+ CIfrRef *R1Obj = NULL;
+ CIfrRef2 *R2Obj = NULL;
+ CIfrRef3 *R3Obj = NULL;
+ CIfrRef4 *R4Obj = NULL;
+ >>
+ G:Goto
+ (
+ (
+ DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","
+ FormSetGuid "="
+ OpenBrace
+ G11:Number "," G12:Number "," G13:Number "," G14:Number "," G15:Number "," G16:Number ","
+ G17:Number "," G18:Number "," G19:Number "," G110:Number "," G111:Number
+ CloseBrace ","
+ FormId "=" F1:Number ","
+ Question "=" QN1:Number ","
+ <<
+ RefType = 4;
+ _CRGUID (&FSId, G11->getText (), G12->getText (), G13->getText (),
+ G14->getText (), G15->getText (), G16->getText (),
+ G17->getText (), G18->getText (), G19->getText (),
+ G110->getText (), G111->getText ());
+ DevPath = _STOSID(P->getText());
+ FId = _STOFID(F1->getText());
+ QId = _STOQID(QN1->getText());
+ >>
+ )
+ |
+ (
+ FormSetGuid "="
+ OpenBrace
+ G21:Number "," G22:Number "," G23:Number "," G24:Number "," G25:Number "," G26:Number ","
+ G27:Number "," G28:Number "," G29:Number "," G210:Number "," G211:Number
+ CloseBrace ","
+ FormId "=" F2:Number ","
+ Question "=" QN2:Number ","
+ <<
+ RefType = 3;
+ _CRGUID (&FSId, G21->getText (), G22->getText (), G23->getText (),
+ G24->getText (), G25->getText (), G26->getText (),
+ G27->getText (), G28->getText (), G29->getText (),
+ G210->getText (), G211->getText ());
+ FId = _STOFID(F2->getText());
+ QId = _STOQID(QN2->getText());
+ >>
+ )
+ |
+ (
+ FormId "=" F3:Number "," << RefType = 2; FId = _STOFID(F3->getText()); >>
+ Question "="
+ (
+ QN3:StringIdentifier "," << mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask); >>
+ | QN4:Number "," << QId = _STOQID(QN4->getText()); >>
+ )
+ )
+ |
+ (
+ F4:Number "," <<
+ RefType = 1;
+ FId = _STOFID(F4->getText());
+ >>
+ )
+ )
+ <<
+ switch (RefType) {
+ case 4:
+ {
+ R4Obj = new CIfrRef4;
+ QHObj = R4Obj;
+ R4Obj->SetLineNo(G->getLine());
+ R4Obj->SetDevicePath (DevPath);
+ R4Obj->SetFormSetId (FSId);
+ R4Obj->SetFormId (FId);
+ R4Obj->SetQuestionId (QId);
+ break;
+ }
+ case 3:
+ {
+ R3Obj = new CIfrRef3;
+ QHObj = R3Obj;
+ R3Obj->SetLineNo(G->getLine());
+ R3Obj->SetFormSetId (FSId);
+ R3Obj->SetFormId (FId);
+ R3Obj->SetQuestionId (QId);
+ break;
+ }
+ case 2:
+ {
+ R2Obj = new CIfrRef2;
+ QHObj = R2Obj;
+ R2Obj->SetLineNo(G->getLine());
+ R2Obj->SetFormId (FId);
+ _PCATCH(R2Obj->SetQuestionId (QId), QN3);
+ break;
+ }
+ case 1:
+ {
+ R1Obj = new CIfrRef;
+ QHObj = R1Obj;
+ R1Obj->SetLineNo(G->getLine());
+ R1Obj->SetFormId (FId);
+ break;
+ }
+ default: break;
+ }
+ >>
+ vfrQuestionHeaderWithNoStorage[QHObj]
+ { "," vfrStatementStatTagList }
+ { "," F:FLAGS "=" vfrGotoFlags[QHObj, F->getLine()] }
+ {
+ "," Key "=" KN:Number << AssignQuestionKey (*QHObj, KN); >>
+ }
+ ";" << if (R1Obj != NULL) {delete R1Obj;} if (R2Obj != NULL) {delete R2Obj;} if (R3Obj != NULL) {delete R3Obj;} if (R4Obj != NULL) {delete R4Obj;} >>
+ ;
+
+vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :
+ << UINT8 HFlags = 0; >>
+ gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*
+ << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>
+ ;
+
+gotoFlagsField[UINT8 & HFlags] :
+ N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
+ | questionheaderFlagsField[HFlags]
+ ;
+
+getStringId :
+ "STRING_TOKEN" "\("
+ IdVal:Number
+ "\)"
+ ;
+
+vfrStatementResetButton :
+ <<
+ CIfrResetButton RBObj;
+ UINT16 DefaultId;
+ >>
+ L:ResetButton << RBObj.SetLineNo(L->getLine()); >>
+ DefaultStore
+ "=" N:StringIdentifier "," <<
+ _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());
+ RBObj.SetDefaultId (DefaultId);
+ >>
+ vfrStatementHeader[&RBObj] ","
+ { vfrStatementStatTagList "," }
+ E:EndResetButton << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrStatementBooleanType :
+ vfrStatementCheckBox |
+ vfrStatementAction
+ ;
+
+//*****************************************************
+// Syntax of checkbox
+//
+// Example:
+// checkbox
+// varid = MySTestData.mField1,
+// prompt = STRING_TOKEN(STR_CHECK_BOX_PROMPT),
+// help = STRING_TOKEN(STR_CHECK_BOX_HELP),
+// flags = CHECKBOX_DEFAULT | CALLBACK,
+// default value = TRUE, defaultstore = MyDefaultStore,
+// endcheckbox;
+//
+vfrStatementCheckBox :
+ <<
+ CIfrCheckBox CBObj;
+ >>
+ L:CheckBox << CBObj.SetLineNo(L->getLine()); >>
+ vfrQuestionHeader[CBObj] ","
+ { F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] "," }
+ {
+ Key "=" KN:Number "," << AssignQuestionKey (CBObj, KN); >>
+ }
+ vfrStatementQuestionOptionList
+ E:EndCheckBox << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :
+ <<
+ UINT8 LFlags = 0;
+ UINT8 HFlags = 0;
+ >>
+ checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*
+ << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>
+ ;
+
+checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :
+ N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
+ | "CHECKBOX_DEFAULT" << $LFlags |= 0x01; >>
+ | "CHECKBOX_DEFAULT_MFG" << $LFlags |= 0x02; >>
+ | questionheaderFlagsField[HFlags]
+ ;
+
+//*****************************************************
+// Syntax of action
+//
+// Example:
+// action
+// prompt = STRING_TOKEN(STR_ACTION_PROMPT),
+// help = STRING_TOKEN(STR_ACTION_HELP),
+// flags = CALLBACK,
+// config = STRING_TOKEN(STR_ACTION_CONFIG),
+// endaction;
+//
+vfrStatementAction :
+ << CIfrAction AObj; >>
+ L:Action << AObj.SetLineNo(L->getLine()); >>
+ vfrQuestionHeaderWithNoStorage[&AObj] ","
+ { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }
+ Config "=" "STRING_TOKEN" "\(" S:Number "\)" "," << AObj.SetQuestionConfig (_STOSID(S->getText())); >>
+ vfrStatementQuestionTagList
+ E:EndAction << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :
+ << UINT8 HFlags = 0; >>
+ actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*
+ << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>
+ ;
+
+actionFlagsField[UINT8 & HFlags] :
+ N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
+ | questionheaderFlagsField[HFlags]
+ ;
+
+vfrStatementDate :
+ <<
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ INT8 *VarIdStr[3] = {NULL, };
+ CIfrDate DObj;
+ EFI_IFR_TYPE_VALUE Val;
+ >>
+ L:Date << DObj.SetLineNo(L->getLine()); >>
+ (
+ (
+ vfrQuestionHeader[DObj, QUESTION_DATE] ","
+ { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }
+ vfrStatementQuestionOptionList
+ )
+ |
+ (
+ Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","
+ << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>
+ Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","
+ Help "=" "STRING_TOKEN" "\(" YH:Number "\)" ","
+ minMaxDateStepDefault[Val.date, 0]
+
+ Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","
+ << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>
+ Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","
+ Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","
+ minMaxDateStepDefault[Val.date, 1]
+
+ Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","
+ << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>
+ Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","
+ Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","
+ minMaxDateStepDefault[Val.date, 2]
+ <<
+ mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);
+ DObj.SetQuestionId (QId);
+ DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);
+ DObj.SetPrompt (_STOSID(YP->getText()));
+ DObj.SetHelp (_STOSID(YH->getText()));
+ if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }
+ >>
+ << {CIfrDefault DObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val);} >>
+ ( vfrStatementInconsistentIf )*
+ )
+ )
+ E:EndDate << CRT_END_OP (E); >>
+ ";"
+ ;
+
+minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :
+ Minimum "=" Number ","
+ Maximum "=" Number ","
+ { "step" "=" Number "," }
+ {
+ "default" "=" N:Number "," <<
+ switch (KeyValue) {
+ case 0: D.Year = _STOU16(N->getText()); break;
+ case 1: D.Month = _STOU8(N->getText()); break;
+ case 2: D.Day = _STOU8(N->getText()); break;
+ }
+ >>
+ }
+ ;
+
+vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :
+ << UINT8 LFlags = 0; >>
+ dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*
+ << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>
+ ;
+
+dateFlagsField [UINT8 & Flags] :
+ N:Number << $Flags |= _STOU8(N->getText()); >>
+ | "YEAR_SUPPRESS" << $Flags |= 0x01; >>
+ | "MONTH_SUPPRESS" << $Flags |= 0x02; >>
+ | "DAY_SUPPRESS" << $Flags |= 0x04; >>
+ | "STORAGE_NORMAL" << $Flags |= 0x00; >>
+ | "STORAGE_TIME" << $Flags |= 0x10; >>
+ | "STORAGE_WAKEUP" << $Flags |= 0x20; >>
+ ;
+
+vfrStatementNumericType :
+ vfrStatementNumeric |
+ vfrStatementOneOf
+ ;
+
+vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
+ <<
+ UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;
+ UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;
+ UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;
+ UINT8 MaxU1 = 0, MinU1 = 0, StepU1 = 0;
+ >>
+ Minimum "=" I:Number ","
+ <<
+ switch (_GET_CURRQEST_DATATYPE ()) {
+ case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_8 : MinU1 = _STOU8(I->getText()); break;
+ }
+ >>
+ Maximum "=" A:Number ","
+ <<
+ switch (_GET_CURRQEST_DATATYPE ()) {
+ case EFI_IFR_TYPE_NUM_SIZE_64 : MaxU8 = _STOU64(A->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_32 : MaxU4 = _STOU32(A->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_16 : MaxU2 = _STOU16(A->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_8 : MaxU1 = _STOU8(A->getText()); break;
+ }
+ >>
+ {
+ STEP "=" S:Number ","
+ <<
+ switch (_GET_CURRQEST_DATATYPE ()) {
+ case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText()); break;
+ case EFI_IFR_TYPE_NUM_SIZE_8 : StepU1 = _STOU8(S->getText()); break;
+ }
+ >>
+ }
+ <<
+ switch (_GET_CURRQEST_DATATYPE ()) {
+ case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;
+ case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;
+ case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;
+ case EFI_IFR_TYPE_NUM_SIZE_8 : $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1); break;
+ }
+ >>
+ ;
+
+vfrStatementNumeric :
+ <<
+ CIfrNumeric NObj;
+ >>
+ L:Numeric << NObj.SetLineNo(L->getLine()); >>
+ vfrQuestionHeader[NObj] "," << _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); >>
+ { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }
+ {
+ Key "=" KN:Number "," << AssignQuestionKey (NObj, KN); >>
+ }
+ vfrSetMinMaxStep[NObj]
+ vfrStatementQuestionOptionList
+ E:EndNumeric << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :
+ <<
+ UINT8 LFlags = _GET_CURRQEST_DATATYPE();
+ UINT8 HFlags = 0;
+ >>
+ numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*
+ << _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum); >>
+ ;
+
+numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
+ N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
+ | "DISPLAY_INT_DEC" << $LFlags |= 0x00; >>
+ | "DISPLAY_UINT_DEC" << $LFlags |= 0x10; >>
+ | "DISPLAY_UINT_HEX" << $LFlags |= 0x20; >>
+ | questionheaderFlagsField[HFlags]
+ ;
+
+vfrStatementOneOf :
+ <<
+ CIfrOneOf OObj;
+ >>
+ L:OneOf << OObj.SetLineNo(L->getLine()); >>
+ vfrQuestionHeader[OObj] ","
+ { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }
+ {
+ vfrSetMinMaxStep[OObj]
+ }
+ vfrStatementQuestionOptionList
+ E:EndOneOf << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :
+ <<
+ UINT8 LFlags = _GET_CURRQEST_DATATYPE();
+ UINT8 HFlags = 0;
+ >>
+ numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*
+ << _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum); >>
+ ;
+
+vfrStatementStringType :
+ vfrStatementString |
+ vfrStatementPassword
+ ;
+
+vfrStatementString :
+ <<
+ CIfrString SObj;
+ >>
+ L:String << SObj.SetLineNo(L->getLine()); >>
+ vfrQuestionHeader[SObj] "," << _PCATCH(SObj.SetFlags (SObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); >>
+ { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }
+ {
+ Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >>
+ }
+ MinSize "=" MIN:Number "," << SObj.SetMinSize (_STOU8(MIN->getText())); >>
+ MaxSize "=" MAX:Number "," << SObj.SetMaxSize (_STOU8(MAX->getText())); >>
+ vfrStatementQuestionOptionList
+ E:EndString << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :
+ <<
+ UINT8 LFlags = 0;
+ UINT8 HFlags = 0;
+ >>
+ stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*
+ << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>
+ ;
+
+stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
+ N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
+ | "MULTI_LINE" << $LFlags = 0x01; >>
+ | questionheaderFlagsField[HFlags]
+ ;
+
+vfrStatementPassword :
+ <<
+ CIfrPassword PObj;
+ >>
+ L:Password << PObj.SetLineNo(L->getLine()); >>
+ vfrQuestionHeader[PObj] ","
+ { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }
+ {
+ Key "=" KN:Number "," << AssignQuestionKey (PObj, KN); >>
+ }
+ MinSize "=" MIN:Number "," << PObj.SetMinSize (_STOU16(MIN->getText())); >>
+ MaxSize "=" MAX:Number "," << PObj.SetMaxSize (_STOU16(MAX->getText())); >>
+ { Encoding "=" Number "," }
+ vfrStatementQuestionOptionList
+ E:EndPassword << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :
+ << UINT8 HFlags = 0; >>
+ passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*
+ << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>
+ ;
+
+passwordFlagsField [UINT8 & HFlags] :
+ N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
+ | questionheaderFlagsField[HFlags]
+ ;
+
+vfrStatementOrderedList :
+ <<
+ CIfrOrderedList OLObj;
+ >>
+ L:OrderedList << OLObj.SetLineNo(L->getLine()); >>
+ vfrQuestionHeader[OLObj] ","
+ << OLObj.SetMaxContainers ((UINT8)_GET_CURRQEST_VARSIZE()); >>
+ {
+ MaxContainers "=" M:Number "," << OLObj.SetMaxContainers (_STOU8(M->getText())); >>
+ }
+ { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] }
+ vfrStatementQuestionOptionList
+ E:EndList << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :
+ <<
+ UINT8 HFlags = 0;
+ UINT8 LFlags = 0;
+ >>
+ orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*
+ << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>
+ ;
+
+orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
+ N:Number << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>
+ | "UNIQUE" << $LFlags |= 0x01; >>
+ | "NOEMPTY" << $LFlags |= 0x02; >>
+ | questionheaderFlagsField[HFlags]
+ ;
+
+vfrStatementTime :
+ <<
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ INT8 *VarIdStr[3] = {NULL, };
+ CIfrTime TObj;
+ EFI_IFR_TYPE_VALUE Val;
+ >>
+ L:Time << TObj.SetLineNo(L->getLine()); >>
+ (
+ (
+ vfrQuestionHeader[TObj, QUESTION_TIME] ","
+ { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }
+ vfrStatementDefault
+ )
+ |
+ (
+ Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","
+ << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>
+ Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","
+ Help "=" "STRING_TOKEN" "\(" HH:Number "\)" ","
+ minMaxTimeStepDefault[Val.time, 0]
+
+ Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","
+ << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>
+ Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","
+ Help "=" "STRING_TOKEN" "\(" MH:Number "\)" ","
+ minMaxTimeStepDefault[Val.time, 1]
+
+ Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","
+ << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>
+ Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","
+ Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","
+ minMaxTimeStepDefault[Val.time, 2]
+ <<
+ mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);
+ TObj.SetQuestionId (QId);
+ TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);
+ TObj.SetPrompt (_STOSID(HP->getText()));
+ TObj.SetHelp (_STOSID(HH->getText()));
+ if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }
+ >>
+ << {CIfrDefault DObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val);} >>
+ )
+ )
+ E:EndTime << CRT_END_OP (E); >>
+ ";"
+ ;
+
+minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :
+ Minimum "=" Number ","
+ Maximum "=" Number ","
+ { "step" "=" Number "," }
+ {
+ "default" "=" N:Number "," <<
+ switch (KeyValue) {
+ case 0: T.Hour = _STOU8(N->getText()); break;
+ case 1: T.Minute = _STOU8(N->getText()); break;
+ case 2: T.Second = _STOU8(N->getText()); break;
+ }
+ >>
+ }
+ ;
+
+vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :
+ << UINT8 LFlags = 0; >>
+ timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*
+ << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>
+ ;
+
+timeFlagsField [UINT8 & Flags] :
+ N:Number << $Flags |= _STOU8(N->getText()); >>
+ | "HOUR_SUPPRESS" << $Flags |= 0x01; >>
+ | "MINUTE_SUPPRESS" << $Flags |= 0x02; >>
+ | "SECOND_SUPPRESS" << $Flags |= 0x04; >>
+ | "STORAGE_NORMAL" << $Flags |= 0x00; >>
+ | "STORAGE_TIME" << $Flags |= 0x10; >>
+ | "STORAGE_WAKEUP" << $Flags |= 0x20; >>
+ ;
+
+vfrStatementQuestionTag :
+ vfrStatementStatTag "," |
+ vfrStatementInconsistentIf |
+ vfrStatementNoSubmitIf |
+ vfrStatementDisableIfQuest |
+ vfrStatementRefresh |
+ vfrStatementVarstoreDevice
+ ;
+
+vfrStatementQuestionTagList :
+ ( vfrStatementQuestionTag )*
+ ;
+
+vfrStatementQuestionOptionTag :
+ vfrStatementSuppressIfQuest |
+ vfrStatementValue |
+ vfrStatementDefault |
+ vfrStatementOptions
+ ;
+
+vfrStatementQuestionOptionList :
+ (
+ vfrStatementQuestionTag |
+ vfrStatementQuestionOptionTag
+ )*
+ ;
+
+vfrStatementStatList :
+ vfrStatementStat |
+ vfrStatementQuestions |
+ vfrStatementConditional |
+ // Just for framework vfr compatibility
+ vfrStatementLabel
+ //vfrStatementInvalid
+ ;
+
+vfrStatementDisableIfStat :
+ << CIfrDisableIf DIObj; >>
+ L:DisableIf << DIObj.SetLineNo(L->getLine()); >>
+ vfrStatementExpression[0] ";"
+ ( vfrStatementStatList )*
+ E:EndIf << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrStatementSuppressIfStat :
+ << CIfrSuppressIf SIObj; >>
+ L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>
+ { FLAGS "=" flagsField ( "\|" flagsField )* "," }
+ vfrStatementExpression[0] ";"
+ ( vfrStatementStatList )*
+ E:EndIf << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrStatementGrayOutIfStat :
+ << CIfrGrayOutIf GOIObj; >>
+ L:GrayOutIf << GOIObj.SetLineNo(L->getLine()); >>
+ { FLAGS "=" flagsField ( "\|" flagsField )* "," }
+ vfrStatementExpression[0]
+ ";"
+ ( vfrStatementStatList )*
+ E:EndIf << CRT_END_OP (E); >>
+ ";"
+ ;
+
+vfrImageTag :
+ << CIfrImage IObj; >>
+ L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)" << IObj.SetImageId (_STOSID(S1->getText())); IObj.SetLineNo(L->getLine()); >>
+ ;
+
+vfrLockedTag :
+ << CIfrLocked LObj; >>
+ L:Locked << LObj.SetLineNo(L->getLine()); >>
+ ;
+
+vfrStatementStatTag :
+ vfrImageTag |
+ vfrLockedTag
+ ;
+
+vfrStatementStatTagList :
+ vfrStatementStatTag ( "," vfrStatementStatTag )*
+ ;
+
+vfrStatementImage :
+ vfrImageTag
+ ";"
+ ;
+
+vfrStatementLocked :
+ vfrLockedTag
+ ";"
+ ;
+
+vfrStatementInconsistentIf :
+ << CIfrInconsistentIf IIObj; >>
+ L:InconsistentIf << IIObj.SetLineNo(L->getLine()); >>
+ Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << IIObj.SetError (_STOSID(S->getText())); >>
+ { FLAGS "=" flagsField ( "\|" flagsField )* "," }
+ vfrStatementExpression[0]
+ E:EndIf << CRT_END_OP (E); >>
+ ;
+
+vfrStatementNoSubmitIf :
+ << CIfrNoSubmitIf NSIObj; >>
+ L:NoSubmitIf << NSIObj.SetLineNo(L->getLine()); >>
+ Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" "," << NSIObj.SetError (_STOSID(S->getText())); >>
+ { FLAGS "=" flagsField ( "\|" flagsField )* "," }
+ vfrStatementExpression[0]
+ E:EndIf << CRT_END_OP (E); >>
+ ;
+
+vfrStatementDisableIfQuest :
+ << CIfrDisableIf DIObj; >>
+ L:DisableIf << DIObj.SetLineNo(L->getLine()); >>
+ vfrStatementExpression[0] ";"
+ vfrStatementQuestionOptionList
+ E:EndIf << CRT_END_OP (E); >>
+ ;
+
+vfrStatementRefresh :
+ << CIfrRefresh RObj; >>
+ L:Refresh << RObj.SetLineNo(L->getLine()); >>
+ Interval "=" I:Number << RObj.SetRefreshInterval (_STOU8(I->getText())); >>
+ ;
+
+vfrStatementVarstoreDevice :
+ << CIfrVarStoreDevice VDObj; >>
+ L:VarstoreDevice << VDObj.SetLineNo(L->getLine()); >>
+ "=" "STRING_TOKEN" "\(" S:Number "\)" "," << VDObj.SetDevicePath (_STOSID(S->getText())); >>
+ ;
+
+vfrStatementSuppressIfQuest :
+ << CIfrSuppressIf SIObj; >>
+ L:SuppressIf << SIObj.SetLineNo(L->getLine()); >>
+ { FLAGS "=" flagsField ( "\|" flagsField )* "," }
+ vfrStatementExpression[0] ";"
+ vfrStatementQuestionOptionList
+ E:EndIf << CRT_END_OP (E); >>
+ ;
+
+vfrStatementOptions :
+ vfrStatementOneOfOption
+ ;
+
+vfrStatementOneOfOption :
+ <<
+ EFI_IFR_TYPE_VALUE Val;
+ CIfrOneOfOption OOOObj;
+ INT8 *VarStoreName = NULL;
+
+ >>
+ L:Option << OOOObj.SetLineNo(L->getLine()); >>
+ Text "=" "STRING_TOKEN" "\(" S:Number "\)" "," << OOOObj.SetOption (_STOSID(S->getText())); >>
+ Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] "," << OOOObj.SetType (_GET_CURRQEST_DATATYPE()); OOOObj.SetValue (Val); >>
+ F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]
+ <<
+ if (OOOObj.GetFlags () & 0x10) {
+ _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());
+ _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (
+ EFI_HII_DEFAULT_CLASS_STANDARD,
+ _GET_CURRQEST_VARTINFO(),
+ VarStoreName,
+ _GET_CURRQEST_DATATYPE (),
+ Val
+ ), L->getLine());
+ }
+ >>
+ { "," Key "=" Number } // no use in UEFI2.1 VFR
+ (
+ "," vfrImageTag << OOOObj.SetScope (1); CIfrEnd EOOOObj; >>
+ )*
+ ";"
+ ;
+
+vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :
+ <<
+ UINT8 LFlags = _GET_CURRQEST_DATATYPE();
+ UINT8 HFlags = 0;
+ >>
+ oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*
+ << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>
+ << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>
+ ;
+
+oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
+ N:Number << $LFlags |= _STOU8(N->getText()); >>
+ | "OPTION_DEFAULT" << $LFlags |= 0x10; >>
+ | "OPTION_DEFAULT_MFG" << $LFlags |= 0x20; >>
+ | InteractiveFlag << $HFlags |= 0x04; >>
+ | NVAccessFlag << $HFlags |= 0x08; >>
+ | ResetRequiredFlag << $HFlags |= 0x10; >>
+ | LateCheckFlag << $HFlags |= 0x20; >>
+ | ManufacturingFlag << $LFlags |= 0x20; >>
+ | DefaultFlag << $LFlags |= 0x10; >>
+ ;
+
+//vfrStatementGuid :
+// <<
+// EFI_GUID Guid;
+// CIfrGuid GObj;
+// >>
+// GuidAction
+// GUID "="
+// OpenBrace
+// G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number ","
+// G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number
+// CloseBrace
+// <<
+// _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (),
+// G4->getText (), G5->getText (), G6->getText (),
+// G7->getText (), G8->getText (), G9->getText (),
+// G10->getText (), G11->getText ());
+// >>
+// << GObj.SetGuid (&Guid); >>
+// ";"
+// ;
+
+vfrStatementLabel :
+ << CIfrLabel LObj; >>
+ L:Label << LObj.SetLineNo(L->getLine()); >>
+ N:Number << LObj.SetNumber (_STOU16(N->getText())); >>
+ ";"
+ ;
+
+vfrStatementBanner :
+ << CIfrBanner BObj; >>
+ B:Banner { "," } << BObj.SetLineNo(B->getLine()); >>
+ Title "=" "STRING_TOKEN" "\(" S:Number "\)" "," << BObj.SetTitle (_STOSID(S->getText())); >>
+ (
+ (
+ Line L:Number "," << BObj.SetLine (_STOU16(L->getText())); >>
+ Align
+ (
+ Left << BObj.SetAlign (0); >>
+ | Center << BObj.SetAlign (1); >>
+ | Right << BObj.SetAlign (2); >>
+ ) ";"
+ )
+ |
+ (
+ Timeout "=" T:Number ";" << {CIfrTimeout TObj(_STOU16(T->getText()));} >>
+ )
+ )
+ ;
+
+//******************************************************************************
+//
+// keep some syntax for compatibility but not generate any IFR object
+//
+vfrStatementInvalidHidden :
+ Hidden
+ Value "=" Number ","
+ Key "=" Number ";"
+ ;
+
+vfrStatementInvalidInconsistentIf :
+ InconsistentIf
+ Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","
+ { FLAGS "=" flagsField ( "\|" flagsField )* "," }
+ vfrStatementExpression[0]
+ EndIf
+ ";"
+ ;
+
+vfrStatementInvalidInventory :
+ Inventory
+ Help "=" "STRING_TOKEN" "\(" Number "\)" ","
+ Text "=" "STRING_TOKEN" "\(" Number "\)" ","
+ {
+ Text "=" "STRING_TOKEN" "\(" Number "\)"
+ }
+ ";"
+ ;
+
+vfrStatementInvalidSaveRestoreDefaults :
+ (Save | Restore)
+ Defaults ","
+ FormId "=" Number ","
+ Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","
+ Help "=" "STRING_TOKEN" "\(" Number "\)"
+ { "," FLAGS "=" flagsField ( "\|" flagsField )* }
+ { "," Key "=" Number }
+ ";"
+ ;
+
+//******************************************************************************
+//
+// The syntax of expression
+//
+#token Dup("dup") "dup"
+#token VarEqVal("vareqval") "vareqval"
+#token Var("var") "var"
+#token IdEqVal("ideqval") "ideqval"
+#token IdEqId("ideqid") "ideqid"
+#token IdEqValList("ideqvallist") "ideqvallist"
+#token QuestionRef("questionref") "questionref"
+#token RuleRef("ruleref") "ruleref"
+#token StringRef("stringref") "stringref"
+#token PushThis("pushthis") "pushthis"
+#token True("TRUE") "TRUE"
+#token False("FALSE") "FALSE"
+#token One("ONE") "ONE"
+#token Ones("ONES") "ONES"
+#token Zero("ZERO") "ZERO"
+#token Undefined("UNDEFINED") "UNDEFINED"
+#token Version("VERSOPM") "VERSION"
+#token Length("length") "length"
+#token AND("AND") "AND"
+#token OR("OR") "OR"
+#token NOT("NOT") "NOT"
+#token BitWiseNot("~") "\~"
+#token BoolVal("boolval") "boolval"
+#token StringVal("stringval") "stringval"
+#token UnIntVal("unintval") "unintval"
+#token ToUpper("toupper") "toupper"
+#token ToLower("tolower") "tolower"
+#token Match("match") "match"
+#token Catenate("catenate") "catenate"
+#token QuestionRefVal("questionrefval") "questionrefval"
+#token StringRefVal("stringrefval") "stringrefval"
+
+vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :
+ << if ($RootLevel == 0) {_CLEAR_SAVED_OPHDR ();} >>
+ andTerm[$RootLevel, $ExpOpCount]
+ (
+ L:OR andTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>
+ )*
+ << if (($RootLevel == 0) && ($ExpOpCount > 1)) {_SET_SAVED_OPHDR_SCOPE(); CIfrEnd EObj; } >>
+ ;
+
+andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ bitwiseorTerm[$RootLevel, $ExpOpCount]
+ (
+ L:AND bitwiseorTerm [$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>
+ )*
+ ;
+
+bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ bitwiseandTerm[$RootLevel, $ExpOpCount]
+ (
+ L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>
+ )*
+ ;
+
+bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ equalTerm[$RootLevel, $ExpOpCount]
+ (
+ L:"&" equalTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>
+ )*
+ ;
+
+equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ compareTerm[$RootLevel, $ExpOpCount]
+ (
+ (
+ L1:"==" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>
+ )
+ |
+ (
+ L2:"!=" compareTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>
+ )
+ )*
+ ;
+
+compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ shiftTerm[$RootLevel, $ExpOpCount]
+ (
+ (
+ L1:"<" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>
+ )
+ |
+ (
+ L2:"<=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>
+ )
+ |
+ (
+ L3:">" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>
+ )
+ |
+ (
+ L4:">=" shiftTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>
+ )
+ )*
+ ;
+
+shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ addMinusTerm[$RootLevel, $ExpOpCount]
+ (
+ (
+ L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>
+ )
+ |
+ (
+ L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>
+ )
+ )*
+ ;
+
+addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ multdivmodTerm[$RootLevel, $ExpOpCount]
+ (
+ (
+ L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>
+ )
+ |
+ (
+ L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>
+ )
+ )*
+ ;
+
+multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ atomTerm[$RootLevel, $ExpOpCount]
+ (
+ (
+ L1:"\*" atomTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>
+ )
+ |
+ (
+ L2:"/" atomTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>
+ )
+ |
+ (
+ L3:"%" atomTerm[$RootLevel, $ExpOpCount] << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>
+ )
+ )*
+ ;
+
+atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ vfrExpressionCatenate[$RootLevel, $ExpOpCount]
+ | vfrExpressionMatch[$RootLevel, $ExpOpCount]
+ | vfrExpressionParen[$RootLevel, $ExpOpCount]
+ | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]
+ | vfrExpressionConstant[$RootLevel, $ExpOpCount]
+ | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]
+ | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]
+ | (
+ L:NOT
+ atomTerm[$RootLevel, $ExpOpCount] << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>
+ )
+ ;
+
+vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ L:Catenate
+ "\("
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "\)" << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ L:Match
+ "\("
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "\)" << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:
+ "\("
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "\)"
+ ;
+
+vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ dupExp[$RootLevel, $ExpOpCount]
+ | ideqvalExp[$RootLevel, $ExpOpCount]
+ | ideqidExp[$RootLevel, $ExpOpCount]
+ | ideqvallistExp[$RootLevel, $ExpOpCount]
+ | questionref13Exp[$RootLevel, $ExpOpCount]
+ | rulerefExp[$RootLevel, $ExpOpCount]
+ | stringref1Exp[$RootLevel, $ExpOpCount]
+ | pushthisExp[$RootLevel, $ExpOpCount]
+ ;
+
+dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:Dup << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0)); $ExpOpCount++; } >>
+ ;
+
+ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ <<
+ EFI_QUESTION_ID QId;
+ UINT32 Mask;
+ UINT16 ConstVal;
+ INT8 *VarIdStr;
+ UINT32 LineNo;
+ >>
+ L:IdEqVal
+ vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]
+ (
+ (
+ "=="
+ V1:Number << ConstVal = _STOU16(V1->getText()); >>
+ <<
+ if (Mask == 0) {
+ CIfrEqIdVal EIVObj (L->getLine());
+ _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0));
+ EIVObj.SetQuestionId (QId, VarIdStr, LineNo);
+ EIVObj.SetValue (ConstVal);
+ $ExpOpCount++;
+ } else {
+ IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);
+ }
+ >>
+ )
+ |
+ (
+ "<="
+ V2:Number << ConstVal = _STOU16(V2->getText()); >>
+ << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>
+ )
+ |
+ (
+ "<"
+ V3:Number << ConstVal = _STOU16(V3->getText()); >>
+ << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>
+ )
+ |
+ (
+ ">="
+ V4:Number << ConstVal = _STOU16(V4->getText()); >>
+ << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>
+ )
+ |
+ (
+ ">"
+ V5:Number << ConstVal = _STOU16(V5->getText()); >>
+ << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>
+ )
+ )
+ ;
+
+ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ <<
+ EFI_QUESTION_ID QId[2];
+ UINT32 Mask[2];
+ INT8 *VarIdStr[2];
+ UINT32 LineNo[2];
+ >>
+ L:IdEqId
+ vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]
+ (
+ (
+ "=="
+ vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
+ <<
+ if (Mask[0] & Mask[1]) {
+ IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);
+ } else {
+ CIfrEqIdId EIIObj(L->getLine());
+ _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0));
+ EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);
+ EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);
+ $ExpOpCount++;
+ }
+ >>
+ )
+ |
+ (
+ "<="
+ vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
+ << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>
+ )
+ |
+ (
+ "<"
+ vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
+ << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>
+ )
+ |
+ (
+ ">="
+ vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
+ << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>
+ )
+ |
+ (
+ ">"
+ vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]
+ << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>
+ )
+ )
+ ;
+
+ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ <<
+ UINT16 ListLen = 0;
+ EFI_QUESTION_ID QId;
+ UINT32 Mask;
+ UINT16 ValueList[EFI_IFR_MAX_LENGTH] = {0,};
+ INT8 *VarIdStr;
+ UINT32 LineNo;
+ >>
+ L:IdEqValList
+ vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]
+ "=="
+ (
+ V:Number << ValueList[ListLen] = _STOU16(V->getText()); ListLen++; >>
+ )+
+ <<
+ if (Mask != 0) {
+ IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);
+ } else {
+ UINT16 Index;
+ CIfrEqIdList EILObj(L->getLine());
+ _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0));
+ EILObj.SetQuestionId (QId, VarIdStr, LineNo);
+ EILObj.SetListLength (ListLen);
+ for (Index = 0; Index < ListLen; Index++) {
+ EILObj.SetValueList (Index, ValueList[Index]);
+ }
+ $ExpOpCount++;
+ }
+ >>
+ ;
+
+vareqvarlExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:VarEqVal Var "\(" V1:Number "\)" "==" V2:Number <<
+ {
+ CIfrUint64 U64Obj1(L->getLine()), U64Obj2(L->getLine());
+ _SAVE_OPHDR_COND (U64Obj1, ($ExpOpCount == 0));
+ U64Obj1.SetValue (_STOU64(V1->getText()));
+ U64Obj2.SetValue (_STOU64(V2->getText()));
+ }
+ >>
+ << {CIfrEqual EObj(L->getLine()); } >>
+ << $ExpOpCount += 3; >>
+ ;
+
+questionref13Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ <<
+ UINT8 Type = 0x1;
+ EFI_STRING_ID DevPath;
+ EFI_GUID Guid;
+ EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
+ UINT32 BitMask;
+ INT8 *QName = NULL;
+ UINT32 LineNo = 0;
+ >>
+ L:QuestionRef
+ (
+ (
+ << Type = 0x3; >>
+ {
+ Path "=" "STRING_TOKEN" "\(" S:Number "\)" << Type = 0x4; DevPath = _STOSID(S->getText()); >>
+ }
+ {
+ GUID "="
+ OpenBrace
+ G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number ","
+ G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number
+ CloseBrace
+ <<
+ Type = 0x5;
+ _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (),
+ G4->getText (), G5->getText (), G6->getText (),
+ G7->getText (), G8->getText (), G9->getText (),
+ G10->getText (), G11->getText ());
+ >>
+ }
+ )
+ |
+ (
+ "\("
+ (
+ QN:StringIdentifier <<
+ QName = QN->getText();
+ LineNo = QN->getLine();
+ mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);
+ >>
+ | ID:Number << QId = _STOQID(ID->getText()); >>
+ )
+ "\)"
+ )
+ )
+ <<
+ switch (Type) {
+ case 0x1: {CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0)); QR1Obj.SetQuestionId (QId, QName, LineNo); break;}
+ case 0x3: {CIfrQuestionRef3 QR3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3Obj, ($ExpOpCount == 0)); break;}
+ case 0x4: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0)); QR3_2Obj.SetDevicePath (DevPath); break;}
+ case 0x5: {CIfrQuestionRef3_3 QR3_3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_3Obj, ($ExpOpCount == 0)); QR3_3Obj.SetDevicePath (DevPath); QR3_3Obj.SetGuid (&Guid); break;}
+ }
+ $ExpOpCount++;
+ >>
+ ;
+
+rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:RuleRef
+ "\(" RN:StringIdentifier "\)" << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0)); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>
+ ;
+
+//******************************************************
+// PARSE:
+// stringref (STR_FORM_SET_TITLE)
+//
+stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:StringRef
+ "\(" S:Number "\)" << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0)); SR1Obj.SetStringId (_STOSID(S->getText())); $ExpOpCount++; } >>
+ ;
+
+pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:PushThis << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0)); $ExpOpCount++; } >>
+ ;
+
+vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L1:True << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0)); $ExpOpCount++; >>
+ | L2:False << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0)); $ExpOpCount++; >>
+ | L3:One << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0)); $ExpOpCount++; >>
+ | L4:Ones << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0)); $ExpOpCount++; >>
+ | L5:Zero << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0)); $ExpOpCount++; >>
+ | L6:Undefined << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0)); $ExpOpCount++; >>
+ | L7:Version << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0)); $ExpOpCount++; >>
+ | V:Number << CIfrUint64 U64Obj(V->getLine()); U64Obj.SetValue (_STOU64(V->getText())); _SAVE_OPHDR_COND (U64Obj, ($ExpOpCount == 0)); $ExpOpCount++; >>
+ ;
+
+vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ lengthExp[$RootLevel, $ExpOpCount]
+ | bitwisenotExp[$RootLevel, $ExpOpCount]
+ | question2refExp[$RootLevel, $ExpOpCount]
+ | stringref2Exp[$RootLevel, $ExpOpCount]
+ | unintExp[$RootLevel, $ExpOpCount]
+ | toupperExp[$RootLevel, $ExpOpCount]
+ | tolwerExp[$RootLevel, $ExpOpCount]
+ ;
+
+lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:Length
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:BitWiseNot
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+question2refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:QuestionRefVal
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrQuestionRef2 QR2Obj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:StringRefVal
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:BoolVal
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ << UINT8 Fmt = 0; >>
+ L:StringVal
+ {
+ Format "=" F:Number "," << Fmt = _STOU8(F->getText()); >>
+ }
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>
+ ;
+
+unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:UnIntVal
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:ToUpper
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:ToLower
+ "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"
+ << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ conditionalExp[$RootLevel, $ExpOpCount]
+ | findExp[$RootLevel, $ExpOpCount]
+ | midExp[$RootLevel, $ExpOpCount]
+ | tokenExp[$RootLevel, $ExpOpCount]
+ | spanExp[$RootLevel, $ExpOpCount]
+ ;
+
+#token Cond("cond") "cond"
+#token Find("find") "find"
+#token Mid("mid") "mid"
+#token Tok("token") "token"
+#token Span("span") "span"
+
+conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:Cond "\("
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "?"
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ":"
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "\)" << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ << UINT8 Format; >>
+ L:Find "\("
+ findFormat[Format] ( "\|" findFormat[Format] )*
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "\)" << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>
+ ;
+
+findFormat [UINT8 & Format] :
+ "SENSITIVE" << $Format = 0x00; >>
+ | "INSENSITIVE" << $Format = 0x01; >>
+ ;
+
+midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:Mid "\("
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "\)" << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ L:Tok "\("
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "\)" << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>
+ ;
+
+spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
+ << UINT8 Flags = 0; >>
+ S:Span "\("
+ FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ ","
+ vfrStatementExpression[$RootLevel + 1, $ExpOpCount]
+ "\)" << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>
+ ;
+
+spanFlags [UINT8 & Flags] :
+ N:Number << $Flags |= _STOU8(N->getText()); >>
+ | "LAST_NON_MATCH" << $Flags |= 0x00; >>
+ | "FIRST_NON_MATCH" << $Flags |= 0x01; >>
+ ;
+
+#token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"
+#token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"
+
+//******************************************************************************
+//
+// Parser class definition.
+//
+class EfiVfrParser {
+<<
+private:
+ UINT8 mParserStatus;
+
+ CVfrDefaultStore mCVfrDefaultStore;
+ CVfrVarDataTypeDB mCVfrVarDataTypeDB;
+ CVfrDataStorage mCVfrDataStorage;
+ CVfrQuestionDB mCVfrQuestionDB;
+ CVfrRulesDB mCVfrRulesDB;
+
+ CIfrOpHeader *mCIfrOpHdr;
+ VOID _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN);
+ VOID _CLEAR_SAVED_OPHDR (VOID);
+ VOID _SET_SAVED_OPHDR_SCOPE (VOID);
+
+
+ EFI_VARSTORE_INFO mCurrQestVarInfo;
+
+ VOID _CRT_OP (IN BOOLEAN);
+
+ VOID _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);
+ EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);
+
+ UINT8 _GET_CURRQEST_DATATYPE ();
+ UINT32 _GET_CURRQEST_VARSIZE ();
+
+public:
+ VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr, IN INT8 *);
+ VOID _PCATCH (IN EFI_VFR_RETURN_CODE);
+ VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);
+ VOID _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);
+
+ VOID syn (ANTLRAbstractToken *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);
+
+ INT8 * TrimHex (IN INT8 *, OUT BOOLEAN *);
+ UINT8 _STOU8 (IN INT8 *);
+ UINT16 _STOU16 (IN INT8 *);
+ UINT32 _STOU32 (IN INT8 *);
+ UINT64 _STOU64 (IN INT8 *);
+ EFI_HII_DATE _STOD (IN INT8 *, IN INT8 *, IN INT8 *);
+ EFI_HII_TIME _STOT (IN INT8 *, IN INT8 *, IN INT8 *);
+
+ EFI_STRING_ID _STOSID (IN INT8 *);
+ EFI_FORM_ID _STOFID (IN INT8 *);
+ EFI_QUESTION_ID _STOQID (IN INT8 *);
+
+ VOID _STRCAT (IN OUT INT8 **, IN INT8 *);
+
+ VOID _CRGUID (EFI_GUID *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *);
+ VOID _DeclareDefaultLinearVarStore (IN UINT32);
+ VOID _DeclareStandardDefaultStorage (IN UINT32);
+
+
+ VOID AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);
+
+ VOID ConvertIdExpr (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32);
+ VOID IdEqValDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);
+ VOID IdEqIdDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32, IN EFI_COMPARE_TYPE);
+ VOID IdEqListDoSpecial (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32, IN UINT16, IN UINT16 *);
+>>
+}
+
+<<
+VOID
+EfiVfrParser::_SAVE_OPHDR_COND (
+ IN CIfrOpHeader &OpHdr,
+ IN BOOLEAN Cond
+ )
+{
+ if (Cond == TRUE) {
+#ifdef VFREXP_DEBUG
+ printf ("######_SAVE_OPHDR_COND\n");
+#endif
+ if (mCIfrOpHdr != NULL) {
+#ifdef VFREXP_DEBUG
+ printf ("######_SAVE_OPHDR_COND Error\n");
+#endif
+ return ;
+ }
+ mCIfrOpHdr = new CIfrOpHeader(OpHdr);
+ }
+}
+
+VOID
+EfiVfrParser::_CLEAR_SAVED_OPHDR (
+ VOID
+ )
+{
+#ifdef VFREXP_DEBUG
+ printf ("######_CLEAR_SAVED_OPHDR\n");
+#endif
+ mCIfrOpHdr = NULL;
+}
+
+VOID
+EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (
+ VOID
+ )
+{
+#ifdef VFREXP_DEBUG
+ printf ("#######_SET_SAVED_OPHDR_SCOPE\n");
+#endif
+ mCIfrOpHdr->SetScope (1);
+}
+
+VOID
+EfiVfrParser::_CRT_OP (
+ IN BOOLEAN Crt
+ )
+{
+ gCreateOp = Crt;
+}
+
+VOID
+EfiVfrParser::_SAVE_CURRQEST_VARINFO (
+ IN EFI_VARSTORE_INFO &Info
+ )
+{
+ mCurrQestVarInfo = Info;
+}
+
+EFI_VARSTORE_INFO &
+EfiVfrParser::_GET_CURRQEST_VARTINFO (
+ VOID
+ )
+{
+ return mCurrQestVarInfo;
+}
+
+UINT8
+EfiVfrParser::_GET_CURRQEST_DATATYPE (
+ VOID
+ )
+{
+ return mCurrQestVarInfo.mVarType;
+}
+
+UINT32
+EfiVfrParser::_GET_CURRQEST_VARSIZE (
+ VOID
+ )
+{
+ return mCurrQestVarInfo.mVarTotalSize;
+}
+
+VOID
+EfiVfrParser::_PCATCH (
+ IN EFI_VFR_RETURN_CODE ReturnCode,
+ IN EFI_VFR_RETURN_CODE ExpectCode,
+ IN ANTLRTokenPtr Tok,
+ IN INT8 *ErrorMsg
+ )
+{
+ if (ReturnCode != ExpectCode) {
+ mParserStatus++;
+ gCVfrErrorHandle.PrintError (Tok->getLine(), Tok->getText(), ErrorMsg);
+ }
+}
+
+VOID
+EfiVfrParser::_PCATCH (
+ IN EFI_VFR_RETURN_CODE ReturnCode
+ )
+{
+ mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode);
+}
+
+VOID
+EfiVfrParser::_PCATCH (
+ IN EFI_VFR_RETURN_CODE ReturnCode,
+ IN ANTLRTokenPtr Tok
+ )
+{
+ mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());
+}
+
+VOID
+EfiVfrParser::_PCATCH (
+ IN EFI_VFR_RETURN_CODE ReturnCode,
+ IN UINT32 LineNum
+ )
+{
+ mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum);
+}
+
+VOID
+EfiVfrParser::syn (
+ ANTLRAbstractToken *Tok,
+ ANTLRChar *Egroup,
+ SetWordType *Eset,
+ ANTLRTokenType ETok,
+ INT32 Huh
+ )
+{
+ gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());
+
+ mParserStatus += 1;
+}
+
+INT8 *
+EfiVfrParser::TrimHex (
+ IN INT8 *Str,
+ OUT BOOLEAN *IsHex
+ )
+{
+ *IsHex = FALSE;
+
+ while (*Str && *Str == ' ') {
+ Str++;
+ }
+ while (*Str && *Str == '0') {
+ Str++;
+ }
+ if (*Str && (*Str == 'x' || *Str == 'X')) {
+ Str++;
+ *IsHex = TRUE;
+ }
+
+ return Str;
+}
+
+UINT8
+EfiVfrParser::_STOU8 (
+ IN INT8 *Str
+ )
+{
+ BOOLEAN IsHex;
+ UINT8 Value;
+ INT8 c;
+
+ Str = TrimHex (Str, &IsHex);
+ for (Value = 0; (c = *Str) != '\0'; Str++) {
+ //
+ // BUG: does not handle overflow here
+ //
+ (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
+
+ if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
+ Value += (c - 'a' + 10);
+ }
+ if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
+ Value += (c - 'A' + 10);
+ }
+ if (c >= '0' && c <= '9') {
+ Value += (c - '0');
+ }
+ }
+
+ return Value;
+}
+
+UINT16
+EfiVfrParser::_STOU16 (
+ IN INT8 *Str
+ )
+{
+ BOOLEAN IsHex;
+ UINT16 Value;
+ INT8 c;
+
+ Str = TrimHex (Str, &IsHex);
+ for (Value = 0; (c = *Str) != '\0'; Str++) {
+ //
+ // BUG: does not handle overflow here
+ //
+ (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
+
+ if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
+ Value += (c - 'a' + 10);
+ }
+ if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
+ Value += (c - 'A' + 10);
+ }
+ if (c >= '0' && c <= '9') {
+ Value += (c - '0');
+ }
+ }
+
+ return Value;
+}
+
+UINT32
+EfiVfrParser::_STOU32 (
+ IN INT8 *Str
+ )
+{
+ BOOLEAN IsHex;
+ UINT32 Value;
+ INT8 c;
+
+ Str = TrimHex (Str, &IsHex);
+ for (Value = 0; (c = *Str) != '\0'; Str++) {
+ //
+ // BUG: does not handle overflow here
+ //
+ (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
+
+ if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
+ Value += (c - 'a' + 10);
+ }
+ if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
+ Value += (c - 'A' + 10);
+ }
+ if (c >= '0' && c <= '9') {
+ Value += (c - '0');
+ }
+ }
+
+ return Value;
+}
+
+UINT64
+EfiVfrParser::_STOU64 (
+ IN INT8 *Str
+ )
+{
+ BOOLEAN IsHex;
+ UINT64 Value;
+ INT8 c;
+
+ Str = TrimHex (Str, &IsHex);
+ for (Value = 0; (c = *Str) != '\0'; Str++) {
+ //
+ // BUG: does not handle overflow here
+ //
+ (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
+
+ if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
+ Value += (c - 'a' + 10);
+ }
+ if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
+ Value += (c - 'A' + 10);
+ }
+ if (c >= '0' && c <= '9') {
+ Value += (c - '0');
+ }
+ }
+
+ return Value;
+}
+
+EFI_HII_DATE
+EfiVfrParser::_STOD (
+ IN INT8 *Year,
+ IN INT8 *Month,
+ IN INT8 *Day
+ )
+{
+ EFI_HII_DATE Date;
+
+ Date.Year = _STOU16 (Year);
+ Date.Month = _STOU8 (Month);
+ Date.Day = _STOU8 (Day);
+
+ return Date;
+}
+
+EFI_HII_TIME
+EfiVfrParser::_STOT (
+ IN INT8 *Hour,
+ IN INT8 *Minute,
+ IN INT8 *Second
+ )
+{
+ EFI_HII_TIME Time;
+
+ Time.Hour = _STOU8 (Hour);
+ Time.Minute = _STOU8 (Minute);
+ Time.Second = _STOU8 (Second);
+
+ return Time;
+}
+
+EFI_STRING_ID
+EfiVfrParser::_STOSID (
+ IN INT8 *Str
+ )
+{
+ return (EFI_STRING_ID)_STOU16(Str);
+}
+
+EFI_FORM_ID
+EfiVfrParser::_STOFID (
+ IN INT8 *Str
+ )
+{
+ return (EFI_FORM_ID)_STOU16(Str);
+}
+
+EFI_QUESTION_ID
+EfiVfrParser::_STOQID (
+ IN INT8 *Str
+ )
+{
+ return (EFI_QUESTION_ID)_STOU16(Str);
+}
+
+VOID
+EfiVfrParser::_STRCAT (
+ IN OUT INT8 **Dest,
+ IN INT8 *Src
+ )
+{
+ INT8 *NewStr;
+ UINT32 Len;
+
+ if ((Dest == NULL) || (Src == NULL)) {
+ return;
+ }
+
+ Len = (*Dest == NULL) ? 0 : strlen (*Dest);
+ Len += strlen (Src);
+ if ((NewStr = new INT8[Len + 1]) == NULL) {
+ return;
+ }
+ NewStr[0] = '\0';
+ if (*Dest != NULL) {
+ strcpy (NewStr, *Dest);
+ }
+ strcat (NewStr, Src);
+
+ *Dest = NewStr;
+}
+
+VOID
+EfiVfrParser::_CRGUID (
+ IN EFI_GUID *Guid,
+ IN INT8 *G1,
+ IN INT8 *G2,
+ IN INT8 *G3,
+ IN INT8 *G4,
+ IN INT8 *G5,
+ IN INT8 *G6,
+ IN INT8 *G7,
+ IN INT8 *G8,
+ IN INT8 *G9,
+ IN INT8 *G10,
+ IN INT8 *G11
+ )
+{
+ Guid->Data1 = _STOU32 (G1);
+ Guid->Data2 = _STOU16 (G2);
+ Guid->Data3 = _STOU16 (G3);
+ Guid->Data4[0] = _STOU8(G4);
+ Guid->Data4[1] = _STOU8(G5);
+ Guid->Data4[2] = _STOU8(G6);
+ Guid->Data4[3] = _STOU8(G7);
+ Guid->Data4[4] = _STOU8(G8);
+ Guid->Data4[5] = _STOU8(G9);
+ Guid->Data4[6] = _STOU8(G10);
+ Guid->Data4[7] = _STOU8(G11);
+}
+
+VOID
+EfiVfrParser::_DeclareDefaultLinearVarStore (
+ IN UINT32 LineNo
+ )
+{
+ UINT32 Index;
+ INT8 **TypeNameList;
+ UINT32 ListSize;
+ EFI_GUID DefaultGuid = { 0x9db3c415, 0xda00, 0x4233, { 0xae, 0xc6, 0x79, 0xb, 0x4f, 0x5b, 0x45, 0x66 } };
+
+ mCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);
+
+ for (Index = 0; Index < ListSize; Index++) {
+ UINT32 Size;
+ EFI_VARSTORE_ID VarStoreId;
+ CIfrVarStore VSObj;
+
+ VSObj.SetLineNo (LineNo);
+ mCVfrDataStorage.DeclareBufferVarStore (
+ TypeNameList[Index],
+ &DefaultGuid,
+ &mCVfrVarDataTypeDB,
+ TypeNameList[Index],
+ EFI_VARSTORE_ID_INVALID
+ );
+ mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId);
+ VSObj.SetVarStoreId (VarStoreId);
+ mCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);
+ VSObj.SetSize (Size);
+ VSObj.SetName (TypeNameList[Index]);
+ VSObj.SetGuid (&DefaultGuid);
+ }
+
+ if (mCVfrVarDataTypeDB.IsTypeNameDefined ("Date") == FALSE) {
+ UINT32 Size;
+ EFI_VARSTORE_ID VarStoreId;
+ CIfrVarStore VSObj;
+
+ VSObj.SetLineNo (LineNo);
+ mCVfrDataStorage.DeclareBufferVarStore (
+ "Date",
+ &DefaultGuid,
+ &mCVfrVarDataTypeDB,
+ "EFI_HII_DATE",
+ EFI_VARSTORE_ID_INVALID
+ );
+ mCVfrDataStorage.GetVarStoreId("Date", &VarStoreId);
+ VSObj.SetVarStoreId (VarStoreId);
+ mCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_DATE", &Size);
+ VSObj.SetSize (Size);
+ VSObj.SetName ("Date");
+ VSObj.SetGuid (&DefaultGuid);
+ }
+
+ if (mCVfrVarDataTypeDB.IsTypeNameDefined ("Time") == FALSE) {
+ UINT32 Size;
+ EFI_VARSTORE_ID VarStoreId;
+ CIfrVarStore VSObj;
+
+ VSObj.SetLineNo (LineNo);
+ mCVfrDataStorage.DeclareBufferVarStore (
+ "Time",
+ &DefaultGuid,
+ &mCVfrVarDataTypeDB,
+ "EFI_HII_TIME",
+ EFI_VARSTORE_ID_INVALID
+ );
+ mCVfrDataStorage.GetVarStoreId("Time", &VarStoreId);
+ VSObj.SetVarStoreId (VarStoreId);
+ mCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_TIME", &Size);
+ VSObj.SetSize (Size);
+ VSObj.SetName ("Time");
+ VSObj.SetGuid (&DefaultGuid);
+ }
+}
+
+VOID
+EfiVfrParser::_DeclareStandardDefaultStorage (
+ IN UINT32 LineNo
+ )
+{
+ CIfrDefaultStore DSObj;
+
+ mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);
+ DSObj.SetLineNo (LineNo);
+ DSObj.SetDefaultName (EFI_STRING_ID_INVALID);
+ DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);
+}
+
+VOID
+EfiVfrParser::AssignQuestionKey (
+ IN CIfrQuestionHeader &QHObj,
+ IN ANTLRTokenPtr KeyTok
+ )
+{
+ UINT16 KeyValue;
+
+ if (KeyTok == NULL) {
+ return;
+ }
+
+ KeyValue = _STOU16 (KeyTok->getText());
+
+ if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {
+ /*
+ * if the question is not CALLBACK ignore the key.
+ */
+ _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);
+ QHObj.SetQuestionId (KeyValue);
+ }
+}
+
+VOID
+EfiVfrParser::ConvertIdExpr (
+ IN UINT32 &ExpOpCount,
+ IN UINT32 LineNo,
+ IN EFI_QUESTION_ID QId,
+ IN INT8 *VarIdStr,
+ IN UINT32 BitMask
+ )
+{
+ CIfrQuestionRef1 QR1Obj(LineNo);
+ QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);
+ _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));
+
+ if (BitMask != 0) {
+ CIfrUint32 U32Obj(LineNo);
+ U32Obj.SetValue (BitMask);
+
+ CIfrBitWiseAnd BWAObj(LineNo);
+
+ CIfrUint8 U8Obj(LineNo);
+ switch (BitMask) {
+ case DATE_YEAR_BITMASK : U8Obj.SetValue (0); break;
+ case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;
+ case DATE_DAY_BITMASK : U8Obj.SetValue (0x18); break;
+ case TIME_HOUR_BITMASK : U8Obj.SetValue (0); break;
+ case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;
+ }
+
+ CIfrShiftRight SRObj(LineNo);
+ }
+
+ ExpOpCount += 4;
+}
+
+VOID
+EfiVfrParser::IdEqValDoSpecial (
+ IN UINT32 &ExpOpCount,
+ IN UINT32 LineNo,
+ IN EFI_QUESTION_ID QId,
+ IN INT8 *VarIdStr,
+ IN UINT32 BitMask,
+ IN UINT16 ConstVal,
+ IN EFI_COMPARE_TYPE CompareType
+ )
+{
+ ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);
+
+ if (ConstVal > 0xFF) {
+ CIfrUint16 U16Obj(LineNo);
+ U16Obj.SetValue (ConstVal);
+ } else {
+ CIfrUint8 U8Obj(LineNo);
+ U8Obj.SetValue ((UINT8)ConstVal);
+ }
+
+ switch (CompareType) {
+ case EQUAL :
+ {
+ CIfrEqual EObj(LineNo);
+ break;
+ }
+ case LESS_EQUAL :
+ {
+ CIfrLessEqual LEObj(LineNo);
+ break;
+ }
+ case LESS_THAN :
+ {
+ CIfrLessThan LTObj(LineNo);
+ break;
+ }
+ case GREATER_EQUAL :
+ {
+ CIfrGreaterEqual GEObj(LineNo);
+ break;
+ }
+ case GREATER_THAN :
+ {
+ CIfrGreaterThan GTObj(LineNo);
+ break;
+ }
+ }
+
+ ExpOpCount += 2;
+}
+
+VOID
+EfiVfrParser::IdEqIdDoSpecial (
+ IN UINT32 &ExpOpCount,
+ IN UINT32 LineNo,
+ IN EFI_QUESTION_ID QId1,
+ IN INT8 *VarId1Str,
+ IN UINT32 BitMask1,
+ IN EFI_QUESTION_ID QId2,
+ IN INT8 *VarId2Str,
+ IN UINT32 BitMask2,
+ IN EFI_COMPARE_TYPE CompareType
+ )
+{
+ ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);
+ ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);
+
+ switch (CompareType) {
+ case EQUAL :
+ {
+ CIfrEqual EObj(LineNo);
+ break;
+ }
+ case LESS_EQUAL :
+ {
+ CIfrLessEqual LEObj(LineNo);
+ break;
+ }
+ case LESS_THAN :
+ {
+ CIfrLessThan LTObj(LineNo);
+ break;
+ }
+ case GREATER_EQUAL :
+ {
+ CIfrGreaterEqual GEObj(LineNo);
+ break;
+ }
+ case GREATER_THAN :
+ {
+ CIfrGreaterThan GTObj(LineNo);
+ break;
+ }
+ }
+
+ ExpOpCount++;
+}
+
+VOID
+EfiVfrParser::IdEqListDoSpecial (
+ IN UINT32 &ExpOpCount,
+ IN UINT32 LineNo,
+ IN EFI_QUESTION_ID QId,
+ IN INT8 *VarIdStr,
+ IN UINT32 BitMask,
+ IN UINT16 ListLen,
+ IN UINT16 *ValueList
+ )
+{
+ UINT16 Index;
+
+ if (ListLen == 0) {
+ return;
+ }
+
+ IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);
+ for (Index = 1; Index < ListLen; Index++) {
+ IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);
+ CIfrOr OObj (LineNo);
+ ExpOpCount++;
+ }
+}
+
+>>
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.cpp b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.cpp
new file mode 100644
index 0000000000..8ff77e783b
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.cpp
@@ -0,0 +1,2695 @@
+#include "stdio.h"
+#include "stdlib.h"
+#include "VfrUtilityLib.h"
+#include "VfrFormPkg.h"
+
+VOID
+CVfrBinaryOutput::WriteLine (
+ IN FILE *pFile,
+ IN UINT32 LineBytes,
+ IN INT8 *LineHeader,
+ IN INT8 *BlkBuf,
+ IN UINT32 BlkSize
+ )
+{
+ UINT32 Index;
+
+ if ((pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {
+ return;
+ }
+
+ for (Index = 0; Index < BlkSize; Index++) {
+ if ((Index % LineBytes) == 0) {
+ fprintf (pFile, "\n%s", LineHeader);
+ }
+ fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);
+ }
+}
+
+VOID
+CVfrBinaryOutput::WriteEnd (
+ IN FILE *pFile,
+ IN UINT32 LineBytes,
+ IN INT8 *LineHeader,
+ IN INT8 *BlkBuf,
+ IN UINT32 BlkSize
+ )
+{
+ UINT32 Index;
+
+ if ((BlkSize == 0) || (pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {
+ return;
+ }
+
+ for (Index = 0; Index < BlkSize - 1; Index++) {
+ if ((Index % LineBytes) == 0) {
+ fprintf (pFile, "\n%s", LineHeader);
+ }
+ fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);
+ }
+
+ if ((Index % LineBytes) == 0) {
+ fprintf (pFile, "\n%s", LineHeader);
+ }
+ fprintf (pFile, "0x%02X\n", (UINT8)BlkBuf[Index]);
+}
+
+SConfigInfo::SConfigInfo (
+ IN UINT8 Type,
+ IN UINT16 Offset,
+ IN UINT32 Width,
+ IN EFI_IFR_TYPE_VALUE Value
+ )
+{
+ mOffset = Offset;
+ mWidth = (UINT16)Width;
+ mValue = new UINT8[mWidth];
+ if (mValue == NULL) {
+ return;
+ }
+
+ switch (Type) {
+ case EFI_IFR_TYPE_NUM_SIZE_8 :
+ memcpy (mValue, &Value.u8, mWidth);
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_16 :
+ memcpy (mValue, &Value.u16, mWidth);
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_32 :
+ memcpy (mValue, &Value.u32, mWidth);
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_64 :
+ memcpy (mValue, &Value.u64, mWidth);
+ break;
+ case EFI_IFR_TYPE_BOOLEAN :
+ memcpy (mValue, &Value.b, mWidth);
+ break;
+ case EFI_IFR_TYPE_TIME :
+ memcpy (mValue, &Value.time, mWidth);
+ break;
+ case EFI_IFR_TYPE_DATE :
+ memcpy (mValue, &Value.date, mWidth);
+ break;
+ case EFI_IFR_TYPE_STRING :
+ memcpy (mValue, &Value.string, mWidth);
+ break;
+ case EFI_IFR_TYPE_OTHER :
+ return;
+ }
+}
+
+SConfigInfo::~SConfigInfo (
+ VOID
+ )
+{
+ BUFFER_SAFE_FREE (mValue);
+}
+
+SConfigItem::SConfigItem (
+ IN INT8 *Id,
+ IN INT8 *Info
+ )
+{
+ mId = NULL;
+ mInfo = NULL;
+ mInfoStrList = NULL;
+ mNext = NULL;
+
+ if (Id != NULL) {
+ if ((mId = new INT8[strlen (Id) + 1]) != NULL) {
+ strcpy (mId, Id);
+ }
+ }
+
+ if (Info != NULL) {
+ if ((mInfo = new INT8[strlen (Info) + 1]) != NULL) {
+ strcpy (mInfo, Info);
+ }
+ }
+}
+
+SConfigItem::SConfigItem (
+ IN INT8 *Id,
+ IN INT8 *Info,
+ IN UINT8 Type,
+ IN UINT16 Offset,
+ IN UINT16 Width,
+ IN EFI_IFR_TYPE_VALUE Value
+ )
+{
+ mId = NULL;
+ mInfo = NULL;
+ mInfoStrList = NULL;
+ mNext = NULL;
+
+ if (Id != NULL) {
+ if ((mId = new INT8[strlen (Id) + 1]) != NULL) {
+ strcpy (mId, Id);
+ }
+ }
+
+ if (Info != NULL) {
+ if ((mInfo = new INT8[strlen (Info) + 1]) != NULL) {
+ strcpy (mInfo, Info);
+ }
+ }
+
+ mInfoStrList = new SConfigInfo(Type, Offset, Width, Value);
+}
+
+SConfigItem::~SConfigItem (
+ VOID
+ )
+{
+ SConfigInfo *Info;
+
+ BUFFER_SAFE_FREE (mId);
+ BUFFER_SAFE_FREE (mInfo);
+ while (mInfoStrList != NULL) {
+ Info = mInfoStrList;
+ mInfoStrList = mInfoStrList->mNext;
+
+ BUFFER_SAFE_FREE (Info);
+ }
+}
+
+UINT8
+CVfrBufferConfig::Register (
+ IN INT8 *Id,
+ IN INT8 *Info
+ )
+{
+ SConfigItem *pNew;
+
+ if (Select (Id) == 0) {
+ return 1;
+ }
+
+ if ((pNew = new SConfigItem (Id, Info)) == NULL) {
+ return 2;
+ }
+ if (mItemListHead == NULL) {
+ mItemListHead = pNew;
+ mItemListTail = pNew;
+ } else {
+ mItemListTail->mNext = pNew;
+ mItemListTail = pNew;
+ }
+ mItemListPos = pNew;
+
+ return 0;
+}
+
+VOID
+CVfrBufferConfig::Open (
+ VOID
+ )
+{
+ mItemListPos = mItemListHead;
+}
+
+BOOLEAN
+CVfrBufferConfig::Eof(
+ VOID
+ )
+{
+ return (mItemListPos == NULL) ? TRUE : FALSE;
+}
+
+UINT8
+CVfrBufferConfig::Select (
+ IN INT8 *Id,
+ IN INT8 *Info
+ )
+{
+ SConfigItem *p;
+
+ if (Id == NULL) {
+ mItemListPos = mItemListHead;
+ return 0;
+ } else {
+ for (p = mItemListHead; p != NULL; p = p->mNext) {
+ if (strcmp (p->mId, Id) != 0) {
+ continue;
+ }
+
+ if ((p->mInfo != NULL) && (Info != NULL)) {
+ if (strcmp (p->mInfo, Info) != 0) {
+ continue;
+ }
+ }
+
+ mItemListPos = p;
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+UINT8
+CVfrBufferConfig::Write (
+ IN CONST CHAR8 Mode,
+ IN INT8 *Id,
+ IN INT8 *Info,
+ IN UINT8 Type,
+ IN UINT16 Offset,
+ IN UINT32 Width,
+ IN EFI_IFR_TYPE_VALUE Value
+ )
+{
+ UINT8 Ret;
+ SConfigItem *pItem;
+ SConfigInfo *pInfo;
+
+ switch (Mode) {
+ case 'a' : // add
+ if (Select (Id) == 0) {
+ if((pInfo = new SConfigInfo (Type, Offset, Width, Value)) == NULL) {
+ return 2;
+ }
+ pInfo->mNext = mItemListPos->mInfoStrList;
+ mItemListPos->mInfoStrList = pInfo;
+ } else {
+ if ((pItem = new SConfigItem (Id, Info, Type, Offset, Width, Value)) == NULL) {
+ return 2;
+ }
+ if (mItemListHead == NULL) {
+ mItemListHead = pItem;
+ mItemListTail = pItem;
+ } else {
+ mItemListTail->mNext = pItem;
+ mItemListTail = pItem;
+ }
+ mItemListPos = pItem;
+ }
+ break;
+
+ case 'd' : // delete
+ if ((Ret = Select (Id)) != 0) {
+ return Ret;
+ }
+
+ if (mItemListHead == mItemListPos) {
+ mItemListHead = mItemListPos->mNext;
+ delete mItemListPos;
+ break;
+ }
+
+ for (pItem = mItemListHead; pItem->mNext != mItemListPos; pItem = pItem->mNext)
+ ;
+
+ pItem->mNext = mItemListPos->mNext;
+ if (mItemListTail == mItemListPos) {
+ mItemListTail = pItem;
+ }
+ delete mItemListPos;
+ mItemListPos = pItem->mNext;
+ break;
+
+ case 'i' : // set info
+ if ((Ret = Select (Id)) != 0) {
+ return Ret;
+ }
+ if (mItemListPos->mInfo != NULL) {
+ delete mItemListPos->mInfo;
+ }
+ mItemListPos->mInfo = NULL;
+ if (Info != NULL) {
+ if ((mItemListPos->mInfo = new INT8[strlen (Info) + 1]) == NULL) {
+ return 2;
+ }
+ strcpy (mItemListPos->mInfo, Info);
+ }
+ break;
+
+ default :
+ return 1;
+ }
+
+ return 0;
+}
+
+#if 0
+UINT8
+CVfrBufferConfig::ReadId (
+ OUT INT8 **Id,
+ OUT INT8 **Info
+ )
+{
+ if (mInfoStrItemListPos == NULL) {
+ return 1; // end read or some error occur
+ }
+
+ if (Id != NULL) {
+ *Id = new INT8 (strlen (mInfoStrItemListPos->mId + 1));
+ strcpy (*Id, mInfoStrItemListPos->mId);
+ }
+ if (Info != NULL) {
+ *Info = new INT8 (strlen (mInfoStrItemListPos->mInfo + 1));
+ strcpy (*Info, mInfoStrItemListPos->mInfo);
+ }
+
+ return 0;
+}
+
+UINT8
+CVfrBufferConfig::ReadInfo (
+ IN INT8 *Id,
+ IN UINT32 Index,
+ IN OUT UINT32 &Number,
+ OUT INT8 *Offset,
+ OUT INT8 *Width,
+ OUT INT8 *Value
+ )
+{
+ UINT8 ret;
+ SConfigInfo *p;
+ UINT32 idx;
+ UINT32 num;
+
+ if (Id != NULL) {
+ if ((ret = Select (Id)) != 0) {
+ return ret;
+ }
+ }
+
+ if (mInfoStrItemListPos == NULL) {
+ return 1; // end read or some error occur
+ }
+
+ p = mInfoStrItemListPos->mInfoStrList;
+ for (idx = 0; (idx < Index) && (p != NULL); idx++) {
+ p = p->mNext;
+ }
+ if (p == NULL) {
+ return 1;
+ }
+
+ if (Offset != NULL) {
+ Offset[0] = '\0';
+ }
+ if (Width != NULL) {
+ Width[0] = '\0';
+ }
+ if (Value != NULL) {
+ Value[0] = '\0';
+ }
+
+ while (num < Number) {
+ if (Offset != NULL) {
+ strcat (Offset, p->mOffset);
+ }
+ if (Width != NULL) {
+ strcat (Width, p->mWidth);
+ }
+ if (Value != NULL) {
+ strcat (Value, p->mValue);
+ }
+
+ num++;
+ if ((p = p->mNext) == NULL) {
+ break;
+ }
+ }
+ Number = num;
+
+ return 0;
+}
+
+VOID
+CVfrBufferConfig::ReadNext (
+ VOID
+ )
+{
+ if (mItemListPos != NULL) {
+ mItemListPos = mItemListPos->mNext;
+ }
+}
+#endif
+
+VOID
+CVfrBufferConfig::Close (
+ VOID
+ )
+{
+ mItemListPos = NULL;
+}
+
+#define BYTES_PRE_LINE 0x10
+
+VOID
+CVfrBufferConfig::OutputCFile (
+ IN FILE *pFile,
+ IN INT8 *BaseName
+ )
+{
+ CVfrBinaryOutput Output;
+ SConfigItem *Item;
+ SConfigInfo *Info;
+ UINT32 TotalLen;
+
+ if (pFile == NULL) {
+ return;
+ }
+
+ for (Item = mItemListHead; Item != NULL; Item = Item->mNext) {
+ if (Item->mInfoStrList != NULL) {
+ fprintf (pFile, "\nunsigned char %s%sDefault%04x[] = {", BaseName, Item->mId, Item->mInfo);
+
+ TotalLen = sizeof (UINT32);
+ for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {
+ TotalLen += Info->mWidth + sizeof (UINT16) * 2;
+ }
+ Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&TotalLen, sizeof (UINT32));
+
+ for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {
+ Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mOffset, sizeof (UINT16));
+ Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mWidth, sizeof (UINT16));
+ if (Info->mNext == NULL) {
+ Output.WriteEnd (pFile, BYTES_PRE_LINE, " ", (INT8 *)Info->mValue, Info->mWidth);
+ } else {
+ Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)Info->mValue, Info->mWidth);
+ }
+ fprintf (pFile, "\n");
+ }
+ fprintf (pFile, "};\n");
+ }
+ }
+}
+
+CVfrBufferConfig::CVfrBufferConfig (
+ VOID
+ )
+{
+ mItemListHead = NULL;
+ mItemListTail = NULL;
+ mItemListPos = NULL;
+}
+
+CVfrBufferConfig::~CVfrBufferConfig (
+ VOID
+ )
+{
+ SConfigItem *p;
+
+ while (mItemListHead != NULL) {
+ p = mItemListHead;
+ mItemListHead = mItemListHead->mNext;
+ delete p;
+ }
+
+ mItemListHead = NULL;
+ mItemListTail = NULL;
+ mItemListPos = NULL;
+}
+
+CVfrBufferConfig gCVfrBufferConfig;
+
+static struct {
+ INT8 *mTypeName;
+ UINT8 mType;
+ UINT32 mSize;
+ UINT32 mAlign;
+} gInternalTypesTable [] = {
+ {"UINT64", EFI_IFR_TYPE_NUM_SIZE_64, sizeof (UINT64), sizeof (UINT64)},
+ {"UINT32", EFI_IFR_TYPE_NUM_SIZE_32, sizeof (UINT32), sizeof (UINT32)},
+ {"UINT16", EFI_IFR_TYPE_NUM_SIZE_16, sizeof (UINT16), sizeof (UINT16)},
+ {"UINT8", EFI_IFR_TYPE_NUM_SIZE_8, sizeof (UINT8), sizeof (UINT8)},
+ {"BOOLEAN", EFI_IFR_TYPE_BOOLEAN, sizeof (BOOLEAN), sizeof (BOOLEAN)},
+ {"EFI_HII_DATE", EFI_IFR_TYPE_DATE, sizeof (EFI_HII_DATE), sizeof (UINT8)},
+ {"EFI_STRING_ID", EFI_IFR_TYPE_STRING, sizeof (EFI_STRING_ID),sizeof (EFI_STRING_ID)},
+ {"EFI_HII_TIME", EFI_IFR_TYPE_TIME, sizeof (EFI_HII_TIME), sizeof (UINT8)},
+ {NULL, EFI_IFR_TYPE_OTHER, 0, 0}
+};
+
+STATIC
+BOOLEAN
+_IS_INTERNAL_TYPE (
+ IN INT8 *TypeName
+ )
+{
+ UINT32 Index;
+
+ if (TypeName == NULL) {
+ return FALSE;
+ }
+
+ for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {
+ if (strcmp (TypeName, gInternalTypesTable[Index].mTypeName) == 0) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+STATIC
+INT8 *
+TrimHex (
+ IN INT8 *Str,
+ OUT bool *IsHex
+ )
+{
+ *IsHex = FALSE;
+
+ while (*Str && *Str == ' ') {
+ Str++;
+ }
+ while (*Str && *Str == '0') {
+ Str++;
+ }
+ if (*Str && (*Str == 'x' || *Str == 'X')) {
+ Str++;
+ *IsHex = TRUE;
+ }
+
+ return Str;
+}
+
+UINT32
+_STR2U32 (
+ IN INT8 *Str
+ )
+{
+ bool IsHex;
+ UINT32 Value;
+ INT8 c;
+
+ Str = TrimHex (Str, &IsHex);
+ for (Value = 0; (c = *Str) != '\0'; Str++) {
+ //
+ // BUG: does not handle overflow here
+ //
+ (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
+
+ if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
+ Value += (c - 'a' + 10);
+ }
+ if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {
+ Value += (c - 'A' + 10);
+ }
+ if (c >= '0' && c <= '9') {
+ Value += (c - '0');
+ }
+ }
+
+ return Value;
+}
+
+VOID
+CVfrVarDataTypeDB::RegisterNewType (
+ IN SVfrDataType *New
+ )
+{
+ New->mNext = mDataTypeList;
+ mDataTypeList = New;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::ExtractStructTypeName (
+ IN INT8 *&VarStr,
+ OUT INT8 *TName
+ )
+{
+ if (TName == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ while((*VarStr != '\0') && (*VarStr != '.')) {
+ *TName = *VarStr;
+ VarStr++;
+ TName++;
+ }
+ *TName = '\0';
+ if (*VarStr == '.') {
+ VarStr++;
+ }
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
+ IN INT8 *&VarStr,
+ IN INT8 *FName,
+ OUT UINT32 &ArrayIdx
+ )
+{
+ UINT32 Idx;
+ INT8 ArrayStr[MAX_NAME_LEN + 1];
+
+ ArrayIdx = INVALID_ARRAY_INDEX;
+
+ if (FName == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ while((*VarStr != '\0') &&
+ (*VarStr != '.') &&
+ (*VarStr != '[') &&
+ (*VarStr != ']')) {
+ *FName = *VarStr;
+ VarStr++;
+ FName++;
+ }
+ *FName = '\0';
+
+ switch (*VarStr) {
+ case '.' :
+ VarStr++;
+ case '\0':
+ return VFR_RETURN_SUCCESS;
+ case '[' :
+ VarStr++;
+ for (Idx = 0; (Idx < MAX_NAME_LEN) && (*VarStr != '\0') && (*VarStr != ']'); VarStr++, Idx++) {
+ ArrayStr[Idx] = *VarStr;
+ }
+ ArrayStr[Idx] = '\0';
+
+ if ((*VarStr != ']') && (ArrayStr[0] == '\0')) {
+ return VFR_RETURN_DATA_STRING_ERROR;
+ }
+ ArrayIdx = _STR2U32 (ArrayStr);
+ if (*VarStr == ']') {
+ VarStr++;
+ }
+ return VFR_RETURN_SUCCESS;
+ case ']':
+ return VFR_RETURN_DATA_STRING_ERROR;
+ }
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::GetTypeField (
+ IN INT8 *FName,
+ IN SVfrDataType *Type,
+ OUT SVfrDataField *&Field
+ )
+{
+ SVfrDataField *pField = NULL;
+
+ if ((FName == NULL) && (Type == NULL)) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pField = Type->mMembers; pField != NULL; pField = pField->mNext) {
+ if (strcmp (pField->mFieldName, FName) == 0) {
+ Field = pField;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ return VFR_RETURN_UNDEFINED;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::GetFieldOffset (
+ IN SVfrDataField *Field,
+ IN UINT32 ArrayIdx,
+ OUT UINT32 &Offset
+ )
+{
+ if (Field == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ if ((ArrayIdx != INVALID_ARRAY_INDEX) && ((Field->mArrayNum == 0) || (Field->mArrayNum <= ArrayIdx))) {
+ return VFR_RETURN_ERROR_ARRARY_NUM;
+ }
+
+ Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);
+ return VFR_RETURN_SUCCESS;
+}
+
+UINT8
+CVfrVarDataTypeDB::GetFieldWidth (
+ IN SVfrDataField *Field
+ )
+{
+ if (Field == NULL) {
+ return 0;
+ }
+
+ return Field->mFieldType->mType;
+}
+
+UINT32
+CVfrVarDataTypeDB::GetFieldSize (
+ IN SVfrDataField *Field,
+ IN UINT32 ArrayIdx
+ )
+{
+ if (Field == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum != 0)) {
+ return Field->mFieldType->mTotalSize * Field->mArrayNum;
+ } else {
+ return Field->mFieldType->mTotalSize;
+ }
+}
+
+VOID
+CVfrVarDataTypeDB::InternalTypesListInit (
+ VOID
+ )
+{
+ SVfrDataType *New = NULL;
+ UINT32 Index;
+
+ for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {
+ New = new SVfrDataType;
+ if (New != NULL) {
+ strcpy (New->mTypeName, gInternalTypesTable[Index].mTypeName);
+ New->mType = gInternalTypesTable[Index].mType;
+ New->mAlign = gInternalTypesTable[Index].mAlign;
+ New->mTotalSize = gInternalTypesTable[Index].mSize;
+ if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_DATE") == 0) {
+ SVfrDataField *pYearField = new SVfrDataField;
+ SVfrDataField *pMonthField = new SVfrDataField;
+ SVfrDataField *pDayField = new SVfrDataField;
+
+ strcpy (pYearField->mFieldName, "Year");
+ GetDataType ("UINT8", &pYearField->mFieldType);
+ pYearField->mOffset = 0;
+ pYearField->mNext = pMonthField;
+ pYearField->mArrayNum = 0;
+
+ strcpy (pMonthField->mFieldName, "Month");
+ GetDataType ("UINT8", &pMonthField->mFieldType);
+ pMonthField->mOffset = 1;
+ pMonthField->mNext = pDayField;
+ pMonthField->mArrayNum = 0;
+
+ strcpy (pDayField->mFieldName, "Day");
+ GetDataType ("UINT8", &pDayField->mFieldType);
+ pDayField->mOffset = 2;
+ pDayField->mNext = NULL;
+ pDayField->mArrayNum = 0;
+
+ New->mMembers = pYearField;
+ } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TIME") == 0) {
+ SVfrDataField *pHoursField = new SVfrDataField;
+ SVfrDataField *pMinutesField = new SVfrDataField;
+ SVfrDataField *pSecondsField = new SVfrDataField;
+
+ strcpy (pHoursField->mFieldName, "Hours");
+ GetDataType ("UINT8", &pHoursField->mFieldType);
+ pHoursField->mOffset = 0;
+ pHoursField->mNext = pMinutesField;
+ pHoursField->mArrayNum = 0;
+
+ strcpy (pMinutesField->mFieldName, "Minutes");
+ GetDataType ("UINT8", &pMinutesField->mFieldType);
+ pMinutesField->mOffset = 1;
+ pMinutesField->mNext = pSecondsField;
+ pMinutesField->mArrayNum = 0;
+
+ strcpy (pSecondsField->mFieldName, "Seconds");
+ GetDataType ("UINT8", &pSecondsField->mFieldType);
+ pSecondsField->mOffset = 2;
+ pSecondsField->mNext = NULL;
+ pSecondsField->mArrayNum = 0;
+
+ New->mMembers = pHoursField;
+ } else {
+ New->mMembers = NULL;
+ }
+ New->mNext = NULL;
+ RegisterNewType (New);
+ New = NULL;
+ }
+ }
+}
+
+CVfrVarDataTypeDB::CVfrVarDataTypeDB (
+ VOID
+ )
+{
+ mDataTypeList = NULL;
+ mNewDataType = NULL;
+ mCurrDataField = NULL;
+ mPackAlign = DEFAULT_PACK_ALIGN;
+
+ InternalTypesListInit ();
+}
+
+CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
+ VOID
+ )
+{
+ SVfrDataType *pType;
+ SVfrDataField *pField;
+
+ if (mNewDataType != NULL) {
+ delete mNewDataType;
+ }
+
+ while (mDataTypeList != NULL) {
+ pType = mDataTypeList;
+ mDataTypeList = mDataTypeList->mNext;
+ while(pType->mMembers != NULL) {
+ pField = pType->mMembers;
+ pType->mMembers = pType->mMembers->mNext;
+ delete pField;
+ }
+ delete pType;
+ }
+
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::Pack (
+ IN UINT32 Align
+ )
+{
+ if (Align == 0) {
+ return VFR_RETURN_INVALID_PARAMETER;
+ } else if (Align > 1) {
+ mPackAlign = Align + Align % 2;
+ } else {
+ mPackAlign = Align;
+ }
+
+ return VFR_RETURN_SUCCESS;
+}
+
+VOID
+CVfrVarDataTypeDB::UnPack (
+ VOID
+ )
+{
+ mPackAlign = DEFAULT_PACK_ALIGN;
+}
+
+VOID
+CVfrVarDataTypeDB::DeclareDataTypeBegin (
+ VOID
+ )
+{
+ SVfrDataType *pNewType = NULL;
+
+ pNewType = new SVfrDataType;
+ pNewType->mTypeName[0] = '\0';
+ pNewType->mType = EFI_IFR_TYPE_OTHER;
+ pNewType->mAlign = DEFAULT_ALIGN;
+ pNewType->mTotalSize = 0;
+ pNewType->mMembers = NULL;
+ pNewType->mNext = NULL;
+
+ mNewDataType = pNewType;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::SetNewTypeName (
+ IN INT8 *TypeName
+ )
+{
+ SVfrDataType *pType;
+
+ if (mNewDataType == NULL) {
+ return VFR_RETURN_ERROR_SKIPED;
+ }
+ if (TypeName == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+ if (strlen(TypeName) >= MAX_NAME_LEN) {
+ return VFR_RETURN_INVALID_PARAMETER;
+ }
+
+ for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {
+ if (strcmp(pType->mTypeName, TypeName) == 0) {
+ return VFR_RETURN_REDEFINED;
+ }
+ }
+
+ strcpy(mNewDataType->mTypeName, TypeName);
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::DataTypeAddField (
+ IN INT8 *FieldName,
+ IN INT8 *TypeName,
+ IN UINT32 ArrayNum
+ )
+{
+ SVfrDataField *pNewField = NULL;
+ SVfrDataType *pFieldType = NULL;
+ SVfrDataField *pTmp;
+ UINT32 Align;
+
+ CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);
+
+ if (strlen (FieldName) >= MAX_NAME_LEN) {
+ return VFR_RETURN_INVALID_PARAMETER;
+ }
+
+ for (pTmp = mNewDataType->mMembers; pTmp != NULL; pTmp = pTmp->mNext) {
+ if (strcmp (pTmp->mFieldName, FieldName) == 0) {
+ return VFR_RETURN_REDEFINED;
+ }
+ }
+
+ Align = MIN (mPackAlign, pFieldType->mAlign);
+
+ if ((pNewField = new SVfrDataField) == NULL) {
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+ strcpy (pNewField->mFieldName, FieldName);
+ pNewField->mFieldType = pFieldType;
+ pNewField->mArrayNum = ArrayNum;
+ if ((mNewDataType->mTotalSize % Align) == 0) {
+ pNewField->mOffset = mNewDataType->mTotalSize;
+ } else {
+ pNewField->mOffset = mNewDataType->mTotalSize + ALIGN_STUFF(mNewDataType->mTotalSize, Align);
+ }
+ if (mNewDataType->mMembers == NULL) {
+ mNewDataType->mMembers = pNewField;
+ pNewField->mNext = NULL;
+ } else {
+ for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext)
+ ;
+ pTmp->mNext = pNewField;
+ pNewField->mNext = NULL;
+ }
+
+ mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));
+ mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);
+
+ return VFR_RETURN_SUCCESS;
+}
+
+VOID
+CVfrVarDataTypeDB::DeclareDataTypeEnd (
+ VOID
+ )
+{
+ if (mNewDataType->mTypeName[0] == '\0') {
+ return;
+ }
+
+ if ((mNewDataType->mTotalSize % mNewDataType->mAlign) !=0) {
+ mNewDataType->mTotalSize += ALIGN_STUFF (mNewDataType->mTotalSize, mNewDataType->mAlign);
+ }
+
+ RegisterNewType (mNewDataType);
+ mNewDataType = NULL;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::GetDataType (
+ IN INT8 *TypeName,
+ OUT SVfrDataType **DataType
+
+ )
+{
+ SVfrDataType *pDataType = NULL;
+
+ if (TypeName == NULL) {
+ return VFR_RETURN_ERROR_SKIPED;
+ }
+
+ if (DataType == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ *DataType = NULL;
+
+ for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {
+ if (strcmp (TypeName, pDataType->mTypeName) == 0) {
+ *DataType = pDataType;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ return VFR_RETURN_UNDEFINED;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::GetDataTypeSize (
+ IN INT8 *TypeName,
+ OUT UINT32 *Size
+ )
+{
+ SVfrDataType *pDataType = NULL;
+
+ if (Size == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ *Size = 0;
+
+ for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {
+ if (strcmp (TypeName, pDataType->mTypeName) == 0) {
+ *Size = pDataType->mTotalSize;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ return VFR_RETURN_UNDEFINED;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::GetDataFieldInfo (
+ IN INT8 *VarStr,
+ OUT UINT16 &Offset,
+ OUT UINT8 &Type,
+ OUT UINT32 &Size
+ )
+{
+ INT8 TName[MAX_NAME_LEN], FName[MAX_NAME_LEN];
+ UINT32 ArrayIdx, Tmp;
+ SVfrDataType *pType = NULL;
+ SVfrDataField *pField = NULL;
+
+ Offset = 0;
+ Type = EFI_IFR_TYPE_OTHER;
+ Size = 0;
+
+ CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);
+ CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);
+
+ //
+ // if it is not struct data type
+ //
+ Type = pType->mType;
+ Size = pType->mTotalSize;
+
+ while (*VarStr != '\0') {
+ CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);
+ CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);
+ pType = pField->mFieldType;
+ CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp), VFR_RETURN_SUCCESS);
+ Offset += Tmp;
+ Type = GetFieldWidth (pField);
+ Size = GetFieldSize (pField, ArrayIdx);
+ }
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrVarDataTypeDB::GetUserDefinedTypeNameList (
+ OUT INT8 ***NameList,
+ OUT UINT32 *ListSize
+ )
+{
+ UINT32 Index;
+ SVfrDataType *pType;
+
+ if ((NameList == NULL) || (ListSize == NULL)) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ *NameList = NULL;
+ *ListSize = 0;
+
+ for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {
+ if (_IS_INTERNAL_TYPE(pType->mTypeName) == FALSE) {
+ (*ListSize)++;
+ }
+ }
+
+ if (*ListSize == 0) {
+ return VFR_RETURN_SUCCESS;
+ }
+
+ if ((*NameList = new INT8*[*ListSize]) == NULL) {
+ *ListSize = 0;
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+
+ for (Index = 0, pType = mDataTypeList; pType != NULL; pType = pType->mNext, Index++) {
+ if (_IS_INTERNAL_TYPE(pType->mTypeName) == FALSE) {
+ (*NameList)[Index] = pType->mTypeName;
+ }
+ }
+ return VFR_RETURN_SUCCESS;
+}
+
+BOOLEAN
+CVfrVarDataTypeDB::IsTypeNameDefined (
+ IN INT8 *TypeName
+ )
+{
+ SVfrDataType *pType;
+
+ if (TypeName == NULL) {
+ return FALSE;
+ }
+
+ for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {
+ if (strcmp (pType->mTypeName, TypeName) == 0) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+#ifdef CVFR_VARDATATYPEDB_DEBUG
+VOID
+CVfrVarDataTypeDB::ParserDB (
+ VOID
+ )
+{
+ SVfrDataType *pTNode;
+ SVfrDataField *pFNode;
+
+ printf ("***************************************************************\n");
+ printf ("\t\tmPackAlign = %x\n", mPackAlign);
+ for (pTNode = mDataTypeList; pTNode != NULL; pTNode = pTNode->mNext) {
+ printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode->mTypeName, pTNode->mAlign, pTNode->mTotalSize);
+ printf ("\t\tstruct %s {\n", pTNode->mTypeName);
+ for (pFNode = pTNode->mMembers; pFNode != NULL; pFNode = pFNode->mNext) {
+ printf ("\t\t\t%s\t%s\n", pFNode->mFieldType->mTypeName, pFNode->mFieldName);
+ }
+ printf ("\t\t};\n");
+ printf ("---------------------------------------------------------------\n");
+ }
+ printf ("***************************************************************\n");
+}
+#endif
+
+SVfrVarStorageNode::SVfrVarStorageNode (
+ IN EFI_GUID *Guid,
+ IN INT8 *StoreName,
+ IN EFI_VARSTORE_ID VarStoreId,
+ IN EFI_STRING_ID VarName,
+ IN UINT32 VarSize
+ )
+{
+ if (Guid != NULL) {
+ mGuid = *Guid;
+ } else {
+ memset (&Guid, 0, sizeof (EFI_GUID));
+ }
+ if (StoreName != NULL) {
+ mVarStoreName = new INT8[strlen(StoreName) + 1];
+ strcpy (mVarStoreName, StoreName);
+ } else {
+ mVarStoreName = NULL;
+ }
+ mNext = NULL;
+ mVarStoreId = VarStoreId;
+ mVarStoreType = EFI_VFR_VARSTORE_EFI;
+ mStorageInfo.mEfiVar.mEfiVarName = VarName;
+ mStorageInfo.mEfiVar.mEfiVarSize = VarSize;
+}
+
+SVfrVarStorageNode::SVfrVarStorageNode (
+ IN EFI_GUID *Guid,
+ IN INT8 *StoreName,
+ IN EFI_VARSTORE_ID VarStoreId,
+ IN SVfrDataType *DataType
+ )
+{
+ if (Guid != NULL) {
+ mGuid = *Guid;
+ } else {
+ memset (&Guid, 0, sizeof (EFI_GUID));
+ }
+ if (StoreName != NULL) {
+ mVarStoreName = new INT8[strlen(StoreName) + 1];
+ strcpy (mVarStoreName, StoreName);
+ } else {
+ mVarStoreName = NULL;
+ }
+ mNext = NULL;
+ mVarStoreId = VarStoreId;
+ mVarStoreType = EFI_VFR_VARSTORE_BUFFER;
+ mStorageInfo.mDataType = DataType;
+}
+
+SVfrVarStorageNode::SVfrVarStorageNode (
+ IN INT8 *StoreName,
+ IN EFI_VARSTORE_ID VarStoreId
+ )
+{
+ if (StoreName != NULL) {
+ mVarStoreName = new INT8[strlen(StoreName) + 1];
+ strcpy (mVarStoreName, StoreName);
+ } else {
+ mVarStoreName = NULL;
+ }
+ mNext = NULL;
+ mVarStoreId = VarStoreId;
+ mVarStoreType = EFI_VFR_VARSTORE_NAME;
+ mStorageInfo.mNameSpace.mNameTable = new EFI_VARSTORE_ID[DEFAULT_NAME_TABLE_ITEMS];
+ mStorageInfo.mNameSpace.mTableSize = 0;
+}
+
+SVfrVarStorageNode::~SVfrVarStorageNode (
+ VOID
+ )
+{
+ if (mVarStoreName != NULL) {
+ delete mVarStoreName;
+ }
+
+ if (mVarStoreType == EFI_VFR_VARSTORE_NAME) {
+ delete mStorageInfo.mNameSpace.mNameTable;
+ }
+}
+
+CVfrDataStorage::CVfrDataStorage (
+ VOID
+ )
+{
+ UINT32 Index;
+
+ for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {
+ mFreeVarStoreIdBitMap[Index] = 0;
+ }
+
+ // Question ID 0 is reserved.
+ mFreeVarStoreIdBitMap[0] = 0x80000000;
+
+ mBufferVarStoreList = NULL;
+ mEfiVarStoreList = NULL;
+ mNameVarStoreList = NULL;
+ mCurrVarStorageNode = NULL;
+ mNewVarStorageNode = NULL;
+}
+
+CVfrDataStorage::~CVfrDataStorage (
+ VOID
+ )
+{
+ SVfrVarStorageNode *pNode;
+
+ while (mBufferVarStoreList != NULL) {
+ pNode = mBufferVarStoreList;
+ mBufferVarStoreList = mBufferVarStoreList->mNext;
+ delete pNode;
+ }
+ while (mEfiVarStoreList != NULL) {
+ pNode = mEfiVarStoreList;
+ mEfiVarStoreList = mEfiVarStoreList->mNext;
+ delete pNode;
+ }
+ while (mNameVarStoreList != NULL) {
+ pNode = mNameVarStoreList;
+ mNameVarStoreList = mNameVarStoreList->mNext;
+ delete pNode;
+ }
+ if (mNewVarStorageNode != NULL) {
+ delete mNewVarStorageNode;
+ }
+}
+
+EFI_VARSTORE_ID
+CVfrDataStorage::GetFreeVarStoreId (
+ VOID
+ )
+{
+ UINT32 Index, Mask, Offset;
+
+ for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {
+ if (mFreeVarStoreIdBitMap[Index] != 0xFFFFFFFF) {
+ break;
+ }
+ }
+
+ for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {
+ if ((mFreeVarStoreIdBitMap[Index] & Mask) == 0) {
+ mFreeVarStoreIdBitMap[Index] |= Mask;
+ return (EFI_VARSTORE_ID)((Index << EFI_BITS_SHIFT_PER_UINT32) + Offset);
+ }
+ }
+
+ return EFI_VARSTORE_ID_INVALID;
+}
+
+BOOLEAN
+CVfrDataStorage::ChekVarStoreIdFree (
+ IN EFI_VARSTORE_ID VarStoreId
+ )
+{
+ UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);
+ UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);
+
+ return (mFreeVarStoreIdBitMap[Index] & (0x80000000 >> Offset)) == 0;
+}
+
+VOID
+CVfrDataStorage::MarkVarStoreIdUsed (
+ IN EFI_VARSTORE_ID VarStoreId
+ )
+{
+ UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);
+ UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);
+
+ mFreeVarStoreIdBitMap[Index] |= (0x80000000 >> Offset);
+}
+
+VOID
+CVfrDataStorage::MarkVarStoreIdUnused (
+ IN EFI_VARSTORE_ID VarStoreId
+ )
+{
+ UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);
+ UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);
+
+ mFreeVarStoreIdBitMap[Index] &= ~(0x80000000 >> Offset);
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::DeclareNameVarStoreBegin (
+ IN INT8 *StoreName
+ )
+{
+ SVfrVarStorageNode *pNode = NULL;
+ EFI_VARSTORE_ID VarStoreId;
+
+ if (StoreName == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {
+ return VFR_RETURN_REDEFINED;
+ }
+ }
+
+ VarStoreId = GetFreeVarStoreId ();
+ if ((pNode = new SVfrVarStorageNode (StoreName, VarStoreId)) == NULL) {
+ return VFR_RETURN_UNDEFINED;
+ }
+
+ mNewVarStorageNode = pNode;
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::NameTableAddItem (
+ IN EFI_STRING_ID Item
+ )
+{
+ EFI_VARSTORE_ID *NewTable, *OldTable;
+ UINT32 TableSize;
+
+ OldTable = mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable;
+ TableSize = mNewVarStorageNode->mStorageInfo.mNameSpace.mTableSize;
+
+ if ((TableSize != 0) && ((TableSize % DEFAULT_NAME_TABLE_ITEMS) == 0)) {
+ if ((NewTable = new EFI_VARSTORE_ID[TableSize + DEFAULT_NAME_TABLE_ITEMS]) == NULL) {
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+ memcpy (NewTable, OldTable, TableSize);
+ mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable = NewTable;
+ }
+
+ mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable[TableSize++] = Item;
+ mNewVarStorageNode->mStorageInfo.mNameSpace.mTableSize = TableSize;
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::DeclareNameVarStoreEnd (
+ IN EFI_GUID *Guid
+ )
+{
+ mNewVarStorageNode->mGuid = *Guid;
+ mNewVarStorageNode->mNext = mNameVarStoreList;
+ mNameVarStoreList = mNewVarStorageNode;
+
+ mNewVarStorageNode = NULL;
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::DeclareEfiVarStore (
+ IN INT8 *StoreName,
+ IN EFI_GUID *Guid,
+ IN EFI_STRING_ID NameStrId,
+ IN UINT32 VarSize
+ )
+{
+ SVfrVarStorageNode *pNode;
+ EFI_VARSTORE_ID VarStoreId;
+
+ if ((StoreName == NULL) || (Guid == NULL)) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ if (VarSize > sizeof (UINT64)) {
+ return VFR_RETURN_EFIVARSTORE_SIZE_ERROR;
+ }
+
+ for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {
+ return VFR_RETURN_REDEFINED;
+ }
+ }
+
+ VarStoreId = GetFreeVarStoreId ();
+ if ((pNode = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, NameStrId, VarSize)) == NULL) {
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+
+ pNode->mNext = mNameVarStoreList;
+ mNameVarStoreList = pNode;
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::DeclareBufferVarStore (
+ IN INT8 *StoreName,
+ IN EFI_GUID *Guid,
+ IN CVfrVarDataTypeDB *DataTypeDB,
+ IN INT8 *TypeName,
+ IN EFI_VARSTORE_ID VarStoreId
+ )
+{
+ SVfrVarStorageNode *pNew = NULL;
+ SVfrDataType *pDataType = NULL;
+
+ if ((StoreName == NULL) || (Guid == NULL) || (DataTypeDB == NULL)) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ CHECK_ERROR_RETURN(DataTypeDB->GetDataType (TypeName, &pDataType), VFR_RETURN_SUCCESS);
+
+ if (VarStoreId == EFI_VARSTORE_ID_INVALID) {
+ VarStoreId = GetFreeVarStoreId ();
+ } else {
+ if (ChekVarStoreIdFree (VarStoreId) == FALSE) {
+ return VFR_RETURN_VARSTOREID_REDEFINED;
+ }
+ MarkVarStoreIdUsed (VarStoreId);
+ }
+
+ if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType)) == NULL) {
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+
+ pNew->mNext = mBufferVarStoreList;
+ mBufferVarStoreList = pNew;
+
+ if (gCVfrBufferConfig.Register(StoreName) != 0) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::GetVarStoreId (
+ IN INT8 *StoreName,
+ OUT EFI_VARSTORE_ID *VarStoreId
+ )
+{
+ SVfrVarStorageNode *pNode;
+
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {
+ mCurrVarStorageNode = pNode;
+ *VarStoreId = pNode->mVarStoreId;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {
+ mCurrVarStorageNode = pNode;
+ *VarStoreId = pNode->mVarStoreId;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {
+ mCurrVarStorageNode = pNode;
+ *VarStoreId = pNode->mVarStoreId;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ mCurrVarStorageNode = NULL;
+ *VarStoreId = EFI_VARSTORE_ID_INVALID;
+ return VFR_RETURN_UNDEFINED;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::GetBufferVarStoreDataTypeName (
+ IN INT8 *StoreName,
+ OUT INT8 **DataTypeName
+ )
+{
+ SVfrVarStorageNode *pNode;
+
+ if ((StoreName == NULL) || (DataTypeName == NULL)) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {
+ break;
+ }
+ }
+
+ if (pNode == NULL) {
+ return VFR_RETURN_UNDEFINED;
+ }
+
+ if (pNode->mStorageInfo.mDataType == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ *DataTypeName = pNode->mStorageInfo.mDataType->mTypeName;
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::GetVarStoreType (
+ IN INT8 *StoreName,
+ OUT EFI_VFR_VARSTORE_TYPE &VarStoreType
+ )
+{
+ SVfrVarStorageNode *pNode;
+
+ if (StoreName == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {
+ VarStoreType = pNode->mVarStoreType;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {
+ VarStoreType = pNode->mVarStoreType;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {
+ VarStoreType = pNode->mVarStoreType;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ VarStoreType = EFI_VFR_VARSTORE_INVALID;
+ return VFR_RETURN_UNDEFINED;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::GetVarStoreName (
+ IN EFI_VARSTORE_ID VarStoreId,
+ OUT INT8 **VarStoreName
+ )
+{
+ SVfrVarStorageNode *pNode;
+
+ if (VarStoreName == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mVarStoreId == VarStoreId) {
+ *VarStoreName = pNode->mVarStoreName;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mVarStoreId == VarStoreId) {
+ *VarStoreName = pNode->mVarStoreName;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mVarStoreId == VarStoreId) {
+ *VarStoreName = pNode->mVarStoreName;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ *VarStoreName = NULL;
+ return VFR_RETURN_UNDEFINED;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::GetEfiVarStoreInfo (
+ IN OUT EFI_VARSTORE_INFO *Info
+ )
+{
+ if (Info == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ if (mCurrVarStorageNode == NULL) {
+ return VFR_RETURN_GET_EFIVARSTORE_ERROR;
+ }
+
+ Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mEfiVar.mEfiVarName;
+ Info->mVarTotalSize = mCurrVarStorageNode->mStorageInfo.mEfiVar.mEfiVarSize;
+ switch (Info->mVarTotalSize) {
+ case 1:
+ Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_8;
+ break;
+ case 2:
+ Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_16;
+ break;
+ case 4:
+ Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_32;
+ break;
+ case 8:
+ Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_64;
+ break;
+ default :
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::GetNameVarStoreInfo (
+ OUT EFI_VARSTORE_INFO *Info,
+ IN UINT32 Index
+ )
+{
+ if (Info == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ if (mCurrVarStorageNode == NULL) {
+ return VFR_RETURN_GET_NVVARSTORE_ERROR;
+ }
+
+ Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mNameSpace.mNameTable[Index];
+
+ return VFR_RETURN_SUCCESS;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDataStorage::BufferVarStoreRequestElementAdd (
+ IN INT8 *StoreName,
+ IN EFI_VARSTORE_INFO &Info
+ )
+{
+ INT8 NewReqElt[128] = {'\0',};
+ INT8 *OldReqElt = NULL;
+ SVfrVarStorageNode *pNode = NULL;
+ EFI_IFR_TYPE_VALUE Value;
+
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {
+ break;
+ }
+ }
+
+ if (pNode == NULL) {
+ return VFR_RETURN_UNDEFINED;
+ }
+
+ gCVfrBufferConfig.Open ();
+ Value.u8 = 0;
+ if (gCVfrBufferConfig.Write ('a', StoreName, NULL, EFI_IFR_TYPE_NUM_SIZE_8, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+ gCVfrBufferConfig.Close ();
+
+ return VFR_RETURN_SUCCESS;
+}
+
+SVfrDefaultStoreNode::SVfrDefaultStoreNode (
+ IN EFI_IFR_DEFAULTSTORE *ObjBinAddr,
+ IN INT8 *RefName,
+ IN EFI_STRING_ID DefaultStoreNameId,
+ IN UINT16 DefaultId
+ )
+{
+ mObjBinAddr = ObjBinAddr;
+
+ if (RefName != NULL) {
+ mRefName = new INT8[strlen (RefName) + 1];
+ strcpy (mRefName, RefName);
+ } else {
+ mRefName = NULL;
+ }
+
+ mNext = NULL;
+ mDefaultId = DefaultId;
+ mDefaultStoreNameId = DefaultStoreNameId;
+}
+
+SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
+ VOID
+ )
+{
+ if (mRefName != NULL) {
+ delete mRefName;
+ }
+}
+
+CVfrDefaultStore::CVfrDefaultStore (
+ VOID
+ )
+{
+ mDefaultStoreList = NULL;
+}
+
+CVfrDefaultStore::~CVfrDefaultStore (
+ VOID
+ )
+{
+ SVfrDefaultStoreNode *pTmp = NULL;
+
+ while (mDefaultStoreList != NULL) {
+ pTmp = mDefaultStoreList;
+ mDefaultStoreList = mDefaultStoreList->mNext;
+ delete pTmp;
+ }
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDefaultStore::RegisterDefaultStore (
+ IN CHAR8 *ObjBinAddr,
+ IN INT8 *RefName,
+ IN EFI_STRING_ID DefaultStoreNameId,
+ IN UINT16 DefaultId
+ )
+{
+ SVfrDefaultStoreNode *pNode = NULL;
+
+ if (RefName == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mRefName, RefName) == 0) {
+ return VFR_RETURN_REDEFINED;
+ }
+ }
+
+ if ((pNode = new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE *)ObjBinAddr, RefName, DefaultStoreNameId, DefaultId)) == NULL) {
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+
+ pNode->mNext = mDefaultStoreList;
+ mDefaultStoreList = pNode;
+
+ return VFR_RETURN_SUCCESS;
+}
+
+/*
+ * assign new reference name or new default store name id only if
+ * the original is invalid
+ */
+EFI_VFR_RETURN_CODE
+CVfrDefaultStore::ReRegisterDefaultStoreById (
+ IN UINT16 DefaultId,
+ IN INT8 *RefName,
+ IN EFI_STRING_ID DefaultStoreNameId
+ )
+{
+ SVfrDefaultStoreNode *pNode = NULL;
+
+ for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mDefaultId == DefaultId) {
+ break;
+ }
+ }
+
+ if (pNode == NULL) {
+ return VFR_RETURN_UNDEFINED;
+ } else {
+ if (pNode->mDefaultStoreNameId == EFI_STRING_ID_INVALID) {
+ pNode->mDefaultStoreNameId = DefaultStoreNameId;
+ if (pNode->mObjBinAddr != NULL) {
+ pNode->mObjBinAddr->DefaultName = DefaultStoreNameId;
+ }
+ } else {
+ return VFR_RETURN_REDEFINED;
+ }
+
+ if (RefName != NULL) {
+ delete pNode->mRefName;
+ pNode->mRefName = new INT8[strlen (RefName) + 1];
+ if (pNode->mRefName != NULL) {
+ strcpy (pNode->mRefName, RefName);
+ }
+ }
+ }
+
+ return VFR_RETURN_SUCCESS;
+}
+
+BOOLEAN
+CVfrDefaultStore::DefaultIdRegistered (
+ IN UINT16 DefaultId
+ )
+{
+ SVfrDefaultStoreNode *pNode = NULL;
+
+ for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mDefaultId == DefaultId) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDefaultStore::GetDefaultId (
+ IN INT8 *RefName,
+ OUT UINT16 *DefaultId
+ )
+{
+ SVfrDefaultStoreNode *pTmp = NULL;
+
+ if (DefaultId == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pTmp = mDefaultStoreList; pTmp != NULL; pTmp = pTmp->mNext) {
+ if (strcmp (pTmp->mRefName, RefName) == 0) {
+ *DefaultId = pTmp->mDefaultId;
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ return VFR_RETURN_UNDEFINED;
+}
+
+STATIC
+EFI_VFR_RETURN_CODE
+AltCfgItemPrintToBuffer (
+ IN INT8 *NewAltCfg,
+ IN EFI_VARSTORE_INFO Info,
+ IN UINT8 Type,
+ IN EFI_IFR_TYPE_VALUE Value
+ )
+{
+ UINT32 Index;
+ UINT8 *BufChar = NULL;
+ UINT32 Count = 0;
+
+ if (NewAltCfg != NULL) {
+ Count = sprintf (
+ NewAltCfg,
+ "&OFFSET=%x&WIDTH=%x&VALUE=",
+ Info.mInfo.mVarOffset,
+ Info.mVarTotalSize
+ );
+ NewAltCfg += Count;
+
+ switch (Type) {
+ case EFI_IFR_TYPE_NUM_SIZE_8 :
+ Count = sprintf (NewAltCfg, "%x", Value.u8);
+ NewAltCfg += Count;
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_16 :
+ Count = sprintf (NewAltCfg, "%x", Value.u16);
+ NewAltCfg += Count;
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_32 :
+ Count = sprintf (NewAltCfg, "%x", Value.u32);
+ NewAltCfg += Count;
+ break;
+ case EFI_IFR_TYPE_NUM_SIZE_64 :
+ Count = sprintf (NewAltCfg, "%x", Value.u64);
+ NewAltCfg += Count;
+ break;
+ case EFI_IFR_TYPE_BOOLEAN :
+ Count = sprintf (NewAltCfg, "%x", Value.b);
+ NewAltCfg += Count;
+ break;
+ case EFI_IFR_TYPE_TIME :
+#if 1
+ Count = sprintf (NewAltCfg, "%x", *((UINT32 *)(&Value.time)));
+ NewAltCfg += Count;
+#else
+ BufChar = (UINT8 *)&Value.time;
+ for (Index = 0; Index < sizeof(EFI_HII_TIME); Index++) {
+ Count = sprintf (NewAltCfg, "%02x", (UINT8)BufChar[Index]);
+ NewAltCfg += Count;
+ }
+#endif
+ break;
+ case EFI_IFR_TYPE_DATE :
+#if 1
+ Count = sprintf (NewAltCfg, "%x", *((UINT32 *)(&Value.date)));
+ NewAltCfg += Count;
+#else
+ BufChar = (UINT8 *)&Value.date;
+ for (Index = 0; Index < sizeof(EFI_HII_DATE); Index++) {
+ Count = sprintf (NewAltCfg, "%02x", (UINT8)BufChar[Index]);
+ NewAltCfg += Count;
+ }
+#endif
+ break;
+ case EFI_IFR_TYPE_STRING :
+ Count = sprintf (NewAltCfg, "%x", Value.string);
+ NewAltCfg += Count;
+ break;
+ case EFI_IFR_TYPE_OTHER :
+ return VFR_RETURN_UNSUPPORTED;
+ }
+ }
+
+ return VFR_RETURN_FATAL_ERROR;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrDefaultStore::BufferVarStoreAltConfigAdd (
+ IN EFI_VARSTORE_ID DefaultId,
+ IN EFI_VARSTORE_INFO &Info,
+ IN INT8 *VarStoreName,
+ IN UINT8 Type,
+ IN EFI_IFR_TYPE_VALUE Value
+ )
+{
+ SVfrDefaultStoreNode *pNode = NULL;
+ INT8 NewAltCfg[2 * 2 * sizeof (UINT16) + 1] = {0,};
+
+ if (VarStoreName == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mDefaultId == DefaultId) {
+ break;
+ }
+ }
+
+ if (pNode == NULL) {
+ return VFR_RETURN_UNDEFINED;
+ }
+
+ gCVfrBufferConfig.Open ();
+
+ sprintf (NewAltCfg, "%04x", pNode->mDefaultId);
+ if ((gCVfrBufferConfig.Select(VarStoreName) == 0) &&
+ (gCVfrBufferConfig.Select(VarStoreName, NewAltCfg) != 0)) {
+ if (gCVfrBufferConfig.Write ('i', VarStoreName, NewAltCfg, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {
+ goto WriteError;
+ }
+ }
+
+ if (gCVfrBufferConfig.Write ('a', VarStoreName, NULL, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {
+ goto WriteError;
+ }
+
+ gCVfrBufferConfig.Close ();
+
+ return VFR_RETURN_SUCCESS;
+
+WriteError:
+ gCVfrBufferConfig.Close ();
+ return VFR_RETURN_FATAL_ERROR;
+}
+
+SVfrRuleNode::SVfrRuleNode (
+ IN INT8 *RuleName,
+ IN UINT8 RuleId
+ )
+{
+ if (RuleName != NULL) {
+ mRuleName = new INT8[strlen (RuleName) + 1];
+ strcpy (mRuleName, RuleName);
+ } else {
+ mRuleName = NULL;
+ }
+
+ mNext = NULL;
+ mRuleId = RuleId;
+}
+
+SVfrRuleNode::~SVfrRuleNode (
+ VOID
+ )
+{
+ if (mRuleName != NULL) {
+ delete mRuleName;
+ }
+}
+
+CVfrRulesDB::CVfrRulesDB ()
+{
+ mRuleList = NULL;
+ mFreeRuleId = EFI_VARSTORE_ID_START;
+}
+
+CVfrRulesDB::~CVfrRulesDB ()
+{
+ SVfrRuleNode *pNode;
+
+ while(mRuleList != NULL) {
+ pNode = mRuleList;
+ mRuleList = mRuleList->mNext;
+ delete pNode;
+ }
+}
+
+VOID
+CVfrRulesDB::RegisterRule (
+ IN INT8 *RuleName
+ )
+{
+ SVfrRuleNode *pNew;
+
+ if (RuleName == NULL) {
+ return ;
+ }
+
+ if ((pNew = new SVfrRuleNode (RuleName, mFreeRuleId)) == NULL) {
+ return ;
+ }
+
+ mFreeRuleId++;
+
+ pNew->mNext = mRuleList;
+ mRuleList = pNew;
+}
+
+UINT8
+CVfrRulesDB::GetRuleId (
+ IN INT8 *RuleName
+ )
+{
+ SVfrRuleNode *pNode;
+
+ if (RuleName == NULL) {
+ return EFI_RULE_ID_INVALID;
+ }
+
+ for (pNode = mRuleList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mRuleName, RuleName) == 0) {
+ return pNode->mRuleId;
+ }
+ }
+
+ return EFI_RULE_ID_INVALID;
+}
+
+CVfrRulesDB gCVfrRulesDB;
+
+EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
+ VOID
+ )
+{
+ mVarStoreId = EFI_VARSTORE_ID_INVALID;
+ mInfo.mVarName = EFI_STRING_ID_INVALID;
+ mInfo.mVarOffset = EFI_VAROFFSET_INVALID;
+ mVarType = EFI_IFR_TYPE_OTHER;
+ mVarTotalSize = 0;
+}
+
+EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
+ IN EFI_VARSTORE_INFO &Info
+ )
+{
+ mVarStoreId = Info.mVarStoreId;
+ mInfo.mVarName = Info.mInfo.mVarName;
+ mInfo.mVarOffset = Info.mInfo.mVarOffset;
+ mVarType = Info.mVarType;
+ mVarTotalSize = Info.mVarTotalSize;
+}
+
+BOOLEAN
+EFI_VARSTORE_INFO::operator == (
+ IN EFI_VARSTORE_INFO *Info
+ )
+{
+ if ((mVarStoreId == Info->mVarStoreId) &&
+ (mInfo.mVarName == Info->mInfo.mVarName) &&
+ (mInfo.mVarOffset == Info->mInfo.mVarOffset) &&
+ (mVarType == Info->mVarType) &&
+ (mVarTotalSize == Info->mVarTotalSize)) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo;
+
+EFI_QUESTION_ID
+CVfrQuestionDB::GetFreeQuestionId (
+ VOID
+ )
+{
+ UINT32 Index, Mask, Offset;
+
+ for (Index = 0; Index < EFI_FREE_QUESTION_ID_BITMAP_SIZE; Index++) {
+ if (mFreeQIdBitMap[Index] != 0xFFFFFFFF) {
+ break;
+ }
+ }
+
+ for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {
+ if ((mFreeQIdBitMap[Index] & Mask) == 0) {
+ mFreeQIdBitMap[Index] |= Mask;
+ return (EFI_QUESTION_ID)((Index << EFI_BITS_SHIFT_PER_UINT32) + Offset);
+ }
+ }
+
+ return EFI_QUESTION_ID_INVALID;
+}
+
+BOOLEAN
+CVfrQuestionDB::ChekQuestionIdFree (
+ IN EFI_QUESTION_ID QId
+ )
+{
+ UINT32 Index = (QId / EFI_BITS_PER_UINT32);
+ UINT32 Offset = (QId % EFI_BITS_PER_UINT32);
+
+ return (mFreeQIdBitMap[Index] & (0x80000000 >> Offset)) == 0;
+}
+
+VOID
+CVfrQuestionDB::MarkQuestionIdUsed (
+ IN EFI_QUESTION_ID QId
+ )
+{
+ UINT32 Index = (QId / EFI_BITS_PER_UINT32);
+ UINT32 Offset = (QId % EFI_BITS_PER_UINT32);
+
+ mFreeQIdBitMap[Index] |= (0x80000000 >> Offset);
+}
+
+VOID
+CVfrQuestionDB::MarkQuestionIdUnused (
+ IN EFI_QUESTION_ID QId
+ )
+{
+ UINT32 Index = (QId / EFI_BITS_PER_UINT32);
+ UINT32 Offset = (QId % EFI_BITS_PER_UINT32);
+
+ mFreeQIdBitMap[Index] &= ~(0x80000000 >> Offset);
+}
+
+SVfrQuestionNode::SVfrQuestionNode (
+ IN INT8 *Name,
+ IN INT8 *VarIdStr,
+ IN UINT32 BitMask
+ )
+{
+ mName = NULL;
+ mVarIdStr = NULL;
+ mQuestionId = EFI_QUESTION_ID_INVALID;
+ mBitMask = BitMask;
+ mNext = NULL;
+
+ if (Name == NULL) {
+ mName = new INT8[strlen ("$DEFAULT") + 1];
+ strcpy (mName, "$DEFAULT");
+ } else {
+ mName = new INT8[strlen (Name) + 1];
+ strcpy (mName, Name);
+ }
+
+ if (VarIdStr != NULL) {
+ mVarIdStr = new INT8[strlen (VarIdStr) + 1];
+ strcpy (mVarIdStr, VarIdStr);
+ } else {
+ mVarIdStr = new INT8[strlen ("$") + 1];
+ strcpy (mVarIdStr, "$");
+ }
+}
+
+SVfrQuestionNode::~SVfrQuestionNode (
+ VOID
+ )
+{
+ if (mName != NULL) {
+ delete mName;
+ }
+
+ if (mVarIdStr != NULL) {
+ delete mVarIdStr;
+ }
+}
+
+CVfrQuestionDB::CVfrQuestionDB ()
+{
+ UINT32 Index;
+
+ for (Index = 0; Index < EFI_FREE_QUESTION_ID_BITMAP_SIZE; Index++) {
+ mFreeQIdBitMap[Index] = 0;
+ }
+
+ // Question ID 0 is reserved.
+ mFreeQIdBitMap[0] = 0x80000000;
+ mQuestionList = NULL;
+}
+
+CVfrQuestionDB::~CVfrQuestionDB ()
+{
+ SVfrQuestionNode *pNode;
+
+ while (mQuestionList != NULL) {
+ pNode = mQuestionList;
+ mQuestionList = mQuestionList->mNext;
+ delete pNode;
+ }
+}
+
+EFI_VFR_RETURN_CODE
+CVfrQuestionDB::RegisterQuestion (
+ IN INT8 *Name,
+ IN INT8 *VarIdStr,
+ IN OUT EFI_QUESTION_ID &QuestionId
+ )
+{
+ SVfrQuestionNode *pNode = NULL;
+
+ if ((Name != NULL) && (FindQuestion(Name) == VFR_RETURN_SUCCESS)) {
+ return VFR_RETURN_REDEFINED;
+ }
+
+ if ((pNode = new SVfrQuestionNode (Name, VarIdStr)) == NULL) {
+ return VFR_RETURN_OUT_FOR_RESOURCES;
+ }
+
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {
+ QuestionId = GetFreeQuestionId ();
+ } else {
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {
+ delete pNode;
+ return VFR_RETURN_QUESTIONID_REDEFINED;
+ }
+ MarkQuestionIdUsed (QuestionId);
+ }
+ pNode->mQuestionId = QuestionId;
+
+ pNode->mNext = mQuestionList;
+ mQuestionList = pNode;
+
+ gCFormPkg.DoPendingAssign (VarIdStr, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+
+ return VFR_RETURN_SUCCESS;
+}
+
+VOID
+CVfrQuestionDB::RegisterOldDateQuestion (
+ IN INT8 *YearVarId,
+ IN INT8 *MonthVarId,
+ IN INT8 *DayVarId,
+ IN OUT EFI_QUESTION_ID &QuestionId
+ )
+{
+ SVfrQuestionNode *pNode[3] = {NULL, };
+ UINT32 Index;
+
+ if ((YearVarId == NULL) || (MonthVarId == NULL) || (DayVarId == NULL)) {
+ return;
+ }
+
+ if ((pNode[0] = new SVfrQuestionNode (NULL, YearVarId, DATE_YEAR_BITMASK)) == NULL) {
+ goto Err;
+ }
+ if ((pNode[1] = new SVfrQuestionNode (NULL, MonthVarId, DATE_MONTH_BITMASK)) == NULL) {
+ goto Err;
+ }
+ if ((pNode[2] = new SVfrQuestionNode (NULL, DayVarId, DATE_DAY_BITMASK)) == NULL) {
+ goto Err;
+ }
+
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {
+ QuestionId = GetFreeQuestionId ();
+ } else {
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {
+ goto Err;
+ }
+ MarkQuestionIdUsed (QuestionId);
+ }
+
+ pNode[0]->mQuestionId = QuestionId;
+ pNode[1]->mQuestionId = QuestionId;
+ pNode[2]->mQuestionId = QuestionId;
+ pNode[0]->mNext = pNode[1];
+ pNode[1]->mNext = pNode[2];
+ pNode[2]->mNext = mQuestionList;
+ mQuestionList = pNode[0];
+
+ gCFormPkg.DoPendingAssign (YearVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+ gCFormPkg.DoPendingAssign (MonthVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+ gCFormPkg.DoPendingAssign (DayVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+
+ return;
+
+Err:
+ for (Index = 0; Index < 3; Index++) {
+ if (pNode[Index] != NULL) {
+ delete pNode[Index];
+ }
+ }
+ QuestionId = EFI_QUESTION_ID_INVALID;
+}
+
+VOID
+CVfrQuestionDB::RegisterNewDateQuestion (
+ IN INT8 *Name,
+ IN INT8 *BaseVarId,
+ IN OUT EFI_QUESTION_ID &QuestionId
+ )
+{
+ SVfrQuestionNode *pNode[3] = {NULL, };
+ UINT32 Len;
+ INT8 *VarIdStr[3] = {NULL, };
+ INT8 Index;
+
+ if (BaseVarId == NULL) {
+ return;
+ }
+
+ Len = strlen (BaseVarId);
+
+ VarIdStr[0] = new INT8[Len + strlen (".Year") + 1];
+ if (VarIdStr[0] != NULL) {
+ strcpy (VarIdStr[0], BaseVarId);
+ strcat (VarIdStr[0], ".Year");
+ }
+ VarIdStr[1] = new INT8[Len + strlen (".Month") + 1];
+ if (VarIdStr[1] != NULL) {
+ strcpy (VarIdStr[1], BaseVarId);
+ strcat (VarIdStr[1], ".Month");
+ }
+ VarIdStr[2] = new INT8[Len + strlen (".Day") + 1];
+ if (VarIdStr[2] != NULL) {
+ strcpy (VarIdStr[2], BaseVarId);
+ strcat (VarIdStr[2], ".Day");
+ }
+
+ if ((pNode[0] = new SVfrQuestionNode (Name, VarIdStr[0], DATE_YEAR_BITMASK)) == NULL) {
+ goto Err;
+ }
+ if ((pNode[1] = new SVfrQuestionNode (Name, VarIdStr[1], DATE_MONTH_BITMASK)) == NULL) {
+ goto Err;
+ }
+ if ((pNode[2] = new SVfrQuestionNode (Name, VarIdStr[2], DATE_DAY_BITMASK)) == NULL) {
+ goto Err;
+ }
+
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {
+ QuestionId = GetFreeQuestionId ();
+ } else {
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {
+ goto Err;
+ }
+ MarkQuestionIdUsed (QuestionId);
+ }
+
+ pNode[0]->mQuestionId = QuestionId;
+ pNode[1]->mQuestionId = QuestionId;
+ pNode[2]->mQuestionId = QuestionId;
+ pNode[0]->mNext = pNode[1];
+ pNode[1]->mNext = pNode[2];
+ pNode[2]->mNext = mQuestionList;
+ mQuestionList = pNode[0];
+
+ for (Index = 0; Index < 3; Index++) {
+ if (VarIdStr[Index] != NULL) {
+ delete VarIdStr[Index];
+ }
+ }
+
+ gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+ gCFormPkg.DoPendingAssign (VarIdStr[1], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+ gCFormPkg.DoPendingAssign (VarIdStr[2], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+
+ return;
+
+Err:
+ for (Index = 0; Index < 3; Index++) {
+ if (pNode[Index] != NULL) {
+ delete pNode[Index];
+ }
+
+ if (VarIdStr[Index] != NULL) {
+ delete VarIdStr[Index];
+ }
+ }
+}
+
+VOID
+CVfrQuestionDB::RegisterOldTimeQuestion (
+ IN INT8 *HourVarId,
+ IN INT8 *MinuteVarId,
+ IN INT8 *SecondVarId,
+ IN OUT EFI_QUESTION_ID &QuestionId
+ )
+{
+ SVfrQuestionNode *pNode[3] = {NULL, };
+ UINT32 Index;
+
+ if ((HourVarId == NULL) || (MinuteVarId == NULL) || (SecondVarId == NULL)) {
+ return;
+ }
+
+ if ((pNode[0] = new SVfrQuestionNode (NULL, HourVarId, TIME_HOUR_BITMASK)) == NULL) {
+ goto Err;
+ }
+ if ((pNode[1] = new SVfrQuestionNode (NULL, MinuteVarId, TIME_MINUTE_BITMASK)) == NULL) {
+ goto Err;
+ }
+ if ((pNode[2] = new SVfrQuestionNode (NULL, SecondVarId, TIME_SECOND_BITMASK)) == NULL) {
+ goto Err;
+ }
+
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {
+ QuestionId = GetFreeQuestionId ();
+ } else {
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {
+ goto Err;
+ }
+ MarkQuestionIdUsed (QuestionId);
+ }
+
+ pNode[0]->mQuestionId = QuestionId;
+ pNode[1]->mQuestionId = QuestionId;
+ pNode[2]->mQuestionId = QuestionId;
+ pNode[0]->mNext = pNode[1];
+ pNode[1]->mNext = pNode[2];
+ pNode[2]->mNext = mQuestionList;
+ mQuestionList = pNode[0];
+
+ gCFormPkg.DoPendingAssign (HourVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+ gCFormPkg.DoPendingAssign (MinuteVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+ gCFormPkg.DoPendingAssign (SecondVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+
+ return;
+
+Err:
+ for (Index = 0; Index < 3; Index++) {
+ if (pNode[Index] != NULL) {
+ delete pNode[Index];
+ }
+ }
+ QuestionId = EFI_QUESTION_ID_INVALID;
+}
+
+VOID
+CVfrQuestionDB::RegisterNewTimeQuestion (
+ IN INT8 *Name,
+ IN INT8 *BaseVarId,
+ IN OUT EFI_QUESTION_ID &QuestionId
+ )
+{
+ SVfrQuestionNode *pNode[3] = {NULL, };
+ UINT32 Len;
+ INT8 *VarIdStr[3] = {NULL, };
+ INT8 Index;
+
+ if (BaseVarId == NULL) {
+ return;
+ }
+
+ Len = strlen (BaseVarId);
+
+ VarIdStr[0] = new INT8[Len + strlen (".Hour") + 1];
+ if (VarIdStr[0] != NULL) {
+ strcpy (VarIdStr[0], BaseVarId);
+ strcat (VarIdStr[0], ".Hour");
+ }
+ VarIdStr[1] = new INT8[Len + strlen (".Minute") + 1];
+ if (VarIdStr[1] != NULL) {
+ strcpy (VarIdStr[1], BaseVarId);
+ strcat (VarIdStr[1], ".Minute");
+ }
+ VarIdStr[2] = new INT8[Len + strlen (".Second") + 1];
+ if (VarIdStr[2] != NULL) {
+ strcpy (VarIdStr[2], BaseVarId);
+ strcat (VarIdStr[2], ".Second");
+ }
+
+ if ((pNode[0] = new SVfrQuestionNode (Name, VarIdStr[0], TIME_HOUR_BITMASK)) == NULL) {
+ goto Err;
+ }
+ if ((pNode[1] = new SVfrQuestionNode (Name, VarIdStr[1], TIME_MINUTE_BITMASK)) == NULL) {
+ goto Err;
+ }
+ if ((pNode[2] = new SVfrQuestionNode (Name, VarIdStr[2], TIME_SECOND_BITMASK)) == NULL) {
+ goto Err;
+ }
+
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {
+ QuestionId = GetFreeQuestionId ();
+ } else {
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {
+ goto Err;
+ }
+ MarkQuestionIdUsed (QuestionId);
+ }
+
+ pNode[0]->mQuestionId = QuestionId;
+ pNode[1]->mQuestionId = QuestionId;
+ pNode[2]->mQuestionId = QuestionId;
+ pNode[0]->mNext = pNode[1];
+ pNode[1]->mNext = pNode[2];
+ pNode[2]->mNext = mQuestionList;
+ mQuestionList = pNode[0];
+
+ for (Index = 0; Index < 3; Index++) {
+ if (VarIdStr[Index] != NULL) {
+ delete VarIdStr[Index];
+ }
+ }
+
+ gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+ gCFormPkg.DoPendingAssign (VarIdStr[1], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+ gCFormPkg.DoPendingAssign (VarIdStr[2], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));
+
+ return;
+
+Err:
+ for (Index = 0; Index < 3; Index++) {
+ if (pNode[Index] != NULL) {
+ delete pNode[Index];
+ }
+
+ if (VarIdStr[Index] != NULL) {
+ delete VarIdStr[Index];
+ }
+ }
+}
+
+EFI_VFR_RETURN_CODE
+CVfrQuestionDB::UpdateQuestionId (
+ IN EFI_QUESTION_ID QId,
+ IN EFI_QUESTION_ID NewQId
+ )
+{
+ SVfrQuestionNode *pNode = NULL;
+
+ if (ChekQuestionIdFree (NewQId) == FALSE) {
+ return VFR_RETURN_REDEFINED;
+ }
+
+ for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mQuestionId == QId) {
+ break;
+ }
+ }
+
+ if (pNode == NULL) {
+ return VFR_RETURN_UNDEFINED;
+ }
+
+ MarkQuestionIdUnused (QId);
+ pNode->mQuestionId = NewQId;
+ MarkQuestionIdUsed (NewQId);
+
+ gCFormPkg.DoPendingAssign (pNode->mVarIdStr, (VOID *)&NewQId, sizeof(EFI_QUESTION_ID));
+
+ return VFR_RETURN_SUCCESS;
+}
+
+VOID
+CVfrQuestionDB::GetQuestionId (
+ IN INT8 *Name,
+ IN INT8 *VarIdStr,
+ OUT EFI_QUESTION_ID &QuestionId,
+ OUT UINT32 &BitMask
+ )
+{
+ SVfrQuestionNode *pNode;
+
+ QuestionId = EFI_QUESTION_ID_INVALID;
+ BitMask = 0x00000000;
+
+ if ((Name == NULL) && (VarIdStr == NULL)) {
+ return ;
+ }
+
+ for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {
+ if (Name != NULL) {
+ if (strcmp (pNode->mName, Name) != 0) {
+ continue;
+ }
+ }
+
+ if (VarIdStr != NULL) {
+ if (strcmp (pNode->mVarIdStr, VarIdStr) != 0) {
+ continue;
+ }
+ }
+
+ QuestionId = pNode->mQuestionId;
+ BitMask = pNode->mBitMask;
+ break;
+ }
+
+ return ;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrQuestionDB::FindQuestion (
+ IN EFI_QUESTION_ID QuestionId
+ )
+{
+ SVfrQuestionNode *pNode;
+
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {
+ return VFR_RETURN_INVALID_PARAMETER;
+ }
+
+ for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {
+ if (pNode->mQuestionId == QuestionId) {
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ return VFR_RETURN_UNDEFINED;
+}
+
+EFI_VFR_RETURN_CODE
+CVfrQuestionDB::FindQuestion (
+ IN INT8 *Name
+ )
+{
+ SVfrQuestionNode *pNode;
+
+ if (Name == NULL) {
+ return VFR_RETURN_FATAL_ERROR;
+ }
+
+ for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {
+ if (strcmp (pNode->mName, Name) == 0) {
+ return VFR_RETURN_SUCCESS;
+ }
+ }
+
+ return VFR_RETURN_UNDEFINED;
+}
+
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.h b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.h
new file mode 100644
index 0000000000..e8c1009101
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrUtilityLib.h
@@ -0,0 +1,341 @@
+#ifndef _VFRUTILITYLIB_H_
+#define _VFRUTILITYLIB_H_
+
+#include "Tiano.h"
+#include "string.h"
+#include "EfiTypes.h"
+#include "EfiVfr.h"
+#include "VfrError.h"
+
+#define MAX_NAME_LEN 64
+#define DEFAULT_ALIGN 1
+#define DEFAULT_PACK_ALIGN 0xFFFFFFFF
+#define DEFAULT_NAME_TABLE_ITEMS 1024
+
+#define EFI_BITS_SHIFT_PER_UINT32 0x5
+#define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)
+
+#define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);
+
+class CVfrBinaryOutput {
+public:
+ virtual VOID WriteLine (IN FILE *, IN UINT32, IN INT8 *, IN INT8 *, IN UINT32);
+ virtual VOID WriteEnd (IN FILE *, IN UINT32, IN INT8 *, IN INT8 *, IN UINT32);
+};
+
+UINT32
+_STR2U32 (
+ IN INT8 *Str
+ );
+
+struct SConfigInfo {
+ UINT16 mOffset;
+ UINT16 mWidth;
+ UINT8 *mValue;
+ SConfigInfo *mNext;
+
+ SConfigInfo (IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
+ ~SConfigInfo (VOID);
+};
+
+struct SConfigItem {
+ INT8 *mId;
+ INT8 *mInfo;
+ SConfigInfo *mInfoStrList;
+ SConfigItem *mNext;
+
+public:
+ SConfigItem (IN INT8 *, IN INT8 *);
+ SConfigItem (IN INT8 *, IN INT8 *, IN UINT8, IN UINT16, IN UINT16, IN EFI_IFR_TYPE_VALUE);
+ virtual ~SConfigItem ();
+};
+
+class CVfrBufferConfig {
+private:
+ SConfigItem *mItemListHead;
+ SConfigItem *mItemListTail;
+ SConfigItem *mItemListPos;
+
+public:
+ CVfrBufferConfig (VOID);
+ virtual ~CVfrBufferConfig (VOID);
+
+ virtual UINT8 Register (IN INT8 *, IN INT8 *Info = NULL);
+ virtual VOID Open (VOID);
+ virtual BOOLEAN Eof(VOID);
+ virtual UINT8 Select (IN INT8 *, IN INT8 *Info = NULL);
+ virtual UINT8 Write (IN CONST CHAR8, IN INT8 *, IN INT8 *, IN UINT8, IN UINT16, IN UINT32, IN EFI_IFR_TYPE_VALUE);
+#if 0
+ virtual UINT8 Read (OUT INT8 **, OUT INT8 **, OUT INT8 **, OUT INT8 **, OUT INT8 **);
+#endif
+ virtual VOID Close (VOID);
+ virtual VOID OutputCFile (IN FILE *, IN INT8 *);
+};
+
+extern CVfrBufferConfig gCVfrBufferConfig;
+
+#define ALIGN_STUFF(Size, Align) ((Align) - (Size) % (Align))
+#define INVALID_ARRAY_INDEX 0xFFFFFFFF
+
+struct SVfrDataType;
+
+struct SVfrDataField {
+ INT8 mFieldName[MAX_NAME_LEN];
+ SVfrDataType *mFieldType;
+ UINT32 mOffset;
+ UINT32 mArrayNum;
+ SVfrDataField *mNext;
+};
+
+struct SVfrDataType {
+ INT8 mTypeName[MAX_NAME_LEN];
+ UINT8 mType;
+ UINT32 mAlign;
+ UINT32 mTotalSize;
+ SVfrDataField *mMembers;
+ SVfrDataType *mNext;
+};
+
+class CVfrVarDataTypeDB {
+private:
+ SVfrDataType *mDataTypeList;
+ UINT32 mPackAlign;
+
+ SVfrDataType *mNewDataType;
+ SVfrDataType *mCurrDataType;
+ SVfrDataField *mCurrDataField;
+
+ VOID InternalTypesListInit (VOID);
+ VOID RegisterNewType (IN SVfrDataType *);
+
+ EFI_VFR_RETURN_CODE ExtractStructTypeName (IN INT8 *&, OUT INT8 *);
+ EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN INT8 *&, OUT INT8 *, OUT UINT32 &);
+ EFI_VFR_RETURN_CODE GetTypeField (IN INT8 *, IN SVfrDataType *, IN SVfrDataField *&);
+ EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT UINT32 &);
+ UINT8 GetFieldWidth (IN SVfrDataField *);
+ UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32);
+
+public:
+ CVfrVarDataTypeDB (VOID);
+ ~CVfrVarDataTypeDB (VOID);
+
+ EFI_VFR_RETURN_CODE Pack (IN UINT32);
+ VOID UnPack (VOID);
+
+ VOID DeclareDataTypeBegin (VOID);
+ EFI_VFR_RETURN_CODE SetNewTypeName (IN INT8 *);
+ EFI_VFR_RETURN_CODE DataTypeAddField (IN INT8 *, IN INT8 *, IN UINT32);
+ VOID DeclareDataTypeEnd (VOID);
+
+ EFI_VFR_RETURN_CODE GetDataType (IN INT8 *, OUT SVfrDataType **);
+ EFI_VFR_RETURN_CODE GetDataTypeSize (IN INT8 *, OUT UINT32 *);
+ EFI_VFR_RETURN_CODE GetDataFieldInfo (IN INT8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &);
+
+ EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT INT8 ***, OUT UINT32 *);
+ BOOLEAN IsTypeNameDefined (IN INT8 *);
+
+#ifdef CVFR_VARDATATYPEDB_DEBUG
+ VOID ParserDB ();
+#endif
+};
+
+typedef enum {
+ EFI_VFR_VARSTORE_INVALID,
+ EFI_VFR_VARSTORE_BUFFER,
+ EFI_VFR_VARSTORE_EFI,
+ EFI_VFR_VARSTORE_NAME
+} EFI_VFR_VARSTORE_TYPE;
+
+struct SVfrVarStorageNode {
+ EFI_GUID mGuid;
+ INT8 *mVarStoreName;
+ EFI_VARSTORE_ID mVarStoreId;
+ struct SVfrVarStorageNode *mNext;
+
+ EFI_VFR_VARSTORE_TYPE mVarStoreType;
+ union {
+ // EFI Variable
+ struct {
+ EFI_STRING_ID mEfiVarName;
+ UINT32 mEfiVarSize;
+ } mEfiVar;
+
+ // Buffer Storage
+ SVfrDataType *mDataType;
+
+ // NameValue Storage
+ struct {
+ EFI_STRING_ID *mNameTable;
+ UINT32 mTableSize;
+ } mNameSpace;
+ } mStorageInfo;
+
+public:
+ SVfrVarStorageNode (IN EFI_GUID *, IN INT8 *, IN EFI_VARSTORE_ID, IN EFI_STRING_ID, IN UINT32);
+ SVfrVarStorageNode (IN EFI_GUID *, IN INT8 *, IN EFI_VARSTORE_ID, IN SVfrDataType *);
+ SVfrVarStorageNode (IN INT8 *, IN EFI_VARSTORE_ID);
+ ~SVfrVarStorageNode (VOID);
+};
+
+struct EFI_VARSTORE_INFO {
+ EFI_VARSTORE_ID mVarStoreId;
+ union {
+ EFI_STRING_ID mVarName;
+ UINT16 mVarOffset;
+ } mInfo;
+ UINT8 mVarType;
+ UINT32 mVarTotalSize;
+
+ EFI_VARSTORE_INFO (VOID);
+ EFI_VARSTORE_INFO (IN EFI_VARSTORE_INFO &);
+ BOOLEAN operator == (IN EFI_VARSTORE_INFO *);
+};
+
+#define EFI_VARSTORE_ID_MAX 0xFFFF
+#define EFI_FREE_VARSTORE_ID_BITMAP_SIZE ((EFI_VARSTORE_ID_MAX + 1) / EFI_BITS_PER_UINT32)
+
+class CVfrDataStorage {
+private:
+ UINT32 mFreeVarStoreIdBitMap[EFI_FREE_VARSTORE_ID_BITMAP_SIZE];
+
+ struct SVfrVarStorageNode *mBufferVarStoreList;
+ struct SVfrVarStorageNode *mEfiVarStoreList;
+ struct SVfrVarStorageNode *mNameVarStoreList;
+
+ struct SVfrVarStorageNode *mCurrVarStorageNode;
+ struct SVfrVarStorageNode *mNewVarStorageNode;
+
+private:
+
+ EFI_VARSTORE_ID GetFreeVarStoreId (VOID);
+ BOOLEAN ChekVarStoreIdFree (IN EFI_VARSTORE_ID);
+ VOID MarkVarStoreIdUsed (IN EFI_VARSTORE_ID);
+ VOID MarkVarStoreIdUnused (IN EFI_VARSTORE_ID);
+
+public:
+ CVfrDataStorage ();
+ ~CVfrDataStorage ();
+
+ EFI_VFR_RETURN_CODE DeclareNameVarStoreBegin (INT8 *);
+ EFI_VFR_RETURN_CODE NameTableAddItem (EFI_STRING_ID);
+ EFI_VFR_RETURN_CODE DeclareNameVarStoreEnd (EFI_GUID *);
+
+ EFI_VFR_RETURN_CODE DeclareEfiVarStore (IN INT8 *, IN EFI_GUID *, IN EFI_STRING_ID, IN UINT32);
+
+ EFI_VFR_RETURN_CODE DeclareBufferVarStore (IN INT8 *, IN EFI_GUID *, IN CVfrVarDataTypeDB *, IN INT8 *, IN EFI_VARSTORE_ID);
+
+ EFI_VFR_RETURN_CODE GetVarStoreId (IN INT8 *, OUT EFI_VARSTORE_ID *);
+ EFI_VFR_RETURN_CODE GetVarStoreType (IN INT8 *, OUT EFI_VFR_VARSTORE_TYPE &);
+ EFI_VFR_RETURN_CODE GetVarStoreName (IN EFI_VARSTORE_ID, OUT INT8 **);
+
+ EFI_VFR_RETURN_CODE GetBufferVarStoreDataTypeName (IN INT8 *, OUT INT8 **);
+ EFI_VFR_RETURN_CODE GetEfiVarStoreInfo (IN EFI_VARSTORE_INFO *);
+ EFI_VFR_RETURN_CODE GetNameVarStoreInfo (IN EFI_VARSTORE_INFO *, IN UINT32);
+
+ EFI_VFR_RETURN_CODE BufferVarStoreRequestElementAdd (IN INT8 *, IN EFI_VARSTORE_INFO &);
+};
+
+#define EFI_QUESTION_ID_MAX 0xFFFF
+#define EFI_FREE_QUESTION_ID_BITMAP_SIZE ((EFI_QUESTION_ID_MAX + 1) / EFI_BITS_PER_UINT32)
+#define EFI_QUESTION_ID_INVALID 0x0
+
+#define DATE_YEAR_BITMASK 0x0000FFFF
+#define DATE_MONTH_BITMASK 0x00FF0000
+#define DATE_DAY_BITMASK 0xFF000000
+#define TIME_HOUR_BITMASK 0x000000FF
+#define TIME_MINUTE_BITMASK 0x0000FF00
+#define TIME_SECOND_BITMASK 0x00FF0000
+
+struct SVfrQuestionNode {
+ INT8 *mName;
+ INT8 *mVarIdStr;
+ EFI_QUESTION_ID mQuestionId;
+ UINT32 mBitMask;
+ SVfrQuestionNode *mNext;
+
+ SVfrQuestionNode (IN INT8 *, IN INT8 *, IN UINT32 BitMask = 0);
+ ~SVfrQuestionNode ();
+};
+
+class CVfrQuestionDB {
+private:
+ SVfrQuestionNode *mQuestionList;
+ UINT32 mFreeQIdBitMap[EFI_FREE_QUESTION_ID_BITMAP_SIZE];
+
+private:
+ EFI_QUESTION_ID GetFreeQuestionId (VOID);
+ BOOLEAN ChekQuestionIdFree (IN EFI_QUESTION_ID);
+ VOID MarkQuestionIdUsed (IN EFI_QUESTION_ID);
+ VOID MarkQuestionIdUnused (IN EFI_QUESTION_ID);
+
+public:
+ CVfrQuestionDB ();
+ ~CVfrQuestionDB();
+
+ EFI_VFR_RETURN_CODE RegisterQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
+ VOID RegisterOldDateQuestion (IN INT8 *, IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
+ VOID RegisterNewDateQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
+ VOID RegisterOldTimeQuestion (IN INT8 *, IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
+ VOID RegisterNewTimeQuestion (IN INT8 *, IN INT8 *, IN OUT EFI_QUESTION_ID &);
+ EFI_VFR_RETURN_CODE UpdateQuestionId (IN EFI_QUESTION_ID, IN EFI_QUESTION_ID);
+ VOID GetQuestionId (IN INT8 *, IN INT8 *, OUT EFI_QUESTION_ID &, OUT UINT32 &);
+ EFI_VFR_RETURN_CODE FindQuestion (IN EFI_QUESTION_ID);
+ EFI_VFR_RETURN_CODE FindQuestion (IN INT8 *);
+ };
+
+struct SVfrDefaultStoreNode {
+ EFI_IFR_DEFAULTSTORE *mObjBinAddr;
+ INT8 *mRefName;
+ EFI_STRING_ID mDefaultStoreNameId;
+ UINT16 mDefaultId;
+
+ SVfrDefaultStoreNode *mNext;
+
+ SVfrDefaultStoreNode (IN EFI_IFR_DEFAULTSTORE *, IN INT8 *, IN EFI_STRING_ID, IN UINT16);
+ ~SVfrDefaultStoreNode();
+};
+
+class CVfrDefaultStore {
+private:
+ SVfrDefaultStoreNode *mDefaultStoreList;
+
+public:
+ CVfrDefaultStore ();
+ ~CVfrDefaultStore ();
+
+ EFI_VFR_RETURN_CODE RegisterDefaultStore (IN CHAR8 *, IN INT8 *, IN EFI_STRING_ID, IN UINT16);
+ EFI_VFR_RETURN_CODE ReRegisterDefaultStoreById (IN UINT16, IN INT8 *, IN EFI_STRING_ID);
+ BOOLEAN DefaultIdRegistered (IN UINT16);
+ EFI_VFR_RETURN_CODE GetDefaultId (IN INT8 *, OUT UINT16 *);
+ EFI_VFR_RETURN_CODE BufferVarStoreAltConfigAdd (IN EFI_VARSTORE_ID, IN EFI_VARSTORE_INFO &, IN INT8 *, IN UINT8, IN EFI_IFR_TYPE_VALUE);
+};
+
+#define EFI_RULE_ID_START 0x01
+#define EFI_RULE_ID_INVALID 0x00
+
+struct SVfrRuleNode {
+ UINT8 mRuleId;
+ INT8 *mRuleName;
+ SVfrRuleNode *mNext;
+
+ SVfrRuleNode(IN INT8 *, IN UINT8);
+ ~SVfrRuleNode();
+};
+
+class CVfrRulesDB {
+private:
+ SVfrRuleNode *mRuleList;
+ UINT8 mFreeRuleId;
+
+public:
+ CVfrRulesDB ();
+ ~CVfrRulesDB();
+
+ VOID RegisterRule (IN INT8 *);
+ UINT8 GetRuleId (IN INT8 *);
+};
+
+#define MIN(v1, v2) (((v1) < (v2)) ? (v1) : (v2))
+#define MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))
+
+#endif
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/makefile b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/makefile
new file mode 100644
index 0000000000..61fd9e4641
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/makefile
@@ -0,0 +1,149 @@
+#/*++
+#
+# Copyright (c) 2004 - 2007, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+# makefile
+#
+# Abstract:
+#
+# Makefile for building the EFI VFR compiler
+#
+#--*/
+
+
+!IFNDEF EDK_SOURCE
+!ERROR EDK_SOURCE environmental variable not set
+!ENDIF
+
+!IFNDEF TOOLCHAIN
+TOOLCHAIN = TOOLCHAIN_MSVC
+!ENDIF
+
+!INCLUDE $(BUILD_DIR)\PlatformTools.env
+
+.SUFFIXES :
+
+TARGET_NAME = VfrCompile
+
+ETO = $(EDK_TOOLS_OUTPUT)
+SRC = $(EDK_TOOLS_SOURCE)\Uefi$(TARGET_NAME)
+TARGET_EXE = $(ETO)\$(TARGET_NAME).exe
+
+
+
+INC = -I $(SRC) \
+ -I $(EDK_SOURCE)\Foundation\Include\Ia32 \
+ -I $(EDK_SOURCE)\Foundation\Efi\Include \
+ -I $(EDK_SOURCE)\Foundation\Framework\Include \
+ -I $(EDK_SOURCE)\Foundation\Include\IndustryStandard \
+ -I $(EDK_SOURCE)\Foundation\ \
+ -I $(EDK_SOURCE)\Foundation\Core\Dxe \
+ -I $(EDK_SOURCE)\Foundation\Efi \
+ -I $(EDK_SOURCE)\Foundation\Framework \
+ -I $(EDK_TOOLS_SOURCE)\Common \
+ -I $(EDK_SOURCE)\Foundation\Include
+
+ANTLR_FLAGS = -CC -e3 -ck 3 -k 2
+DLG_FLAGS = -C2 -i -CC
+LINK_FLAGS_PCCTS = /DEBUG /PDB:$*.pdb
+C_FLAGS_PCCTS = -I. -I$(ANTLR_H) /WX /Od /EHsc /Zi /Fd$(ETO)\$(TARGET_NAME)Obj /D _CRT_SECURE_NO_DEPRECATE $(VERSION_FLAGS) /D PCCTS_USE_NAMESPACE_STD #/D CVFR_VARDATATYPEDB_DEBUG /D CIFROBJ_DEUBG /D VFREXP_DEBUG
+
+VFR_GRAMMER_FILE = $(SRC)\VfrSyntax.g
+
+VFR_ANTLR_SPAWN = $(ETO)\VfrSyntax.cpp \
+ $(ETO)\EfiVfrParser.cpp \
+ $(ETO)\EfiVfrParser.h \
+ $(ETO)\VfrParser.dlg \
+ $(ETO)\VfrTokens.h
+
+VFR_DLG_SPAWN = $(ETO)\VfrLexer.cpp \
+ $(ETO)\VfrLexer.h
+
+ANTLR_H = $(PCCTS_DIR)\h
+
+HEADER_FILES = $(SRC)\VfrFormPkg.h \
+ $(SRC)\EfiVfr.h \
+ $(SRC)\VfrCompiler.h \
+ $(SRC)\VfrError.h \
+ $(SRC)\VfrUtilityLib.h
+
+OBJECTS = $(ETO)\AParser.obj \
+ $(ETO)\DLexerBase.obj \
+ $(ETO)\ATokenBuffer.obj \
+ $(ETO)\VfrSyntax.obj \
+ $(ETO)\EfiVfrParser.obj \
+ $(ETO)\VfrLexer.obj \
+ $(ETO)\VfrFormPkg.obj \
+ $(ETO)\VfrError.obj \
+ $(ETO)\VfrUtilityLib.obj \
+ $(ETO)\VfrCompiler.obj
+
+all : $(TARGET_EXE)
+
+$(VFR_ANTLR_SPAWN) : $(VFR_GRAMMER_FILE)
+ $(ANTLR) $(ANTLR_FLAGS) -fl VfrParser.dlg -ft VfrTokens.h -o $(ETO) $(VFR_GRAMMER_FILE)
+
+$(VFR_DLG_SPAWN) : $(ETO)\VfrParser.dlg
+ $(DLG) $(DLG_FLAGS) -cl VfrLexer -o $(ETO) $(ETO)\VfrParser.dlg
+
+$(ETO)\VfrSyntax.obj : $(ETO)\VfrSyntax.cpp $(VFR_DLG_SPAWN)
+ $(CC) -c $(C_FLAGS_PCCTS) /Fo$@ $(INC) $(ETO)\VfrSyntax.cpp
+
+$(ETO)\EfiVfrParser.obj : $(ETO)\EfiVfrParser.cpp $(ETO)\EfiVfrParser.h $(VFR_DLG_SPAWN)
+ $(CC) -c $(C_FLAGS_PCCTS) /Fo$@ $(INC) $(ETO)\EfiVfrParser.cpp
+
+
+$(ETO)\AParser.obj : $(ANTLR_H)\AParser.cpp
+ $(CC) -c $(C_FLAGS_PCCTS) /Fo$@ $(ANTLR_H)\AParser.cpp
+
+$(ETO)\ATokenBuffer.obj : $(ANTLR_H)\ATokenBuffer.cpp
+ $(CC) -c $(C_FLAGS_PCCTS) /Fo$@ $(ANTLR_H)\ATokenBuffer.cpp
+
+$(ETO)\DLexerBase.obj : $(ANTLR_H)\DLexerBase.cpp
+ $(CC) -c $(C_FLAGS_PCCTS) /Fo$@ $(ANTLR_H)\DLexerBase.cpp
+
+$(ETO)\VfrLexer.obj : $(ETO)\VfrLexer.cpp $(VFR_DLG_SPAWN)
+ $(CC) -c $(C_FLAGS_PCCTS) /Fo$@ $(INC) $(ETO)\VfrLexer.cpp
+
+$(ETO)\VfrFormPkg.obj : $(SRC)\VfrFormPkg.cpp $(HEADER_FILES)
+ $(CC) -c $(C_FLAGS_PCCTS) $(INC) /Fo$@ $(SRC)\VfrFormPkg.cpp
+
+$(ETO)\VfrError.obj : $(SRC)\VfrError.cpp $(HEADER_FILES)
+ $(CC) -c $(C_FLAGS_PCCTS) $(INC) /Fo$@ $(SRC)\VfrError.cpp
+
+$(ETO)\VfrUtilityLib.obj : $(SRC)\VfrUtilityLib.cpp $(HEADER_FILES)
+ $(CC) -c $(C_FLAGS_PCCTS) $(INC) /Fo$@ $(SRC)\VfrUtilityLib.cpp
+
+$(ETO)\VfrCompiler.obj : $(SRC)\VfrCompiler.cpp $(HEADER_FILES)
+ $(CC) -c $(C_FLAGS_PCCTS) $(INC) /Fo$@ $(SRC)\VfrCompiler.cpp
+
+#
+# Add Binary Build description for this tools.
+#
+
+!IF (("$(EFI_BINARY_TOOLS)" == "YES") && EXIST($(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).exe))
+$(TARGET_EXE): $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).exe
+ copy $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).exe $(TARGET_EXE) /Y
+ if exist $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).pdb \
+ copy $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).pdb $(EDK_TOOLS_OUTPUT)\$(TARGET_NAME).pdb /Y
+!ELSE
+$(TARGET_EXE) : $(OBJECTS) $(HEADER_FILES)
+ $(LINK) $(MSVS_LINK_LIBPATHS) $(LINK_FLAGS_PCCTS) /OUT:$(TARGET_EXE) $(OBJECTS)
+!IF ("$(EFI_BINARY_BUILD)" == "YES")
+ if not exist $(EFI_PLATFORM_BIN)\Tools mkdir $(EFI_PLATFORM_BIN)\Tools
+ if exist $(TARGET_EXE) copy $(TARGET_EXE) $(EFI_PLATFORM_BIN)\tools\$(TARGET_NAME).exe /Y
+ if exist $(EDK_TOOLS_OUTPUT)\$(TARGET_NAME).pdb \
+ copy $(EDK_TOOLS_OUTPUT)\$(TARGET_NAME).pdb $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).pdb /Y
+!ENDIF
+!ENDIF
+
+clean: