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