+++ /dev/null
-//\r
-// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
-// \r
-// SPDX-License-Identifier: BSD-2-Clause-Patent\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:\r
- ENTRY &stringOffset\r
-\r
- local &string\r
-\r
- &more_string=data.string(d:&stringOffset)\r
-\r
- if (string.len("&more_string")>=128.)\r
- (\r
- &string="&string"+"&more_string"\r
- &stringOffset=&stringOffset+string.len("&more_string")\r
-\r
- //Get remaining file string\r
- GOSUB get_file_string &stringOffset\r
- ENTRY &more_string\r
- &string="&string"+"&more_string"\r
- )\r
- else\r
- (\r
- &string="&string"+"&more_string"\r
- &more_string=""\r
- )\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