1) Sync EdkCompatibilityPkg with EDK 1.04. The changes includes:
1.1) Bug fixes. (For details, please check Documents & files: Snapshot/Release Notes at https://edk.tianocore.org/servlets/ProjectDocumentList?folderID=43&expandFolder=43&folderID=6) 1.2) Add new UEFI protocol definitions for AbsolutePointer, FormBrowser2, HiiConfigAccess, HiiConfigRouting, HiiDatabase, HiiFont, HiiImage, HiiString, SimpleTextInputEx, DPC protocol. 1.3) Add Smbios 2.5, 2.6 supports. Incompatible changes hilighted: 1) EFI_MANAGED_NETWORK_PROTOCOL_GUID changed. 2) EFI_IP4_IPCONFIG_DATA changed. 2) Add in EdkCompatibilityPkg/EdkCompatibilityPkg.dsc to build all libraries in this package. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4624 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -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, };
|
Reference in New Issue
Block a user