1. Updated LOG file format generated by PeiRebase.
2. Updated PeiRebase to rebase an FV in a single pass. 3. Fixed bugs in GenFvMap to make it compilable by WinDDK and able to generate FV map file for production tip. 4. Update genefi task to copy map files to ${BIN_DIR} as well. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2559 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -8,453 +8,640 @@
|
|||||||
//** from the company.
|
//** from the company.
|
||||||
//**
|
//**
|
||||||
//****************************************************************************
|
//****************************************************************************
|
||||||
#include "ProcessorBind.h"
|
#include <cstdio>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <stdexcept>
|
|
||||||
#include <list>
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <iomanip>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <sstream>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <functional>
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
typedef UINT64 ulonglong_t;
|
#include "ProcessorBind.h"
|
||||||
|
|
||||||
#ifdef __GNUC__
|
class putUINT64
|
||||||
#if __STDC_VERSION__ < 199901L
|
|
||||||
#define __FUNCTION__ __FILE__
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
class CMemoryLeakChecker : public list<T*>
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static CMemoryLeakChecker<T>& GetInstance(void);
|
putUINT64(UINT64 ullVal) : m_ull(ullVal) {}
|
||||||
|
putUINT64(const putUINT64& r) : m_ull(r.m_ull) {}
|
||||||
|
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
friend basic_ostream<_E, _Tr>& operator << (basic_ostream<_E, _Tr>&, putUINT64);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CMemoryLeakChecker(void)
|
UINT64 m_ull;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
basic_ostream<_E, _Tr>& operator << (basic_ostream<_E, _Tr>& os, putUINT64 ull)
|
||||||
|
{
|
||||||
|
static const char cDigits[] = "0123456789abcdef";
|
||||||
|
|
||||||
|
UINT64 base = 10;
|
||||||
|
if (os.flags() & ios_base::hex)
|
||||||
|
base = 16;
|
||||||
|
else if (os.flags() & ios_base::oct)
|
||||||
|
base = 8;
|
||||||
|
|
||||||
|
ostringstream ostr;
|
||||||
|
UINT64 ullVal = ull.m_ull;
|
||||||
|
while (ullVal != 0)
|
||||||
{
|
{
|
||||||
|
ostr << cDigits[ullVal % base];
|
||||||
|
ullVal /= base;
|
||||||
}
|
}
|
||||||
|
|
||||||
~CMemoryLeakChecker(void);
|
string s1(ostr.str());
|
||||||
|
string s2(s1.rbegin(), s1.rend());
|
||||||
|
return os << s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
class getUINT64
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
getUINT64(UINT64& ullVal) : m_ull(ullVal) {}
|
||||||
|
getUINT64(const getUINT64& r) : m_ull(r.m_ull) {}
|
||||||
|
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
friend basic_istream<_E, _Tr>& operator >> (basic_istream<_E, _Tr>&, getUINT64);
|
||||||
|
|
||||||
|
private:
|
||||||
|
UINT64& m_ull;
|
||||||
|
|
||||||
|
private:
|
||||||
|
getUINT64& operator = (const getUINT64&);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
basic_istream<_E, _Tr>& operator >> (basic_istream<_E, _Tr>& is, getUINT64 ull)
|
||||||
|
{
|
||||||
|
string strBuf;
|
||||||
|
is >> strBuf;
|
||||||
|
|
||||||
|
UINT64 base = 10;
|
||||||
|
if (is.flags() & ios_base::hex)
|
||||||
|
base = 16;
|
||||||
|
else if (is.flags() & ios_base::oct)
|
||||||
|
base = 8;
|
||||||
|
|
||||||
|
UINT64 ullVal = 0;
|
||||||
|
for (string::iterator i = strBuf.begin(); i != strBuf.end(); i++)
|
||||||
|
{
|
||||||
|
if (*i <= '9' && *i >= '0')
|
||||||
|
*i -= '0';
|
||||||
|
else if (*i <= 'F' && *i >= 'A')
|
||||||
|
*i -= 'A' - '\x0a';
|
||||||
|
else if (*i <= 'f' && *i >= 'a')
|
||||||
|
*i -= 'a' - '\x0a';
|
||||||
|
else throw runtime_error("Invalid number format");
|
||||||
|
|
||||||
|
ullVal = ullVal * base + *i;
|
||||||
|
}
|
||||||
|
ull.m_ull = ullVal;
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
|
||||||
|
class EMemoryLeak : public logic_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EMemoryLeak() : logic_error("Memory leak detected") {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class EInvalidGuidString : public invalid_argument
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EInvalidGuidString() : invalid_argument("Unexpected format of GUID string") {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ELogFileError : public logic_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ELogFileError(const string& strMsg) : logic_error(strMsg) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class EDuplicatedFfsFile : public ELogFileError
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EDuplicatedFfsFile() : ELogFileError("Duplicated FFS found in LOG file") {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class EUnexpectedLogFileToken : public ELogFileError
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EUnexpectedLogFileToken() : ELogFileError("Unexpected LOG file token") {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class EFileNotFound : public invalid_argument
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EFileNotFound(const string& strFName) : invalid_argument("File not found - " + strFName) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class EUnexpectedMapFile : public logic_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EUnexpectedMapFile(const string& strKeyWord) : logic_error("Unexpected map file format - " + strKeyWord) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class EUsage : public invalid_argument
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EUsage() : invalid_argument("Usage: GenFvMap <FV.LOG> <FV.INF> <FV.MAP>") {}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
CMemoryLeakChecker<T>& CMemoryLeakChecker<T>::GetInstance(void)
|
class CMemoryLeakChecker : public set<T*>
|
||||||
{
|
{
|
||||||
static CMemoryLeakChecker<T> s_memLeakChecker;
|
protected:
|
||||||
return s_memLeakChecker;
|
CMemoryLeakChecker()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~CMemoryLeakChecker();
|
||||||
|
static CMemoryLeakChecker<T>& GetInstance();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CMemoryLeakChecker(const CMemoryLeakChecker<T>&);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
CMemoryLeakChecker<T>::~CMemoryLeakChecker()
|
||||||
|
{
|
||||||
|
if (!CMemoryLeakChecker<T>::empty())
|
||||||
|
throw EMemoryLeak();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
CMemoryLeakChecker<T>::~CMemoryLeakChecker(void)
|
CMemoryLeakChecker<T>& CMemoryLeakChecker<T>::GetInstance()
|
||||||
{
|
{
|
||||||
if (!list<T*>::empty())
|
static CMemoryLeakChecker<T> s_instance;
|
||||||
throw logic_error(__FUNCTION__ ": Memory leak detected!");
|
return s_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
class CObjRoot
|
class CObjRoot
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
CObjRoot(void);
|
CObjRoot()
|
||||||
virtual ~CObjRoot(void);
|
{
|
||||||
|
#ifdef _CHK_MEM_LEAK
|
||||||
|
CMemoryLeakChecker<CObjRoot>::GetInstance().insert(this);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~CObjRoot()
|
||||||
|
{
|
||||||
|
#ifdef _CHK_MEM_LEAK
|
||||||
|
CMemoryLeakChecker<CObjRoot>::GetInstance().erase(this);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
CObjRoot(const CObjRoot&);
|
||||||
};
|
};
|
||||||
|
|
||||||
CObjRoot::CObjRoot(void)
|
|
||||||
{
|
|
||||||
CMemoryLeakChecker<CObjRoot>::GetInstance().push_back(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
CObjRoot::~CObjRoot(void)
|
|
||||||
{
|
|
||||||
CMemoryLeakChecker<CObjRoot>::GetInstance().remove(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
class CIdentity : public CObjRoot
|
class CIdentity : public CObjRoot
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CIdentity(void);
|
|
||||||
CIdentity(const string&);
|
CIdentity(const string&);
|
||||||
CIdentity(const CIdentity&);
|
operator string (void) const;
|
||||||
|
|
||||||
bool operator < (const CIdentity&) const;
|
bool operator < (const CIdentity& id) const
|
||||||
friend istream& operator >> (istream&, CIdentity&);
|
{
|
||||||
friend ostream& operator << (ostream&, const CIdentity&);
|
return memcmp(this, &id, sizeof(*this)) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const string::size_type s_nIdStrLen;
|
CIdentity() : ulD1(0), wD2(0), wD3(0), wD4(0), ullD5(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
CIdentity(const CIdentity& r) : ulD1(r.ulD1), wD2(r.wD2), wD3(r.wD3), wD4(r.wD4), ullD5(r.ullD5)
|
||||||
ulonglong_t m_ullId[2];
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
basic_istream<_E, _Tr>& ReadId(basic_istream<_E, _Tr>&);
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
basic_ostream<_E, _Tr>& WriteId(basic_ostream<_E, _Tr>&);
|
||||||
|
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
friend basic_istream<_E, _Tr>& operator >> (basic_istream<_E, _Tr>&, CIdentity&);
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
friend basic_ostream<_E, _Tr>& operator << (basic_ostream<_E, _Tr>&, CIdentity);
|
||||||
|
|
||||||
|
private:
|
||||||
|
UINT32 ulD1;
|
||||||
|
UINT16 wD2, wD3, wD4;
|
||||||
|
UINT64 ullD5;
|
||||||
};
|
};
|
||||||
|
|
||||||
const string::size_type CIdentity::s_nIdStrLen = 36;
|
CIdentity::CIdentity(const string& strGuid)
|
||||||
|
|
||||||
CIdentity::CIdentity(void)
|
|
||||||
{
|
{
|
||||||
memset(m_ullId, 0, sizeof(m_ullId));
|
try
|
||||||
|
{
|
||||||
|
string str(strGuid);
|
||||||
|
str.erase(0, str.find_first_not_of(" {"));
|
||||||
|
str.resize(str.find_last_not_of(" }") + 1);
|
||||||
|
str[str.find('-')] = ' ';
|
||||||
|
str[str.find('-')] = ' ';
|
||||||
|
str[str.find('-')] = ' ';
|
||||||
|
str[str.find('-')] = ' ';
|
||||||
|
|
||||||
|
istringstream is(str);
|
||||||
|
is >> hex >> ulD1 >> wD2 >> wD3 >> wD4 >> getUINT64(ullD5);
|
||||||
|
}
|
||||||
|
catch (const exception&)
|
||||||
|
{
|
||||||
|
throw EInvalidGuidString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CIdentity::CIdentity(const string& strId)
|
CIdentity::operator string(void) const
|
||||||
{
|
{
|
||||||
if (strId.length() != CIdentity::s_nIdStrLen ||
|
ostringstream os;
|
||||||
strId[8] != '-' ||
|
os << hex << setfill('0')
|
||||||
strId[13] != '-' ||
|
<< setw(8) << ulD1 << '-'
|
||||||
strId[18] != '-' ||
|
<< setw(4) << wD2 << '-'
|
||||||
strId[23] != '-')
|
<< setw(4) << wD3 << '-'
|
||||||
throw runtime_error(
|
<< setw(4) << wD4 << '-'
|
||||||
__FUNCTION__ ": Error GUID format " + strId);
|
<< setw(12) << putUINT64(ullD5);
|
||||||
|
return os.str();
|
||||||
string strIdCopy(strId);
|
|
||||||
strIdCopy.erase(23, 1);
|
|
||||||
strIdCopy[18] = ' ';
|
|
||||||
strIdCopy.erase(13, 1);
|
|
||||||
strIdCopy.erase(8, 1);
|
|
||||||
|
|
||||||
istringstream is(strIdCopy);
|
|
||||||
is >> hex >> m_ullId[0] >> m_ullId[1];
|
|
||||||
if (!is)
|
|
||||||
throw runtime_error(
|
|
||||||
__FUNCTION__ ": GUID contains invalid characters" + strId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CIdentity::CIdentity(const CIdentity& idRight)
|
template <class _E, class _Tr>
|
||||||
|
basic_istream<_E, _Tr>& CIdentity::ReadId(basic_istream<_E, _Tr>& is)
|
||||||
{
|
{
|
||||||
memmove(m_ullId, idRight.m_ullId, sizeof(m_ullId));
|
string str;
|
||||||
}
|
if (!!(is >> str))
|
||||||
|
*this = CIdentity(str);
|
||||||
bool CIdentity::operator < (const CIdentity& idRight) const
|
|
||||||
{
|
|
||||||
return memcmp(m_ullId, idRight.m_ullId, sizeof(m_ullId)) < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
istream& operator >> (istream& is, CIdentity& idRight)
|
|
||||||
{
|
|
||||||
string strId;
|
|
||||||
is >> strId;
|
|
||||||
if (!!is)
|
|
||||||
idRight = CIdentity(strId);
|
|
||||||
return is;
|
return is;
|
||||||
}
|
}
|
||||||
|
|
||||||
ostream& operator << (ostream& os, const CIdentity& idRight)
|
template <class _E, class _Tr>
|
||||||
|
basic_ostream<_E, _Tr>& CIdentity::WriteId(basic_ostream<_E, _Tr>& os)
|
||||||
{
|
{
|
||||||
return os << hex << setfill('0')
|
return os << (string)(*this);
|
||||||
<< setw(8) << (unsigned long)(idRight.m_ullId[0] >> 32) << '-'
|
|
||||||
<< setw(4) << (unsigned short)(idRight.m_ullId[0] >> 16) << '-'
|
|
||||||
<< setw(4) << (unsigned short)idRight.m_ullId[0] << '-'
|
|
||||||
<< setw(4) << (unsigned short)(idRight.m_ullId[1] >> 48) << '-'
|
|
||||||
<< setw(12) << (idRight.m_ullId[1] & 0xffffffffffffULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class CInputFile : public CObjRoot
|
template <class _E, class _Tr>
|
||||||
|
basic_istream<_E, _Tr>& operator >> (basic_istream<_E, _Tr>& is, CIdentity& id)
|
||||||
{
|
{
|
||||||
protected:
|
return id.ReadId(is);
|
||||||
CInputFile(const string&);
|
}
|
||||||
CInputFile(istream&);
|
|
||||||
istream& GetLine(string&);
|
|
||||||
|
|
||||||
private:
|
template <class _E, class _Tr>
|
||||||
CInputFile(const CInputFile&);
|
basic_ostream<_E, _Tr>& operator << (basic_ostream<_E, _Tr>& os, CIdentity id)
|
||||||
CInputFile& operator = (const CInputFile&);
|
{
|
||||||
|
return id.WriteId(os);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
template <class T>
|
||||||
auto_ptr<istream> m_pIs;
|
class IVectorContainerByReference : virtual public CObjRoot, public vector<T*>
|
||||||
|
{
|
||||||
protected:
|
|
||||||
istream& m_is;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CInputFile::CInputFile(const string& strFName)
|
template <class T>
|
||||||
: m_pIs(new ifstream(strFName.c_str()))
|
class IMapContainer : virtual public CObjRoot, public map<CIdentity, T>
|
||||||
, m_is(*m_pIs)
|
|
||||||
{
|
{
|
||||||
if (!m_is)
|
|
||||||
throw runtime_error(__FUNCTION__ ": Error opening input file " + strFName);
|
|
||||||
}
|
|
||||||
|
|
||||||
CInputFile::CInputFile(istream& is)
|
|
||||||
: m_is(is)
|
|
||||||
{
|
|
||||||
if (!m_is)
|
|
||||||
throw runtime_error(__FUNCTION__ ": Error opening input stream");
|
|
||||||
}
|
|
||||||
|
|
||||||
istream& CInputFile::GetLine(string& strALine)
|
|
||||||
{
|
|
||||||
if (!!m_is)
|
|
||||||
while (!!getline(m_is, strALine))
|
|
||||||
{
|
|
||||||
string::size_type pos = strALine.find_last_not_of(' ');
|
|
||||||
if (pos != string::npos)
|
|
||||||
{
|
|
||||||
strALine.erase(pos + 1);
|
|
||||||
strALine.erase(0, strALine.find_first_not_of(' '));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return m_is;
|
|
||||||
}
|
|
||||||
|
|
||||||
class CIdAddressPathMap : public CInputFile, public map<CIdentity, pair<ulonglong_t, string> >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CIdAddressPathMap(istream&);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CIdAddressPathMap::CIdAddressPathMap(istream& is)
|
struct ISymbol : virtual public CObjRoot
|
||||||
: CInputFile(is)
|
|
||||||
{
|
{
|
||||||
key_type k;
|
string strAddress;
|
||||||
mapped_type m;
|
string strName;
|
||||||
while (!!(m_is >> hex >> k >> m.first) && !!GetLine(m.second))
|
string strFrom;
|
||||||
if (!insert(value_type(k, m)).second)
|
UINT64 ullRva;
|
||||||
throw runtime_error(__FUNCTION__ ": Duplicated files");
|
bool bStatic;
|
||||||
}
|
bool bFunction;
|
||||||
|
virtual void Relocate(UINT64)=0;
|
||||||
|
};
|
||||||
|
|
||||||
class CSymbol : public CObjRoot
|
class IModule : public IVectorContainerByReference<ISymbol>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
string m_strAddress;
|
string strName;
|
||||||
string m_strName;
|
CIdentity id;
|
||||||
ulonglong_t m_ullRva;
|
virtual UINT64 BaseAddress(void) const=0;
|
||||||
string m_strFrom;
|
virtual UINT64 BaseAddress(UINT64)=0;
|
||||||
bool m_bStatic;
|
virtual const ISymbol *EntryPoint(void) const=0;
|
||||||
bool m_bFunction;
|
};
|
||||||
|
|
||||||
CSymbol()
|
class IFirmwareVolume : public IVectorContainerByReference<IModule>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
class IMapFileSet : public IMapContainer<istream*>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
class IFfsSet : public IMapContainer<UINT64>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
class CFfsSetFromLogFile : public IFfsSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CFfsSetFromLogFile(const string&);
|
||||||
|
};
|
||||||
|
|
||||||
|
CFfsSetFromLogFile::CFfsSetFromLogFile(const string& strFName)
|
||||||
|
{
|
||||||
|
ifstream ifs(strFName.c_str());
|
||||||
|
if (!ifs)
|
||||||
|
throw EFileNotFound(strFName);
|
||||||
|
|
||||||
|
CIdentity ffsId;
|
||||||
|
while (!!ffsId.ReadId(ifs))
|
||||||
{
|
{
|
||||||
|
UINT64 ullBase;
|
||||||
|
if (!(ifs >> hex >> getUINT64(ullBase)))
|
||||||
|
throw EUnexpectedLogFileToken();
|
||||||
|
if (!insert(value_type(ffsId, ullBase)).second)
|
||||||
|
throw EDuplicatedFfsFile();
|
||||||
}
|
}
|
||||||
CSymbol(const string&, bool = false);
|
|
||||||
friend ostream& operator << (ostream&, const CSymbol&);
|
|
||||||
};
|
|
||||||
|
|
||||||
CSymbol::CSymbol(const string& strALine, bool bStatic)
|
|
||||||
: m_bStatic(bStatic)
|
|
||||||
{
|
|
||||||
istringstream is(strALine);
|
|
||||||
|
|
||||||
is >> m_strAddress >> m_strName >> hex >> m_ullRva >> m_strFrom;
|
|
||||||
if (m_strFrom == "F" || m_strFrom == "f")
|
|
||||||
{
|
|
||||||
m_bFunction = true;
|
|
||||||
is >> m_strFrom;
|
|
||||||
} else m_bFunction = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ostream& operator << (ostream& os, const CSymbol& symbol)
|
class CMapFileSetFromInfFile : public IMapFileSet
|
||||||
{
|
|
||||||
os << hex << setw(16) << setfill('0') << symbol.m_ullRva << setw(0);
|
|
||||||
os << ' ' << (symbol.m_bFunction ? 'F' : ' ')
|
|
||||||
<< (symbol.m_bStatic ? 'S' : ' ') << ' ';
|
|
||||||
return os << symbol.m_strName;
|
|
||||||
}
|
|
||||||
|
|
||||||
class CMapFile : public CInputFile, public list<CSymbol>
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CMapFile(const string&);
|
CMapFileSetFromInfFile(const string&);
|
||||||
|
~CMapFileSetFromInfFile();
|
||||||
void SetLoadAddress(ulonglong_t);
|
|
||||||
|
|
||||||
string m_strModuleName;
|
|
||||||
ulonglong_t m_ullLoadAddr;
|
|
||||||
string m_strEntryPoint;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CMapFile::CMapFile(const string& strFName)
|
CMapFileSetFromInfFile::CMapFileSetFromInfFile(const string& strFName)
|
||||||
: CInputFile(strFName)
|
{
|
||||||
|
static const char cszEfiFileName[] = "EFI_FILE_NAME";
|
||||||
|
|
||||||
|
ifstream ifs(strFName.c_str());
|
||||||
|
if (!ifs)
|
||||||
|
throw EFileNotFound(strFName);
|
||||||
|
|
||||||
|
string strFile;
|
||||||
|
getline(ifs, strFile, ifstream::traits_type::to_char_type(ifstream::traits_type::eof()));
|
||||||
|
strFile.erase(0, strFile.find("[files]"));
|
||||||
|
|
||||||
|
istringstream is(strFile);
|
||||||
|
string strTmp;
|
||||||
|
while (!!getline(is, strTmp))
|
||||||
|
{
|
||||||
|
string::size_type pos = strTmp.find(cszEfiFileName);
|
||||||
|
if (pos == string::npos)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
strTmp.erase(0, strTmp.find_first_not_of(" =", pos + sizeof(cszEfiFileName) - 1));
|
||||||
|
pos = strTmp.find_last_of("\\/");
|
||||||
|
string strId(
|
||||||
|
strTmp.begin() + pos + 1,
|
||||||
|
strTmp.begin() + strTmp.find('-', strTmp.find('-', strTmp.find('-', strTmp.find('-', strTmp.find('-') + 1) + 1) + 1) + 1)
|
||||||
|
);
|
||||||
|
strTmp.erase(pos + 1, strId.length() + 1);
|
||||||
|
strTmp.replace(strTmp.rfind('.'), string::npos, ".map");
|
||||||
|
|
||||||
|
istream *ifmaps = new ifstream(strTmp.c_str());
|
||||||
|
if (ifmaps && !!*ifmaps &&
|
||||||
|
!insert(value_type(CIdentity(strId), ifmaps)).second)
|
||||||
|
throw EDuplicatedFfsFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CMapFileSetFromInfFile::~CMapFileSetFromInfFile()
|
||||||
|
{
|
||||||
|
for (iterator i = begin(); i != end(); i++)
|
||||||
|
delete i->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CSymbolFromString : public ISymbol
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CSymbolFromString(const string&, bool = false);
|
||||||
|
void Relocate(UINT64);
|
||||||
|
};
|
||||||
|
|
||||||
|
CSymbolFromString::CSymbolFromString(const string& strSymbol, bool b)
|
||||||
|
{
|
||||||
|
bStatic = b;
|
||||||
|
|
||||||
|
istringstream is(strSymbol);
|
||||||
|
is >> strAddress >> strName >> getUINT64(ullRva) >> strFrom;
|
||||||
|
if (strFrom == "f")
|
||||||
|
{
|
||||||
|
bFunction = true;
|
||||||
|
is >> strFrom;
|
||||||
|
}
|
||||||
|
else bFunction = false;
|
||||||
|
if (!is)
|
||||||
|
throw EUnexpectedMapFile("Symbol line format");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSymbolFromString::Relocate(UINT64 ullDelta)
|
||||||
|
{
|
||||||
|
if (ullRva > 0)
|
||||||
|
ullRva += ullDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CModuleFromMap : public IModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CModuleFromMap(istream&);
|
||||||
|
~CModuleFromMap();
|
||||||
|
|
||||||
|
UINT64 BaseAddress() const;
|
||||||
|
UINT64 BaseAddress(UINT64);
|
||||||
|
const ISymbol *EntryPoint() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
UINT64 m_ullLoadAddress;
|
||||||
|
iterator m_iEntryPoint;
|
||||||
|
|
||||||
|
static pair<string, string::size_type> FindToken(istream&, const string&);
|
||||||
|
};
|
||||||
|
|
||||||
|
pair<string, string::size_type> CModuleFromMap::FindToken(istream& is, const string& strToken)
|
||||||
|
{
|
||||||
|
for (string strTmp; !!getline(is, strTmp);)
|
||||||
|
{
|
||||||
|
string::size_type pos = strTmp.find(strToken);
|
||||||
|
if (pos != string::npos)
|
||||||
|
return pair<string, string::size_type>(strTmp, pos);
|
||||||
|
}
|
||||||
|
throw EUnexpectedMapFile(strToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
CModuleFromMap::CModuleFromMap(istream& imaps)
|
||||||
{
|
{
|
||||||
static const char cszLoadAddr[] = "Preferred load address is";
|
static const char cszLoadAddr[] = "Preferred load address is";
|
||||||
static const char cszGlobal[] = "Address";
|
static const char cszGlobal[] = "Address";
|
||||||
static const char cszEntryPoint[] = "entry point at";
|
static const char cszEntryPoint[] = "entry point at";
|
||||||
static const char cszStatic[] = "Static symbols";
|
static const char cszStatic[] = "Static symbols";
|
||||||
|
|
||||||
string strALine;
|
pair<string, string::size_type> pairTmp;
|
||||||
|
istringstream iss;
|
||||||
|
|
||||||
GetLine(m_strModuleName);
|
getline(imaps, strName);
|
||||||
|
strName.erase(0, strName.find_first_not_of(' '));
|
||||||
|
|
||||||
while (!!GetLine(strALine) && strALine.compare(0, sizeof(cszLoadAddr) - 1, cszLoadAddr));
|
pairTmp = FindToken(imaps, cszLoadAddr);
|
||||||
if (!m_is)
|
iss.str(pairTmp.first.substr(pairTmp.second + sizeof(cszLoadAddr) - 1));
|
||||||
throw runtime_error(__FUNCTION__ ": Load Address not listed in map file");
|
iss >> getUINT64(m_ullLoadAddress);
|
||||||
|
|
||||||
istringstream is(strALine.substr(sizeof(cszLoadAddr) - 1));
|
pairTmp = FindToken(imaps, cszGlobal);
|
||||||
if (!(is >> hex >> m_ullLoadAddr))
|
while (!!getline(imaps, pairTmp.first) &&
|
||||||
throw runtime_error(__FUNCTION__ ": Unexpected Load Address format");
|
pairTmp.first.find(cszEntryPoint) == string::npos)
|
||||||
|
if (pairTmp.first.find_first_not_of(' ') != string::npos)
|
||||||
|
push_back(new CSymbolFromString(pairTmp.first));
|
||||||
|
|
||||||
while (!!GetLine(strALine) && strALine.compare(0, sizeof(cszGlobal) - 1, cszGlobal));
|
iss.str(pairTmp.first.substr(pairTmp.first.find(cszEntryPoint) + sizeof(cszEntryPoint) - 1));
|
||||||
if (!m_is)
|
iss.clear();
|
||||||
throw runtime_error(__FUNCTION__ ": Global symbols not found in map file");
|
string strEntryPoint;
|
||||||
|
iss >> strEntryPoint;
|
||||||
|
|
||||||
while (!!GetLine(strALine) && strALine.compare(0, sizeof(cszEntryPoint) - 1, cszEntryPoint))
|
pairTmp = FindToken(imaps, cszStatic);
|
||||||
push_back(CSymbol(strALine));
|
if (pairTmp.second)
|
||||||
if (!m_is)
|
while (!!getline(imaps, pairTmp.first))
|
||||||
throw runtime_error(__FUNCTION__ ": Entry Point not listed in map file");
|
if (pairTmp.first.find_first_not_of(' ') != string::npos)
|
||||||
|
push_back(new CSymbolFromString(pairTmp.first, true));
|
||||||
|
|
||||||
is.str(strALine.substr(strALine.find_first_not_of(' ', sizeof(cszEntryPoint) - 1)));
|
for (m_iEntryPoint = begin();
|
||||||
is.clear();
|
m_iEntryPoint != end() && (*m_iEntryPoint)->strAddress != strEntryPoint;
|
||||||
if (!getline(is, m_strEntryPoint))
|
m_iEntryPoint++);
|
||||||
throw runtime_error(__FUNCTION__ ": Unexpected Entry Point format");
|
if (m_iEntryPoint == end())
|
||||||
|
throw EUnexpectedMapFile("Entry point not found");
|
||||||
while (!!GetLine(strALine) && strALine.compare(0, sizeof(cszStatic) - 1, cszStatic));
|
|
||||||
while (!!GetLine(strALine))
|
|
||||||
push_back(CSymbol(strALine, true));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapFile::SetLoadAddress(ulonglong_t ullLoadAddr)
|
CModuleFromMap::~CModuleFromMap()
|
||||||
{
|
{
|
||||||
for (iterator i = begin(); i != end(); i++)
|
for (iterator i = begin(); i != end(); i++)
|
||||||
if (i->m_ullRva >= m_ullLoadAddr)
|
delete *i;
|
||||||
i->m_ullRva += ullLoadAddr - m_ullLoadAddr;
|
|
||||||
m_ullLoadAddr = ullLoadAddr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class COutputFile : public CObjRoot
|
UINT64 CModuleFromMap::BaseAddress(void) const
|
||||||
{
|
{
|
||||||
protected:
|
return m_ullLoadAddress;
|
||||||
COutputFile(ostream&);
|
}
|
||||||
ostream& m_os;
|
|
||||||
|
|
||||||
private:
|
UINT64 CModuleFromMap::BaseAddress(UINT64 ullNewBase)
|
||||||
COutputFile(const COutputFile&);
|
{
|
||||||
COutputFile& operator = (const COutputFile&);
|
ullNewBase -= m_ullLoadAddress;
|
||||||
};
|
for (iterator i = begin(); i != end(); i++)
|
||||||
|
(*i)->Relocate(ullNewBase);
|
||||||
|
m_ullLoadAddress += ullNewBase;
|
||||||
|
return m_ullLoadAddress - ullNewBase;
|
||||||
|
}
|
||||||
|
|
||||||
class CFvMapFile : public CObjRoot, public map<CIdentity, CMapFile*>
|
const ISymbol *CModuleFromMap::EntryPoint(void) const
|
||||||
|
{
|
||||||
|
return *m_iEntryPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CFvMap : public IFirmwareVolume
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CFvMapFile(const CIdAddressPathMap&);
|
CFvMap(IFfsSet*, IMapFileSet*);
|
||||||
~CFvMapFile(void);
|
~CFvMap();
|
||||||
|
|
||||||
friend ostream& operator << (ostream&, const CFvMapFile&);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Cleanup(void);
|
CFvMap(const CFvMap&);
|
||||||
};
|
};
|
||||||
|
|
||||||
CFvMapFile::CFvMapFile(const CIdAddressPathMap& idAddrPath)
|
CFvMap::CFvMap(IFfsSet *pFfsSet, IMapFileSet *pMapSet)
|
||||||
{
|
{
|
||||||
for (CIdAddressPathMap::const_iterator i = idAddrPath.begin(); i != idAddrPath.end(); i++)
|
for (IFfsSet::iterator i = pFfsSet->begin(); i != pFfsSet->end(); i++)
|
||||||
{
|
{
|
||||||
if (i->second.second == "*")
|
IMapFileSet::iterator j = pMapSet->find(i->first);
|
||||||
continue;
|
if (j != pMapSet->end())
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
pair<iterator, bool> r = insert(value_type(i->first,
|
|
||||||
new CMapFile(i->second.second.substr(0, i->second.second.rfind('.')) + ".map")));
|
|
||||||
r.first->second->SetLoadAddress(i->second.first);
|
|
||||||
}
|
|
||||||
catch (const runtime_error& e)
|
|
||||||
{
|
{
|
||||||
|
IModule *pModule = new CModuleFromMap(*j->second);
|
||||||
|
pModule->id = i->first;
|
||||||
|
pModule->BaseAddress(i->second);
|
||||||
|
push_back(pModule);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CFvMapFile::~CFvMapFile(void)
|
CFvMap::~CFvMap()
|
||||||
{
|
|
||||||
Cleanup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CFvMapFile::Cleanup(void)
|
|
||||||
{
|
{
|
||||||
for (iterator i = begin(); i != end(); i++)
|
for (iterator i = begin(); i != end(); i++)
|
||||||
delete i->second;
|
delete *i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool map_less(const CFvMapFile::const_iterator& l, const CFvMapFile::const_iterator& r)
|
class CFvMapFormatter : public CObjRoot
|
||||||
{
|
{
|
||||||
return l->second->m_ullLoadAddr < r->second->m_ullLoadAddr;
|
public:
|
||||||
}
|
CFvMapFormatter(const IFirmwareVolume *pFv) : m_pFv(pFv) {}
|
||||||
|
CFvMapFormatter(const CFvMapFormatter& r) : m_pFv(r.m_pFv) {}
|
||||||
|
|
||||||
ostream& operator << (ostream& os, const CFvMapFile& fvMap)
|
template <class _E, class _Tr>
|
||||||
|
friend basic_ostream<_E, _Tr>& operator << (basic_ostream<_E, _Tr>&, CFvMapFormatter);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static bool Less(const IModule*, const IModule*);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const IFirmwareVolume *m_pFv;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _E, class _Tr>
|
||||||
|
basic_ostream<_E, _Tr>& operator << (basic_ostream<_E, _Tr>& os, CFvMapFormatter fvMapFmt)
|
||||||
{
|
{
|
||||||
vector<CFvMapFile::const_iterator> rgIter;
|
vector<IModule*> rgMods(fvMapFmt.m_pFv->begin(), fvMapFmt.m_pFv->end());
|
||||||
rgIter.reserve(fvMap.size());
|
sort(rgMods.begin(), rgMods.end(), CFvMapFormatter::Less);
|
||||||
for (CFvMapFile::const_iterator i = fvMap.begin(); i != fvMap.end(); i++)
|
for (vector<IModule*>::iterator i = rgMods.begin(); i != rgMods.end(); i++)
|
||||||
rgIter.push_back(i);
|
|
||||||
sort(rgIter.begin(), rgIter.end(), map_less);
|
|
||||||
|
|
||||||
for (vector<CFvMapFile::const_iterator>::const_iterator i = rgIter.begin(); i != rgIter.end(); i++)
|
|
||||||
{
|
{
|
||||||
CMapFile::const_iterator j = (*i)->second->begin();
|
os << (*i)->strName << hex << " (BaseAddress=" << putUINT64((*i)->BaseAddress());
|
||||||
while (j != (*i)->second->end() && j->m_strAddress != (*i)->second->m_strEntryPoint) j++;
|
os << ", EntryPoint=" << hex << putUINT64((*i)->EntryPoint()->ullRva);
|
||||||
if (j == (*i)->second->end())
|
os << ", GUID=";
|
||||||
throw runtime_error(
|
(*i)->id.WriteId(os);
|
||||||
__FUNCTION__ ":Entry point not found for module " +
|
os << ")" << endl << endl;
|
||||||
(*i)->second->m_strModuleName);
|
|
||||||
|
|
||||||
os << hex
|
for (IModule::iterator j = (*i)->begin(); j != (*i)->end(); j++)
|
||||||
<< (*i)->second->m_strModuleName
|
{
|
||||||
<< " (EntryPoint=" << j->m_ullRva
|
os << hex << " " << setw(16) << setfill('0') << putUINT64((*j)->ullRva);
|
||||||
<< ", BaseAddress=" << (*i)->second->m_ullLoadAddr
|
os << ((*j)->bFunction ? " F" : " ")
|
||||||
<< ", GUID=" << (*i)->first
|
<< ((*j)->bStatic ? "S " : " ")
|
||||||
<< ")" << endl << endl;
|
<< (*j)->strName << endl;
|
||||||
|
}
|
||||||
for (j = (*i)->second->begin(); j != (*i)->second->end(); j++)
|
|
||||||
os << " " << *j << endl;
|
|
||||||
|
|
||||||
os << endl << endl;
|
os << endl << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
class CGenFvMapUsage : public invalid_argument
|
bool CFvMapFormatter::Less(const IModule *pModL, const IModule *pModR)
|
||||||
|
{
|
||||||
|
return pModL->BaseAddress() < pModR->BaseAddress();
|
||||||
|
}
|
||||||
|
|
||||||
|
class CApplication : public CObjRoot
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CGenFvMapUsage(void) : invalid_argument(s_szUsage)
|
CApplication(int, char**);
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static const char s_szUsage[];
|
|
||||||
};
|
|
||||||
|
|
||||||
const char CGenFvMapUsage::s_szUsage[] = "Usage: GenFvMap <LOG> <MAP>";
|
|
||||||
|
|
||||||
class CGenFvMapApp : public CObjRoot
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CGenFvMapApp(int, char *[]);
|
|
||||||
~CGenFvMapApp(void);
|
|
||||||
|
|
||||||
int Run(void);
|
int Run(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_cArgc;
|
char **m_ppszArg;
|
||||||
char **m_ppszArgv;
|
private:
|
||||||
|
CApplication(const CApplication&);
|
||||||
};
|
};
|
||||||
|
|
||||||
CGenFvMapApp::CGenFvMapApp(int cArgc, char *ppszArgv[])
|
CApplication::CApplication(int cArg, char *ppszArg[])
|
||||||
: m_cArgc(cArgc)
|
: m_ppszArg(ppszArg)
|
||||||
, m_ppszArgv(ppszArgv)
|
|
||||||
{
|
{
|
||||||
if (cArgc != 3)
|
if (cArg != 4)
|
||||||
throw CGenFvMapUsage();
|
throw EUsage();
|
||||||
}
|
}
|
||||||
|
|
||||||
CGenFvMapApp::~CGenFvMapApp(void)
|
int CApplication::Run(void)
|
||||||
{
|
{
|
||||||
}
|
CFfsSetFromLogFile ffsSet(m_ppszArg[1]);
|
||||||
|
CMapFileSetFromInfFile mapSet(m_ppszArg[2]);
|
||||||
int CGenFvMapApp::Run(void)
|
ofstream ofs(m_ppszArg[3]);
|
||||||
{
|
CFvMap fvMap(&ffsSet, &mapSet);
|
||||||
ifstream isLog(m_ppszArgv[1]);
|
ofs << CFvMapFormatter(&fvMap);
|
||||||
CIdAddressPathMap idAddrPath(isLog);
|
|
||||||
CFvMapFile fvMap(idAddrPath);
|
|
||||||
|
|
||||||
ofstream osMap(m_ppszArgv[2], ios_base::out | ios_base::trunc);
|
|
||||||
osMap << fvMap;
|
|
||||||
|
|
||||||
if (!osMap)
|
|
||||||
throw runtime_error(__FUNCTION__ ": Error writing output file");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,7 +649,7 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
CGenFvMapApp app(argc, argv);
|
CApplication app(argc, argv);
|
||||||
return app.Run();
|
return app.Run();
|
||||||
}
|
}
|
||||||
catch (const exception& e)
|
catch (const exception& e)
|
||||||
@ -471,3 +658,9 @@ int main(int argc, char *argv[])
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _DDK3790x1830_WORKAROUND
|
||||||
|
extern "C" void __fastcall __security_check_cookie(int)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -104,27 +104,22 @@ Returns:
|
|||||||
// Set utility name for error/warning reporting purposes.
|
// Set utility name for error/warning reporting purposes.
|
||||||
//
|
//
|
||||||
SetUtilityName (UTILITY_NAME);
|
SetUtilityName (UTILITY_NAME);
|
||||||
|
|
||||||
if (argc == 1) {
|
|
||||||
Usage();
|
|
||||||
return STATUS_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0) ||
|
if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0) ||
|
||||||
(strcmp(argv[1], "-?") == 0) || (strcmp(argv[1], "/?") == 0)) {
|
(strcmp(argv[1], "-?") == 0) || (strcmp(argv[1], "/?") == 0)) {
|
||||||
Usage();
|
Usage();
|
||||||
return STATUS_ERROR;
|
return STATUS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((strcmp(argv[1], "-V") == 0) || (strcmp(argv[1], "--version") == 0)) {
|
if ((strcmp(argv[1], "-V") == 0) || (strcmp(argv[1], "--version") == 0)) {
|
||||||
Version();
|
Version();
|
||||||
return STATUS_ERROR;
|
return STATUS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verify the correct number of arguments
|
// Verify the correct number of arguments
|
||||||
//
|
//
|
||||||
if (argc != MAX_ARGS) {
|
if (argc < MAX_ARGS) {
|
||||||
Usage ();
|
Usage ();
|
||||||
return STATUS_ERROR;
|
return STATUS_ERROR;
|
||||||
}
|
}
|
||||||
@ -147,7 +142,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Parse the command line arguments
|
// Parse the command line arguments
|
||||||
//
|
//
|
||||||
for (Index = 1; Index < MAX_ARGS; Index += 2) {
|
for (Index = 1; Index < argc; Index += 2) {
|
||||||
//
|
//
|
||||||
// Make sure argument pair begin with - or /
|
// Make sure argument pair begin with - or /
|
||||||
//
|
//
|
||||||
@ -293,7 +288,7 @@ Returns:
|
|||||||
// Open the log file
|
// Open the log file
|
||||||
//
|
//
|
||||||
strcat (InputFileName, ".log");
|
strcat (InputFileName, ".log");
|
||||||
LogFile = fopen (InputFileName, "a");
|
LogFile = fopen (InputFileName, "w");
|
||||||
if (LogFile == NULL) {
|
if (LogFile == NULL) {
|
||||||
Error (NULL, 0, 0, InputFileName, "could not append to log file");
|
Error (NULL, 0, 0, InputFileName, "could not append to log file");
|
||||||
}
|
}
|
||||||
@ -552,7 +547,7 @@ Returns:
|
|||||||
--*/
|
--*/
|
||||||
{
|
{
|
||||||
Version();
|
Version();
|
||||||
|
|
||||||
printf (
|
printf (
|
||||||
"Usage: %s -I InputFileName -O OutputFileName -B BaseAddress [-F InputFvInfName]\n",
|
"Usage: %s -I InputFileName -O OutputFileName -B BaseAddress [-F InputFvInfName]\n",
|
||||||
UTILITY_NAME
|
UTILITY_NAME
|
||||||
@ -612,7 +607,7 @@ Returns:
|
|||||||
EFI_FFS_FILE_TAIL TailValue;
|
EFI_FFS_FILE_TAIL TailValue;
|
||||||
EFI_PHYSICAL_ADDRESS *BaseToUpdate;
|
EFI_PHYSICAL_ADDRESS *BaseToUpdate;
|
||||||
EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;
|
EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verify input parameters
|
// Verify input parameters
|
||||||
@ -687,14 +682,14 @@ Returns:
|
|||||||
PeHdr = (EFI_IMAGE_NT_HEADERS *)((UINTN)ImageContext.ImageAddress + ImageContext.PeCoffHeaderOffset);
|
PeHdr = (EFI_IMAGE_NT_HEADERS *)((UINTN)ImageContext.ImageAddress + ImageContext.PeCoffHeaderOffset);
|
||||||
if (PeHdr->OptionalHeader.SectionAlignment != PeHdr->OptionalHeader.FileAlignment) {
|
if (PeHdr->OptionalHeader.SectionAlignment != PeHdr->OptionalHeader.FileAlignment) {
|
||||||
//
|
//
|
||||||
// Nor XIP module can be ignored.
|
// Nor XIP module can be ignored.
|
||||||
//
|
//
|
||||||
if ((Flags & 1) == 0) {
|
if ((Flags & 1) == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Error (NULL, 0, 0, "Section-Alignment and File-Alignment does not match", FileGuidString);
|
Error (NULL, 0, 0, "Section-Alignment and File-Alignment does not match", FileGuidString);
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Update CodeView and PdbPointer in ImageContext
|
// Update CodeView and PdbPointer in ImageContext
|
||||||
@ -703,8 +698,8 @@ Returns:
|
|||||||
ImageContext.ImageAddress +
|
ImageContext.ImageAddress +
|
||||||
ImageContext.DebugDirectoryEntryRva
|
ImageContext.DebugDirectoryEntryRva
|
||||||
);
|
);
|
||||||
ImageContext.CodeView = (VOID *)(UINTN)(
|
ImageContext.CodeView = (VOID *)(UINTN)(
|
||||||
ImageContext.ImageAddress +
|
ImageContext.ImageAddress +
|
||||||
DebugEntry->RVA
|
DebugEntry->RVA
|
||||||
);
|
);
|
||||||
switch (*(UINT32 *) ImageContext.CodeView) {
|
switch (*(UINT32 *) ImageContext.CodeView) {
|
||||||
@ -803,10 +798,9 @@ Returns:
|
|||||||
//
|
//
|
||||||
fprintf (
|
fprintf (
|
||||||
LogFile,
|
LogFile,
|
||||||
"%s %016I64X %s\n",
|
"%s %016I64X\n",
|
||||||
FileGuidString,
|
FileGuidString,
|
||||||
ImageContext.DestinationAddress,
|
ImageContext.DestinationAddress
|
||||||
ImageContext.PdbPointer == NULL ? "*" : ImageContext.PdbPointer
|
|
||||||
);
|
);
|
||||||
*BaseToUpdate += EFI_SIZE_TO_PAGES (ImageContext.ImageSize) * EFI_PAGE_SIZE;
|
*BaseToUpdate += EFI_SIZE_TO_PAGES (ImageContext.ImageSize) * EFI_PAGE_SIZE;
|
||||||
|
|
||||||
@ -855,7 +849,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Now process TE sections
|
// Now process TE sections
|
||||||
//
|
//
|
||||||
@ -921,7 +915,7 @@ Returns:
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Reloacate TeImage
|
// Reloacate TeImage
|
||||||
//
|
//
|
||||||
ImageContext.DestinationAddress = XipBase + (UINTN) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) \
|
ImageContext.DestinationAddress = XipBase + (UINTN) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) \
|
||||||
- TEImageHeader->StrippedSize - (UINTN) FfsFile;
|
- TEImageHeader->StrippedSize - (UINTN) FfsFile;
|
||||||
Status = PeCoffLoaderRelocateImage (&ImageContext);
|
Status = PeCoffLoaderRelocateImage (&ImageContext);
|
||||||
@ -963,13 +957,12 @@ Returns:
|
|||||||
|
|
||||||
fprintf (
|
fprintf (
|
||||||
LogFile,
|
LogFile,
|
||||||
"%s %016I64X %s\n",
|
"%s %016I64X\n",
|
||||||
FileGuidString,
|
FileGuidString,
|
||||||
ImageContext.DestinationAddress,
|
ImageContext.DestinationAddress
|
||||||
ImageContext.PdbPointer == NULL ? "*" : ImageContext.PdbPointer
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,12 +14,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<import file="UserExtension.xml" optional="true"/>
|
<import file="UserExtension.xml" optional="true"/>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Macro for intialize some properties. This Macro build will be called before source file build.
|
Macro for intialize some properties. This Macro build will be called before source file build.
|
||||||
-->
|
-->
|
||||||
<macrodef name="Build_Init">
|
<macrodef name="Build_Init">
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<var name="OBJECTS" value="" />
|
<var name="OBJECTS" value="" />
|
||||||
<var name="SDB_FILES" value="" />
|
<var name="SDB_FILES" value="" />
|
||||||
@ -35,12 +35,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</not>
|
</not>
|
||||||
</and>
|
</and>
|
||||||
<then>
|
<then>
|
||||||
<makedeps DepsFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"
|
<makedeps DepsFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"
|
||||||
TargetFile="${DEST_DIR_OUTPUT}/AutoGen.h.gch">
|
TargetFile="${DEST_DIR_OUTPUT}/AutoGen.h.gch">
|
||||||
<input file="${DEST_DIR_DEBUG}/AutoGen.h"/>
|
<input file="${DEST_DIR_DEBUG}/AutoGen.h"/>
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
</makedeps>
|
</makedeps>
|
||||||
|
|
||||||
<OnDependency>
|
<OnDependency>
|
||||||
<sourcefiles>
|
<sourcefiles>
|
||||||
<file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
|
<file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
|
||||||
@ -48,12 +48,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<targetfiles>
|
<targetfiles>
|
||||||
<file Name="${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>
|
<file Name="${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>
|
||||||
</targetfiles>
|
</targetfiles>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<!-- Generate pre-compiled header -->
|
<!-- Generate pre-compiled header -->
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="CC" cmd="${PCH}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
|
<command type="CC" cmd="${PCH}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
|
||||||
outputFile="${DEST_DIR_OUTPUT}/AutoGen.h.obj" dpath="${CC_DPATH}" libpath="${CC_LIBPATH}"
|
outputFile="${DEST_DIR_OUTPUT}/AutoGen.h.obj" dpath="${CC_DPATH}" libpath="${CC_LIBPATH}"
|
||||||
include="${CC_INCLUDEPATH}">
|
include="${CC_INCLUDEPATH}">
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
<argument value="${PCH_FLAGS}"/>
|
<argument value="${PCH_FLAGS}"/>
|
||||||
@ -101,10 +101,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<attribute name="FILEPATH"/>
|
<attribute name="FILEPATH"/>
|
||||||
<attribute name="FILENAME"/>
|
<attribute name="FILENAME"/>
|
||||||
<attribute name="FILEEXT" default="c"/>
|
<attribute name="FILEEXT" default="c"/>
|
||||||
|
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<var name="FILE_BASENAME" value="@{FILENAME}" />
|
<var name="FILE_BASENAME" value="@{FILENAME}" />
|
||||||
<var name="FILE_PATH" value="@{FILEPATH}" />
|
<var name="FILE_PATH" value="@{FILEPATH}" />
|
||||||
@ -128,7 +128,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<sequential>
|
<sequential>
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
|
<command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
|
||||||
outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${CC_DPATH}"
|
outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${CC_DPATH}"
|
||||||
libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}">
|
libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}">
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
<argument value="${CC_FLAGS}"/>
|
<argument value="${CC_FLAGS}"/>
|
||||||
@ -213,7 +213,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<var name="FILE_BASENAME" value="@{FILENAME}" />
|
<var name="FILE_BASENAME" value="@{FILENAME}" />
|
||||||
@ -246,13 +246,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
|
|
||||||
<gendepex inputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i" outputFile="${DEST_DIR_OUTPUT}/${BASE_NAME}.depex"/>
|
<gendepex inputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i" outputFile="${DEST_DIR_OUTPUT}/${BASE_NAME}.depex"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<macrodef name="Build_ASM">
|
<macrodef name="Build_ASM">
|
||||||
<attribute name="FILEPATH"/>
|
<attribute name="FILEPATH"/>
|
||||||
<attribute name="FILENAME"/>
|
<attribute name="FILENAME"/>
|
||||||
@ -260,8 +260,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<!-- Dispath ASM file, there are three type.
|
<!-- Dispath ASM file, there are three type.
|
||||||
asm - Build_Assembly
|
asm - Build_Assembly
|
||||||
S - Build_Gcc_Assembly
|
S - Build_Gcc_Assembly
|
||||||
s - Build_Ipf_Assembly -->
|
s - Build_Ipf_Assembly -->
|
||||||
@ -295,7 +295,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</if>
|
</if>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
IA32/x64 Assembly
|
IA32/x64 Assembly
|
||||||
-->
|
-->
|
||||||
@ -329,7 +329,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}"
|
<command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}"
|
||||||
dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
|
dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
|
||||||
<EXTRA.INC.1/>
|
<EXTRA.INC.1/>
|
||||||
<argument value="${PP_FLAGS}"/>
|
<argument value="${PP_FLAGS}"/>
|
||||||
@ -356,10 +356,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${ASM_DPATH}"
|
outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${ASM_DPATH}"
|
||||||
libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
|
libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
|
||||||
<EXTRA.INC.1/>
|
<EXTRA.INC.1/>
|
||||||
|
|
||||||
<argument value="${ASM_FLAGS}"/>
|
<argument value="${ASM_FLAGS}"/>
|
||||||
<EXTRA.ARG.1/>
|
<EXTRA.ARG.1/>
|
||||||
|
|
||||||
<fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
|
<fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
@ -415,10 +415,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${ASM_DPATH}"
|
outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${ASM_DPATH}"
|
||||||
libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
|
libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
|
||||||
<EXTRA.INC.1/>
|
<EXTRA.INC.1/>
|
||||||
|
|
||||||
<argument value="${ASM_FLAGS}"/>
|
<argument value="${ASM_FLAGS}"/>
|
||||||
<EXTRA.ARG.1/>
|
<EXTRA.ARG.1/>
|
||||||
|
|
||||||
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
@ -468,14 +468,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="PP" cmd="${APP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${APP_FAMILY}"
|
<command type="PP" cmd="${APP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${APP_FAMILY}"
|
||||||
dpath="${APP_DPATH}" libpath="${APP_LIBPATH}" include="${APP_INCLUDEPATH}">
|
dpath="${APP_DPATH}" libpath="${APP_LIBPATH}" include="${APP_INCLUDEPATH}">
|
||||||
<EXTRA.INC.1/>
|
<EXTRA.INC.1/>
|
||||||
<argument value="${APP_FLAGS}"/>
|
<argument value="${APP_FLAGS}"/>
|
||||||
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
|
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"
|
<command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"
|
||||||
includepathDelimiter="-I" outputDelimiter="-o" dpath="${ASM_DPATH}"
|
includepathDelimiter="-I" outputDelimiter="-o" dpath="${ASM_DPATH}"
|
||||||
@ -503,7 +503,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Assembly the preprocessed IPF assembly code
|
Assembly the preprocessed IPF assembly code
|
||||||
-->
|
-->
|
||||||
<macrodef name="Build_IPF_PP_Code">
|
<macrodef name="Build_IPF_PP_Code">
|
||||||
@ -516,7 +516,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
|
<mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
|
||||||
|
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="ASM" includepathDelimiter="-I" dpath="${ASM_DPATH}"
|
<command type="ASM" includepathDelimiter="-I" dpath="${ASM_DPATH}"
|
||||||
libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
|
libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
|
||||||
@ -524,25 +524,25 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<includepath path="${MODULE_DIR}"/>
|
<includepath path="${MODULE_DIR}"/>
|
||||||
<includepath path="${MODULE_DIR}/${ARCH}"/>
|
<includepath path="${MODULE_DIR}/${ARCH}"/>
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
|
|
||||||
<argument value="${ASM_FLAGS}"/>
|
<argument value="${ASM_FLAGS}"/>
|
||||||
<EXTRA.ARG/>
|
<EXTRA.ARG/>
|
||||||
<OutputFile File="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
|
<OutputFile File="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
|
||||||
|
|
||||||
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Library
|
Library
|
||||||
-->
|
-->
|
||||||
<macrodef name="Build_Library">
|
<macrodef name="Build_Library">
|
||||||
<attribute name="FILENAME" />
|
<attribute name="FILENAME" />
|
||||||
<attribute name="FILEEXT" default="obj"/>
|
<attribute name="FILEEXT" default="obj"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<var name="FILE_BASENAME" value="@{FILENAME}" />
|
<var name="FILE_BASENAME" value="@{FILENAME}" />
|
||||||
<var name="FILE_PATH" value="." />
|
<var name="FILE_PATH" value="." />
|
||||||
@ -641,7 +641,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<targetfiles>
|
<targetfiles>
|
||||||
<file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
|
<file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
|
||||||
</targetfiles>
|
</targetfiles>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<strgather commandtype="scan" outputdatabase="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb" verbose="read">
|
<strgather commandtype="scan" outputdatabase="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb" verbose="read">
|
||||||
<skipext name=".uni"/>
|
<skipext name=".uni"/>
|
||||||
@ -661,7 +661,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.hpk"/>
|
<file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.hpk"/>
|
||||||
<file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>
|
<file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>
|
||||||
</targetfiles>
|
</targetfiles>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<strgather basename="@{FILENAME}Strings" commandtype="dump"
|
<strgather basename="@{FILENAME}Strings" commandtype="dump"
|
||||||
outputdefines="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}StrDefs.h"
|
outputdefines="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}StrDefs.h"
|
||||||
@ -680,7 +680,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<targetfiles>
|
<targetfiles>
|
||||||
<file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Strings.obj"/>
|
<file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Strings.obj"/>
|
||||||
</targetfiles>
|
</targetfiles>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
|
<command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
|
||||||
@ -738,39 +738,39 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</targetfiles>
|
</targetfiles>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<!-- if "TOOLCHIAN FAMILY" is "GCC", it should point the ouput file for preprocess compiler -->
|
<!-- if "TOOLCHIAN FAMILY" is "GCC", it should point the ouput file for preprocess compiler -->
|
||||||
<if>
|
<if>
|
||||||
<equals arg1="${CC_FAMILY}" arg2="GCC"/>
|
<equals arg1="${CC_FAMILY}" arg2="GCC"/>
|
||||||
<then>
|
<then>
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}"
|
<command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}"
|
||||||
dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
|
dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
|
||||||
<argument value="${VFRPP_FLAGS} -o ${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
|
<argument value="${VFRPP_FLAGS} -o ${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
|
||||||
<!-- Output file of the preprocess -->
|
<!-- Output file of the preprocess -->
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}"
|
<command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}"
|
||||||
dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
|
dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
|
||||||
<argument value="${VFRPP_FLAGS}"/>
|
<argument value="${VFRPP_FLAGS}"/>
|
||||||
<!-- Output file of the preprocess -->
|
<!-- Output file of the preprocess -->
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<vfrcompile createIfrBinFile="on" createListFile="on" outPutDir="${DEST_DIR_DEBUG}/@{FILEPATH}" vfrFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i">
|
<vfrcompile createIfrBinFile="on" createListFile="on" outPutDir="${DEST_DIR_DEBUG}/@{FILEPATH}" vfrFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i">
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
</vfrcompile>
|
</vfrcompile>
|
||||||
|
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}"
|
<command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}"
|
||||||
includepathDelimiter="-I" family="${CC_FAMILY}" dpath="${CC_DPATH}"
|
includepathDelimiter="-I" family="${CC_FAMILY}" dpath="${CC_DPATH}"
|
||||||
libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}"
|
libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}"
|
||||||
outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" >
|
outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" >
|
||||||
@ -805,7 +805,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<OnDependency>
|
<OnDependency>
|
||||||
<sourcefiles>
|
<sourcefiles>
|
||||||
@ -814,7 +814,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<targetfiles>
|
<targetfiles>
|
||||||
<file name="${DEST_DIR_OUTPUT}/@{FILENAME}.cat"/>
|
<file name="${DEST_DIR_OUTPUT}/@{FILENAME}.cat"/>
|
||||||
</targetfiles>
|
</targetfiles>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<exec dir="${DEST_DIR_OUTPUT}" executable="${ASM}" failonerror="true">
|
<exec dir="${DEST_DIR_OUTPUT}" executable="${ASM}" failonerror="true">
|
||||||
<arg line="/nologo /omf ${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT} /Bl${ASMLINK} ${ASMLINK_FLAGS}"/>
|
<arg line="/nologo /omf ${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT} /Bl${ASMLINK} ${ASMLINK_FLAGS}"/>
|
||||||
@ -838,7 +838,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<mkdir dir="${DEST_DIR_OUTPUT}"/>
|
<mkdir dir="${DEST_DIR_OUTPUT}"/>
|
||||||
|
|
||||||
@ -852,10 +852,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}" family="${PP_FAMILY}"
|
<command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}" family="${PP_FAMILY}"
|
||||||
dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
|
dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
|
||||||
<argument value="${APP_FLAGS}"/>
|
<argument value="${APP_FLAGS}"/>
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
<fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
@ -875,11 +875,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</if>
|
</if>
|
||||||
|
|
||||||
<EFI_SECTION_RAW FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="aml"/>
|
<EFI_SECTION_RAW FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="aml"/>
|
||||||
|
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Build Asl table c file
|
Build Asl table c file
|
||||||
@ -891,7 +891,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<mkdir dir="${DEST_DIR_OUTPUT}"/>
|
<mkdir dir="${DEST_DIR_OUTPUT}"/>
|
||||||
|
|
||||||
@ -907,7 +907,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
|
<command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
|
||||||
outputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.obj" dpath="${CC_DPATH}"
|
outputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.obj" dpath="${CC_DPATH}"
|
||||||
libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}">
|
libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}">
|
||||||
<EXTRA.INC/>
|
<EXTRA.INC/>
|
||||||
<argument value="${CC_FLAGS}"/>
|
<argument value="${CC_FLAGS}"/>
|
||||||
@ -917,20 +917,20 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</cc>
|
</cc>
|
||||||
|
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="DLINK" cmd="${DLINK}" family="${DLINK_FAMILY}"
|
<command type="DLINK" cmd="${DLINK}" family="${DLINK_FAMILY}"
|
||||||
outputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.exe" dpath="${DLINK_DPATH}" >
|
outputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.exe" dpath="${DLINK_DPATH}" >
|
||||||
<argument value="${SLINK_FLAGS}"/>
|
<argument value="${SLINK_FLAGS}"/>
|
||||||
<fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILENAME}.obj"/>
|
<fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILENAME}.obj"/>
|
||||||
</command>
|
</command>
|
||||||
</cc>
|
</cc>
|
||||||
|
|
||||||
<genacpitable inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.exe" outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.acpi" />
|
<genacpitable inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.exe" outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.acpi" />
|
||||||
|
|
||||||
<EFI_SECTION_RAW FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="acpi"/>
|
<EFI_SECTION_RAW FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="acpi"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
<!--
|
<!--
|
||||||
Build ACPI Bin File
|
Build ACPI Bin File
|
||||||
-->
|
-->
|
||||||
@ -941,7 +941,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<mkdir dir="${DEST_DIR_OUTPUT}"/>
|
<mkdir dir="${DEST_DIR_OUTPUT}"/>
|
||||||
|
|
||||||
@ -955,7 +955,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" tofile="${DEST_DIR_OUTPUT}/@{FILENAME}.acpi" />
|
<copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" tofile="${DEST_DIR_OUTPUT}/@{FILENAME}.acpi" />
|
||||||
|
|
||||||
<exec executable="attrib">
|
<exec executable="attrib">
|
||||||
<arg line="-r ${DEST_DIR_OUTPUT}/@{FILENAME}.acpi"/>
|
<arg line="-r ${DEST_DIR_OUTPUT}/@{FILENAME}.acpi"/>
|
||||||
</exec>
|
</exec>
|
||||||
@ -964,8 +964,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
DUMMY - for skipping the source file which should not be built
|
DUMMY - for skipping the source file which should not be built
|
||||||
-->
|
-->
|
||||||
@ -1020,7 +1020,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<!-- Link the temporary lib file with dependent libraries -->
|
<!-- Link the temporary lib file with dependent libraries -->
|
||||||
<cc userdefine="on">
|
<cc userdefine="on">
|
||||||
<command type="DLINK" cmd="${DLINK}" family="${DLINK_FAMILY}"
|
<command type="DLINK" cmd="${DLINK}" family="${DLINK_FAMILY}"
|
||||||
outputFile="${DEST_DIR_DEBUG}/@{FILENAME}.dll" dpath="${DLINK_DPATH}"
|
outputFile="${DEST_DIR_DEBUG}/@{FILENAME}.dll" dpath="${DLINK_DPATH}"
|
||||||
libpath="${DLINK_LIBPATH}" include="${DLINK_INCLUDEPATH}">
|
libpath="${DLINK_LIBPATH}" include="${DLINK_INCLUDEPATH}">
|
||||||
<argument value="${DLINK_FLAGS}"/>
|
<argument value="${DLINK_FLAGS}"/>
|
||||||
<libset libs="${DEST_DIR_OUTPUT}/@{FILENAME}Local.lib ${LIBS} ${DLINK_SPATH}"/>
|
<libset libs="${DEST_DIR_OUTPUT}/@{FILENAME}Local.lib ${LIBS} ${DLINK_SPATH}"/>
|
||||||
@ -1029,12 +1029,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</cc>
|
</cc>
|
||||||
|
|
||||||
<!-- Convert the dll file to efi file -->
|
<!-- Convert the dll file to efi file -->
|
||||||
<fwimage componentType="${MODULE_TYPE}" outImage="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"
|
<fwimage componentType="${MODULE_TYPE}" outImage="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"
|
||||||
peImage="${DEST_DIR_DEBUG}/@{FILENAME}.dll" time="0"/>
|
peImage="${DEST_DIR_DEBUG}/@{FILENAME}.dll" time="0"/>
|
||||||
|
|
||||||
<!-- Copy the efi file to BIN and OUTPUT directory -->
|
<!-- Copy the efi file to BIN and OUTPUT directory -->
|
||||||
<copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${BIN_DIR}/@{FILENAME}.efi" />
|
<copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${BIN_DIR}/@{FILENAME}.efi" />
|
||||||
<copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${DEST_DIR_DEBUG}/@{FILENAME}.efi" />
|
<copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${DEST_DIR_DEBUG}/@{FILENAME}.efi" />
|
||||||
|
<copy file="${DEST_DIR_DEBUG}/@{FILENAME}.map" tofile="${BIN_DIR}/@{FILENAME}.map" />
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
</sequential>
|
</sequential>
|
||||||
@ -1052,11 +1053,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
<copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
||||||
tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>
|
tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Microcode
|
Microcode
|
||||||
-->
|
-->
|
||||||
@ -1072,24 +1073,24 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<mkdir dir="${TARGET_DIR}/Microcode"/>
|
<mkdir dir="${TARGET_DIR}/Microcode"/>
|
||||||
<flashmap MCIFile="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" MCOFILE="${TARGET_DIR}/Microcode/@{FILENAME}.bin"/>
|
<flashmap MCIFile="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" MCOFILE="${TARGET_DIR}/Microcode/@{FILENAME}.bin"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Graphics (bmp, ...)
|
Graphics (bmp, ...)
|
||||||
-->
|
-->
|
||||||
<macrodef name="Build_BMP">
|
<macrodef name="Build_BMP">
|
||||||
<attribute name="FILEPATH"/>
|
<attribute name="FILEPATH"/>
|
||||||
<attribute name="FILENAME"/>
|
<attribute name="FILENAME"/>
|
||||||
<attribute name="FILEEXT" default="bmp"/>
|
<attribute name="FILEEXT" default="bmp"/>
|
||||||
|
|
||||||
<element name="EXTRA.INC" optional="yes"/>
|
<element name="EXTRA.INC" optional="yes"/>
|
||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
<copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
||||||
tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>
|
tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
build EFI file
|
build EFI file
|
||||||
@ -1103,13 +1104,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<element name="EXTRA.ARG" optional="yes"/>
|
<element name="EXTRA.ARG" optional="yes"/>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<mkdir dir="${MODULE_DIR}/@{FILEPATH}" />
|
<mkdir dir="${MODULE_DIR}/@{FILEPATH}" />
|
||||||
<copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
<copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
||||||
tofile="${DEST_DIR_OUTPUT}/${BASE_NAME}.efi"/>
|
tofile="${DEST_DIR_OUTPUT}/${BASE_NAME}.efi"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Build macro for Apriori
|
Build macro for Apriori
|
||||||
-->
|
-->
|
||||||
<macrodef name="Build_Apriori">
|
<macrodef name="Build_Apriori">
|
||||||
@ -1120,15 +1121,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<mkdir dir="${FV_DIR}/Apriori" />
|
<mkdir dir="${FV_DIR}/Apriori" />
|
||||||
<gensection inputfile="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
<gensection inputfile="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
||||||
outputfile="${FV_DIR}/Apriori/@{FILENAME}.sec"
|
outputfile="${FV_DIR}/Apriori/@{FILENAME}.sec"
|
||||||
sectiontype="EFI_SECTION_RAW"/>
|
sectiontype="EFI_SECTION_RAW"/>
|
||||||
|
|
||||||
<genffsfile BaseName="@{FILENAME}" ffsATTRIBCHECKSUM="TRUE" ffsFILETYPE="EFI_FV_FILETYPE_FREEFORM"
|
<genffsfile BaseName="@{FILENAME}" ffsATTRIBCHECKSUM="TRUE" ffsFILETYPE="EFI_FV_FILETYPE_FREEFORM"
|
||||||
fileGuid="@{GUID}" moduleType="BASE" outputDir="${FV_DIR}">
|
fileGuid="@{GUID}" moduleType="BASE" outputDir="${FV_DIR}">
|
||||||
<sectFile fileName="${FV_DIR}/Apriori/@{FILENAME}.sec"/>
|
<sectFile fileName="${FV_DIR}/Apriori/@{FILENAME}.sec"/>
|
||||||
</genffsfile>
|
</genffsfile>
|
||||||
|
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
@ -1160,8 +1161,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<PRE.PROCESS/>
|
<PRE.PROCESS/>
|
||||||
|
|
||||||
<genteimage Dump="false" Verbose="false" OutputDir="" OutputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" InputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
|
<genteimage Dump="false" Verbose="false" OutputDir="" OutputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" InputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
|
||||||
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.te"
|
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.te"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.tes"
|
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.tes"
|
||||||
sectiontype="EFI_SECTION_TE"/>
|
sectiontype="EFI_SECTION_TE"/>
|
||||||
|
|
||||||
<POST.PROCESS/>
|
<POST.PROCESS/>
|
||||||
@ -1193,10 +1194,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<sequential>
|
<sequential>
|
||||||
<PRE.PROCESS/>
|
<PRE.PROCESS/>
|
||||||
|
|
||||||
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"
|
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.pe32"
|
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.pe32"
|
||||||
sectiontype="EFI_SECTION_PE32"/>
|
sectiontype="EFI_SECTION_PE32"/>
|
||||||
|
|
||||||
<POST.PROCESS/>
|
<POST.PROCESS/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
@ -1223,7 +1224,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<then>
|
<then>
|
||||||
<PRE.PROCESS/>
|
<PRE.PROCESS/>
|
||||||
<gensection outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ver"
|
<gensection outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ver"
|
||||||
versionnum="@{VERSION}"
|
versionnum="@{VERSION}"
|
||||||
sectiontype="EFI_SECTION_VERSION"/>
|
sectiontype="EFI_SECTION_VERSION"/>
|
||||||
<POST.PROCESS/>
|
<POST.PROCESS/>
|
||||||
@ -1253,7 +1254,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<then>
|
<then>
|
||||||
<PRE.PROCESS/>
|
<PRE.PROCESS/>
|
||||||
<gensection interfacestring="@{UI}"
|
<gensection interfacestring="@{UI}"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ui"
|
outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ui"
|
||||||
sectiontype="EFI_SECTION_USER_INTERFACE"/>
|
sectiontype="EFI_SECTION_USER_INTERFACE"/>
|
||||||
<POST.PROCESS/>
|
<POST.PROCESS/>
|
||||||
</then>
|
</then>
|
||||||
@ -1286,8 +1287,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<file name="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
|
<file name="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
|
||||||
</targetfiles>
|
</targetfiles>
|
||||||
<sequential>
|
<sequential>
|
||||||
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"
|
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"
|
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"
|
||||||
sectiontype="EFI_SECTION_DXE_DEPEX"/>
|
sectiontype="EFI_SECTION_DXE_DEPEX"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
@ -1332,12 +1333,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
</targetfiles>
|
</targetfiles>
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"
|
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"
|
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"
|
||||||
sectiontype="EFI_SECTION_PEI_DEPEX"/>
|
sectiontype="EFI_SECTION_PEI_DEPEX"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
|
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<if>
|
<if>
|
||||||
@ -1377,8 +1378,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<PRE.PROCESS/>
|
<PRE.PROCESS/>
|
||||||
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"
|
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"
|
||||||
sectiontype="EFI_SECTION_RAW"/>
|
sectiontype="EFI_SECTION_RAW"/>
|
||||||
<POST.PROCESS/>
|
<POST.PROCESS/>
|
||||||
</sequential>
|
</sequential>
|
||||||
@ -1411,16 +1412,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
<PRE.PROCESS/>
|
<PRE.PROCESS/>
|
||||||
<secfixup secexefile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" resetvectorDatafile="${DEST_DIR_OUTPUT}/ResetVec.@{FILEEXT}"
|
<secfixup secexefile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" resetvectorDatafile="${DEST_DIR_OUTPUT}/ResetVec.@{FILEEXT}"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.bin"/>
|
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.bin"/>
|
||||||
|
|
||||||
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.bin"
|
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.bin"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"
|
outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"
|
||||||
sectiontype="EFI_SECTION_RAW"/>
|
sectiontype="EFI_SECTION_RAW"/>
|
||||||
<POST.PROCESS/>
|
<POST.PROCESS/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
EFI_SECTION_FIRMWARE_VOLUME_IMAGE
|
EFI_SECTION_FIRMWARE_VOLUME_IMAGE
|
||||||
-->
|
-->
|
||||||
@ -1443,14 +1444,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<PRE.PROCESS/>
|
<PRE.PROCESS/>
|
||||||
|
|
||||||
<copy file="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
<copy file="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
||||||
tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
||||||
overwrite="true"/>
|
overwrite="true"/>
|
||||||
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
<gensection inputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
|
||||||
outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}fv.sec"
|
outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}fv.sec"
|
||||||
sectiontype="EFI_SECTION_FIRMWARE_VOLUME_IMAGE"/>
|
sectiontype="EFI_SECTION_FIRMWARE_VOLUME_IMAGE"/>
|
||||||
|
|
||||||
<POST.PROCESS/>
|
<POST.PROCESS/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</OnDependency>
|
</OnDependency>
|
||||||
|
Reference in New Issue
Block a user