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