Remove ArmEbPkg and replace with ArmRealViewEbPkg. Ported ArmRealViewEbPkg to have a PEI phase, and added place holder CPU PEIM to ArmPkg. This ArmRealViewEbPkg now boots from SEC, PEI, DXE, BDS, to EBL in the ARM RealView system emulator that comes with RealView Pro.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10621 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
463
ArmRealViewEbPkg/Debugger_scripts/EfiFuncs.inc
Executable file
463
ArmRealViewEbPkg/Debugger_scripts/EfiFuncs.inc
Executable file
@@ -0,0 +1,463 @@
|
||||
error=abort
|
||||
|
||||
// NOTE: THIS MAY NEED TO BE ADJUSTED
|
||||
// change to reflect the total amount of ram in your system
|
||||
define /r GetMaxMem()
|
||||
{
|
||||
return 0x10000000; // 256 MB
|
||||
}
|
||||
.
|
||||
|
||||
define /r GetWord(Addr)
|
||||
{
|
||||
unsigned long data;
|
||||
|
||||
if( (Addr & 0x2) == 0 )
|
||||
{
|
||||
data = dword(Addr);
|
||||
data = data & 0xffff;
|
||||
//$printf "getword data is %x\n", data$;
|
||||
return data;
|
||||
}
|
||||
else
|
||||
{
|
||||
data = dword(Addr & 0xfffffffc);
|
||||
//data = data >> 16;
|
||||
data = data / 0x10000;
|
||||
//$printf "getword data is %x (1)\n", data$;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
.
|
||||
|
||||
define /r ProcessPE32(imgstart)
|
||||
unsigned long imgstart;
|
||||
{
|
||||
unsigned long filehdrstart;
|
||||
unsigned long debugdirentryrva;
|
||||
unsigned long debugtype;
|
||||
unsigned long debugrva;
|
||||
unsigned long dwarfsig;
|
||||
unsigned long baseofcode;
|
||||
unsigned long baseofdata;
|
||||
unsigned long elfbase;
|
||||
char *elfpath;
|
||||
|
||||
$printf "PE32 image found at %x",imgstart$;
|
||||
|
||||
//$printf "PE file hdr offset %x",dword(imgstart+0x3C)$;
|
||||
|
||||
// offset from dos hdr to PE file hdr
|
||||
filehdrstart = imgstart + dword(imgstart+0x3C);
|
||||
|
||||
// offset to debug dir in PE hdrs
|
||||
//$printf "debug dir is at %x",(filehdrstart+0xA8)$;
|
||||
debugdirentryrva = dword(filehdrstart + 0xA8);
|
||||
if(debugdirentryrva == 0)
|
||||
{
|
||||
$printf "no debug dir for image at %x",imgstart$;
|
||||
return;
|
||||
}
|
||||
|
||||
//$printf "debug dir entry rva is %x",debugdirentryrva$;
|
||||
|
||||
debugtype = dword(imgstart + debugdirentryrva + 0xc);
|
||||
if( (debugtype != 0xdf) && (debugtype != 0x2) )
|
||||
{
|
||||
$printf "debug type is not dwarf for image at %x",imgstart$;
|
||||
$printf "debug type is %x",debugtype$;
|
||||
return;
|
||||
}
|
||||
|
||||
debugrva = dword(imgstart + debugdirentryrva + 0x14);
|
||||
dwarfsig = dword(imgstart + debugrva);
|
||||
if(dwarfsig != 0x66727764)
|
||||
{
|
||||
$printf "dwarf debug signature not found for image at %x",imgstart$;
|
||||
return;
|
||||
}
|
||||
|
||||
elfpath = (char *)(imgstart + debugrva + 0xc);
|
||||
|
||||
baseofcode = imgstart + dword(filehdrstart + 0x28);
|
||||
baseofdata = imgstart + dword(filehdrstart + 0x2c);
|
||||
|
||||
if( (baseofcode < baseofdata) && (baseofcode != 0) )
|
||||
{
|
||||
elfbase = baseofcode;
|
||||
}
|
||||
else
|
||||
{
|
||||
elfbase = baseofdata;
|
||||
}
|
||||
|
||||
$printf "found path %s",elfpath$;
|
||||
$fprintf 50, "load /ni /np /a %s &0x%x\n",elfpath,elfbase$;
|
||||
}
|
||||
.
|
||||
|
||||
define /r ProcessTE(imgstart)
|
||||
unsigned long imgstart;
|
||||
{
|
||||
unsigned long strippedsize;
|
||||
unsigned long debugdirentryrva;
|
||||
unsigned long debugtype;
|
||||
unsigned long debugrva;
|
||||
unsigned long dwarfsig;
|
||||
unsigned long elfbase;
|
||||
char *elfpath;
|
||||
|
||||
$printf "TE image found at %x",imgstart$;
|
||||
|
||||
// determine pe header bytes removed to account for in rva references
|
||||
//strippedsize = word(imgstart + 0x6);
|
||||
//strippedsize = (dword(imgstart + 0x4) & 0xffff0000) >> 16;
|
||||
strippedsize = (dword(imgstart + 0x4) & 0xffff0000) / 0x10000;
|
||||
strippedsize = strippedsize - 0x28;
|
||||
|
||||
debugdirentryrva = dword(imgstart + 0x20);
|
||||
if(debugdirentryrva == 0)
|
||||
{
|
||||
$printf "no debug dir for image at %x",imgstart$;
|
||||
return;
|
||||
}
|
||||
debugdirentryrva = debugdirentryrva - strippedsize;
|
||||
|
||||
//$printf "debug dir entry rva is %x",debugdirentryrva$;
|
||||
|
||||
debugtype = dword(imgstart + debugdirentryrva + 0xc);
|
||||
if( (debugtype != 0xdf) && (debugtype != 0x2) )
|
||||
{
|
||||
$printf "debug type is not dwarf for image at %x",imgstart$;
|
||||
$printf "debug type is %x",debugtype$;
|
||||
return;
|
||||
}
|
||||
|
||||
debugrva = dword(imgstart + debugdirentryrva + 0x14);
|
||||
debugrva = debugrva - strippedsize;
|
||||
dwarfsig = dword(imgstart + debugrva);
|
||||
if( (dwarfsig != 0x66727764) && (dwarfsig != 0x3031424e) )
|
||||
{
|
||||
$printf "dwarf debug signature not found for image at %x",imgstart$;
|
||||
$printf "found %x", dwarfsig$;
|
||||
return;
|
||||
}
|
||||
|
||||
if( dwarfsig == 0x66727764 )
|
||||
{
|
||||
elfpath = (char *)(imgstart + debugrva + 0xc);
|
||||
$printf "looking for elf path at 0x%x", elfpath$;
|
||||
}
|
||||
else
|
||||
{
|
||||
elfpath = (char *)(imgstart + debugrva + 0x10);
|
||||
$printf "looking for elf path at 0x%x", elfpath$;
|
||||
}
|
||||
|
||||
// elf base is baseofcode (we hope that for TE images it's not baseofdata)
|
||||
elfbase = imgstart + dword(imgstart + 0xc) - strippedsize;
|
||||
|
||||
$printf "found path %s",elfpath$;
|
||||
$fprintf 50, "load /ni /np /a %s &0x%x\n",elfpath,elfbase$;
|
||||
}
|
||||
.
|
||||
|
||||
define /r ProcessFvSection(secstart)
|
||||
unsigned long secstart;
|
||||
{
|
||||
unsigned long sectionsize;
|
||||
unsigned char sectiontype;
|
||||
|
||||
sectionsize = dword(secstart);
|
||||
//sectiontype = (sectionsize & 0xff000000) >> 24;
|
||||
sectiontype = (sectionsize & 0xff000000) / 0x1000000;
|
||||
sectionsize = sectionsize & 0x00ffffff;
|
||||
|
||||
$printf "fv section at %x size %x type %x",secstart,sectionsize,sectiontype$;
|
||||
|
||||
if(sectiontype == 0x10) // PE32
|
||||
{
|
||||
ProcessPE32(secstart+0x4);
|
||||
}
|
||||
else if(sectiontype == 0x12) // TE
|
||||
{
|
||||
ProcessTE(secstart+0x4);
|
||||
}
|
||||
}
|
||||
.
|
||||
|
||||
define /r ProcessFfsFile(ffsfilestart)
|
||||
unsigned long ffsfilestart;
|
||||
{
|
||||
unsigned long ffsfilesize;
|
||||
unsigned long ffsfiletype;
|
||||
unsigned long secoffset;
|
||||
unsigned long secsize;
|
||||
|
||||
//ffsfiletype = byte(ffsfilestart + 0x12);
|
||||
ffsfilesize = dword(ffsfilestart + 0x14);
|
||||
//ffsfiletype = (ffsfilesize & 0xff000000) >> 24;
|
||||
ffsfiletype = (ffsfilesize & 0xff000000) / 0x1000000;
|
||||
ffsfilesize = ffsfilesize & 0x00ffffff;
|
||||
|
||||
if(ffsfiletype == 0xff) return;
|
||||
|
||||
$printf "ffs file at %x size %x type %x",ffsfilestart,ffsfilesize,ffsfiletype$;
|
||||
|
||||
secoffset = ffsfilestart + 0x18;
|
||||
|
||||
// loop through sections in file
|
||||
while(secoffset < (ffsfilestart + ffsfilesize))
|
||||
{
|
||||
// process fv section and increment section offset by size
|
||||
secsize = dword(secoffset) & 0x00ffffff;
|
||||
ProcessFvSection(secoffset);
|
||||
secoffset = secoffset + secsize;
|
||||
|
||||
// align to next 4 byte boundary
|
||||
if( (secoffset & 0x3) != 0 )
|
||||
{
|
||||
secoffset = secoffset + (0x4 - (secoffset & 0x3));
|
||||
}
|
||||
} // end section loop
|
||||
}
|
||||
.
|
||||
|
||||
define /r LoadPeiSec()
|
||||
{
|
||||
unsigned long fvbase;
|
||||
unsigned long fvlen;
|
||||
unsigned long fvsig;
|
||||
unsigned long ffsoffset;
|
||||
unsigned long ffsfilesize;
|
||||
|
||||
fvbase = FindFv();
|
||||
$printf "fvbase %x",fvbase$;
|
||||
|
||||
// get fv signature field
|
||||
fvsig = dword(fvbase + 0x28);
|
||||
if(fvsig != 0x4856465F)
|
||||
{
|
||||
$printf "FV does not have proper signature, exiting"$;
|
||||
return 0;
|
||||
}
|
||||
|
||||
$printf "FV signature found"$;
|
||||
|
||||
$fopen 50, 'C:\loadfiles.inc'$;
|
||||
|
||||
fvlen = dword(fvbase + 0x20);
|
||||
|
||||
// first ffs file is after fv header, use headerlength field
|
||||
//ffsoffset = (dword(fvbase + 0x30) & 0xffff0000) >> 16;
|
||||
ffsoffset = (dword(fvbase + 0x30) & 0xffff0000) / 0x10000;
|
||||
ffsoffset = fvbase + GetWord(fvbase + 0x30);
|
||||
|
||||
// loop through ffs files
|
||||
while(ffsoffset < (fvbase+fvlen))
|
||||
{
|
||||
// process ffs file and increment by ffs file size field
|
||||
ProcessFfsFile(ffsoffset);
|
||||
ffsfilesize = (dword(ffsoffset + 0x14) & 0x00ffffff);
|
||||
if(ffsfilesize == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
ffsoffset = ffsoffset + ffsfilesize;
|
||||
|
||||
|
||||
// align to next 8 byte boundary
|
||||
if( (ffsoffset & 0x7) != 0 )
|
||||
{
|
||||
ffsoffset = ffsoffset + (0x8 - (ffsoffset & 0x7));
|
||||
}
|
||||
|
||||
} // end fv ffs loop
|
||||
|
||||
$vclose 50$;
|
||||
|
||||
}
|
||||
.
|
||||
|
||||
define /r FindSystemTable(TopOfRam)
|
||||
unsigned long TopOfRam;
|
||||
{
|
||||
unsigned long offset;
|
||||
|
||||
$printf "FindSystemTable"$;
|
||||
$printf "top of mem is %x",TopOfRam$;
|
||||
|
||||
offset = TopOfRam;
|
||||
|
||||
// align to highest 4MB boundary
|
||||
offset = offset & 0xFFC00000;
|
||||
|
||||
// start at top and look on 4MB boundaries for system table ptr structure
|
||||
while(offset > 0)
|
||||
{
|
||||
//$printf "checking %x",offset$;
|
||||
//$printf "value is %x",dword(offset)$;
|
||||
|
||||
// low signature match
|
||||
if(dword(offset) == 0x20494249)
|
||||
{
|
||||
// high signature match
|
||||
if(dword(offset+4) == 0x54535953)
|
||||
{
|
||||
// less than 4GB?
|
||||
if(dword(offset+0x0c) == 0)
|
||||
{
|
||||
// less than top of ram?
|
||||
if(dword(offset+8) < TopOfRam)
|
||||
{
|
||||
return(dword(offset+8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(offset < 0x400000) break;
|
||||
offset = offset - 0x400000;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
.
|
||||
|
||||
define /r ProcessImage(ImageBase)
|
||||
unsigned long ImageBase;
|
||||
{
|
||||
$printf "ProcessImage %x", ImageBase$;
|
||||
}
|
||||
.
|
||||
|
||||
define /r FindDebugInfo(SystemTable)
|
||||
unsigned long SystemTable;
|
||||
{
|
||||
unsigned long CfgTableEntries;
|
||||
unsigned long ConfigTable;
|
||||
unsigned long i;
|
||||
unsigned long offset;
|
||||
unsigned long dbghdr;
|
||||
unsigned long dbgentries;
|
||||
unsigned long dbgptr;
|
||||
unsigned long dbginfo;
|
||||
unsigned long loadedimg;
|
||||
|
||||
$printf "FindDebugInfo"$;
|
||||
|
||||
dbgentries = 0;
|
||||
CfgTableEntries = dword(SystemTable + 0x40);
|
||||
ConfigTable = dword(SystemTable + 0x44);
|
||||
|
||||
$printf "config table is at %x (%d entries)", ConfigTable, CfgTableEntries$;
|
||||
|
||||
// now search for debug info entry with guid 49152E77-1ADA-4764-B7A2-7AFEFED95E8B
|
||||
// 0x49152E77 0x47641ADA 0xFE7AA2B7 0x8B5ED9FE
|
||||
for(i=0; i<CfgTableEntries; i++)
|
||||
{
|
||||
offset = ConfigTable + (i*0x14);
|
||||
if(dword(offset) == 0x49152E77)
|
||||
{
|
||||
if(dword(offset+4) == 0x47641ADA)
|
||||
{
|
||||
if(dword(offset+8) == 0xFE7AA2B7)
|
||||
{
|
||||
if(dword(offset+0xc) == 0x8B5ED9FE)
|
||||
{
|
||||
dbghdr = dword(offset+0x10);
|
||||
dbgentries = dword(dbghdr + 4);
|
||||
dbgptr = dword(dbghdr + 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(dbgentries == 0)
|
||||
{
|
||||
$printf "no debug entries found"$;
|
||||
return;
|
||||
}
|
||||
|
||||
$printf "debug table at %x (%d entries)", dbgptr, dbgentries$;
|
||||
|
||||
for(i=0; i<dbgentries; i++)
|
||||
{
|
||||
dbginfo = dword(dbgptr + (i*4));
|
||||
if(dbginfo != 0)
|
||||
{
|
||||
if(dword(dbginfo) == 1) // normal debug info type
|
||||
{
|
||||
loadedimg = dword(dbginfo + 4);
|
||||
ProcessPE32(dword(loadedimg + 0x20));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.
|
||||
|
||||
define /r LoadDxe()
|
||||
{
|
||||
unsigned long maxmem;
|
||||
unsigned long systbl;
|
||||
|
||||
$printf "LoadDxe"$;
|
||||
|
||||
$fopen 50, 'C:\loadfiles.inc'$;
|
||||
|
||||
maxmem = GetMaxMem();
|
||||
systbl = FindSystemTable(maxmem);
|
||||
if(systbl != 0)
|
||||
{
|
||||
$printf "found system table at %x",systbl$;
|
||||
FindDebugInfo(systbl);
|
||||
}
|
||||
|
||||
$vclose 50$;
|
||||
}
|
||||
.
|
||||
|
||||
define /r LoadRuntimeDxe()
|
||||
|
||||
{
|
||||
unsigned long maxmem;
|
||||
unsigned long SystemTable;
|
||||
unsigned long CfgTableEntries;
|
||||
unsigned long ConfigTable;
|
||||
unsigned long i;
|
||||
unsigned long offset;
|
||||
unsigned long numentries;
|
||||
unsigned long RuntimeDebugInfo;
|
||||
unsigned long DebugInfoOffset;
|
||||
unsigned long imgbase;
|
||||
|
||||
$printf "LoadRuntimeDxe"$;
|
||||
|
||||
$fopen 50, 'C:\loadfiles.inc'$;
|
||||
|
||||
RuntimeDebugInfo = 0x80000010;
|
||||
|
||||
if(RuntimeDebugInfo != 0)
|
||||
{
|
||||
numentries = dword(RuntimeDebugInfo);
|
||||
|
||||
$printf "runtime debug info is at %x (%d entries)", RuntimeDebugInfo, numentries$;
|
||||
|
||||
DebugInfoOffset = RuntimeDebugInfo + 0x4;
|
||||
for(i=0; i<numentries; i++)
|
||||
{
|
||||
imgbase = dword(DebugInfoOffset);
|
||||
if(imgbase != 0)
|
||||
{
|
||||
$printf "found image at %x",imgbase$;
|
||||
ProcessPE32(imgbase);
|
||||
}
|
||||
DebugInfoOffset = DebugInfoOffset + 0x4;
|
||||
}
|
||||
}
|
||||
|
||||
$vclose 50$;
|
||||
}
|
||||
.
|
Reference in New Issue
Block a user