]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BeagleBoardPkg/Debugger_scripts/trace32_load_symbols.cmm
Adding support for BeagleBoard.
[mirror_edk2.git] / BeagleBoardPkg / Debugger_scripts / trace32_load_symbols.cmm
diff --git a/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols.cmm b/BeagleBoardPkg/Debugger_scripts/trace32_load_symbols.cmm
new file mode 100644 (file)
index 0000000..0dffaa4
--- /dev/null
@@ -0,0 +1,211 @@
+//\r
+// Copyright (c) 2008-2009, Apple Inc. All rights reserved.\r
+//  \r
+// All rights reserved. This program and the accompanying materials\r
+//  are licensed and made available under the terms and conditions of the BSD License\r
+//  which accompanies this distribution.  The full text of the license may be found at\r
+//  http://opensource.org/licenses/bsd-license.php\r
+//\r
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+//\r
+\r
+  ENTRY &ram_start &ram_size\r
+  \r
+  ;If system is running then stop the execution so we can load symbols.\r
+  break\r
+  \r
+  ;Reset all windows\r
+  WINPAGE.RESET\r
+  \r
+  ;Create AREA to display the symbols we are loading.\r
+  AREA.Reset\r
+  AREA.Create SYMBOL 300. 100.\r
+  AREA.View SYMBOL\r
+  AREA.Select SYMBOL\r
+  SYS.Option BE OFF\r
\r
+  ;Added based on suggestion from Lauterbach support.\r
+  MMU.TABLEWALK ON\r
+  MMU.ON\r
+\r
+  ;Load symbols.\r
+  GOSUB load_symbols &ram_start &ram_size\r
+\r
+  ;Open some windows and enable semihosting.\r
+  TOOLBAR ON\r
+  STATUSBAR ON\r
+  WINPAGE.RESET\r
+   \r
+  WINCLEAR\r
+  WINPOS 0.0 17.0 72. 13. 0. 0. W000\r
+  SYStem\r
+   \r
+  WINPOS 0.0 0.0 110. 55. 13. 1. W001\r
+  WINTABS 10. 10. 25. 62.\r
+  Data.List\r
+   \r
+  WINPAGE.SELECT P000\r
+\r
+  //Enable semihosting\r
+  System.Option.BigEndian OFF\r
+\r
+  tronchip.set swi on          // ARM9/10/11 variant\r
+\r
+  // configure and open semihosting channel\r
+  winpos 50% 50% 50% 50%\r
+  term.heapinfo 0 0x20000 0x30000 0x20000\r
+  term.method armswi\r
+  term.mode string\r
+  term.gate\r
+\r
+  WINPOS 115.0 0. 70. 35. 0. 1. W002\r
+  Var.Local %HEX\r
+  \r
+  WINPOS 115.10 45. 48. 9. 0. 0. W003\r
+  Register\r
+    \r
+  END\r
+\r
+find_system_table:\r
+  ENTRY &mem_start &mem_size\r
+  &mem_ptr=&mem_start+&mem_size\r
+  RPT    \r
+  (\r
+    &mem_ptr=&mem_ptr-0x400000  // 4 MB\r
+    &word1=Data.LONG(D:&mem_ptr)\r
+    &word2=Data.LONG(D:&mem_ptr+0x04)\r
+    IF &word1==0x20494249\r
+    (\r
+      IF &word2==0x54535953\r
+      (\r
+        &result=Data.LONG(D:&mem_ptr+0x08)\r
+        RETURN &result\r
+      )\r
+    )\r
+  )\r
+  WHILE &mem_ptr>&mem_start\r
+  &result=0\r
+  RETURN &result\r
+\r
+compare_guid:\r
+  ENTRY &guid\r
+  IF Data.LONG(D:&guid)==0x49152E77\r
+  (\r
+    IF Data.LONG(D:&guid+0x04)==0x47641ADA\r
+    (\r
+      IF Data.LONG(D:&guid+0x08)==0xFE7AA2B7\r
+      (\r
+        IF Data.LONG(D:&guid+0x0C)==0x8B5ED9FE\r
+        (\r
+          RETURN 0\r
+        )\r
+      )\r
+    )\r
+  )\r
+  RETURN 1  \r
+\r
+find_debug_info_table_header:\r
+  ENTRY &system_table\r
+  &config_table_entries=Data.LONG(D:&system_table+0x40)\r
+  &config_table_pointer=Data.LONG(D:&system_table+0x44)\r
+  RPT &config_table_entries\r
+  (\r
+    GOSUB compare_guid &config_table_pointer\r
+    ENTRY &result\r
+    IF &result==0\r
+    (\r
+      &result=Data.LONG(D:&config_table_pointer+0x10)\r
+      RETURN &result\r
+    )  \r
+    &config_table_pointer=&config_table_pointer+0x14\r
+  )\r
+  RETURN 0;\r
+\r
+valid_pe_header:\r
+  ENTRY &header\r
+  IF Data.BYTE(D:&header+0x00)==0x4D\r
+  (\r
+    IF Data.BYTE(D:&header+0x01)==0x5A\r
+    (\r
+      IF Data.BYTE(D:&header+0x80)==0x50\r
+      (\r
+        IF Data.BYTE(D:&header+0x81)==0x45\r
+        (\r
+          RETURN 1\r
+        )\r
+      )\r
+    )\r
+  )\r
+  RETURN 0\r
+\r
+get_file_string:
+  ENTRY &stringOffset
+
+  local &string
+
+  &more_string=data.string(d:&stringOffset)
+
+  if (string.len("&more_string")>=128.)
+  (
+    &string="&string"+"&more_string"
+    &stringOffset=&stringOffset+string.len("&more_string")
+
+    //Get remaining file string
+    GOSUB get_file_string &stringOffset
+    ENTRY &more_string
+    &string="&string"+"&more_string"
+  )
+  else
+  (
+    &string="&string"+"&more_string"
+    &more_string=""
+  )\r
+  RETURN &string\r
\r
+load_symbol_file:\r
+  ENTRY &header &load_address\r
+  GOSUB valid_pe_header &header\r
+  ENTRY &result\r
\r
+  IF &result==1\r
+  (\r
+    &debugOffset=Data.LONG(D:&header+0x0128)\r
+    &stringOffset=&header+&debugOffset+0x002C\r
+    \r
+    GOSUB get_file_string &stringOffset\r
+    ENTRY &filestring\r
+        \r
+    PRINT "&filestring 0x" &load_address\r
+    TDIAG Data.load.elf &filestring &load_address /nocode /noclear\r
+  )\r
+  RETURN\r
+\r
+pe_headersize:\r
+  ENTRY &header;\r
+  RETURN Data.LONG(D:&header+0x00AC)\r
+\r
+load_symbols:\r
+  ENTRY &mem_start &mem_size\r
+  GOSUB find_system_table &mem_start &mem_size\r
+  ENTRY &system_table\r
+  GOSUB find_debug_info_table_header &system_table\r
+  ENTRY &debug_info_table_header\r
+  &debug_info_table=Data.LONG(D:&debug_info_table_header+0x08)\r
+  &debug_info_table_size=Data.LONG(D:&debug_info_table_header+0x04)\r
+  &index=0\r
+  RPT &debug_info_table_size\r
+  (\r
+    &debug_image_info=Data.LONG(D:&debug_info_table+&index)\r
+    IF &debug_image_info==0\r
+      RETURN        \r
+    &loaded_image_protocol=Data.LONG(D:&debug_image_info+0x04);\r
+    &image_base=Data.LONG(D:&loaded_image_protocol+0x20);\r
+    GOSUB pe_headersize &image_base\r
+    ENTRY &header_size\r
+    &image_load_address=&image_base+&header_size\r
+    GOSUB load_symbol_file &image_base &image_load_address\r
+    &index=&index+0x4\r
+  )\r
+    \r
+  RETURN\r