]>
Commit | Line | Data |
---|---|---|
2ef2b01e | 1 | //\r |
1ebd6c11 | 2 | // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r |
2ef2b01e | 3 | // \r |
1ebd6c11 | 4 | // This program and the accompanying materials\r |
2ef2b01e A |
5 | // are licensed and made available under the terms and conditions of the BSD License\r |
6 | // which accompanies this distribution. The full text of the license may be found at\r | |
7 | // http://opensource.org/licenses/bsd-license.php\r | |
8 | //\r | |
9 | // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
10 | // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
11 | //\r | |
12 | \r | |
13 | ENTRY &ram_start &ram_size\r | |
14 | \r | |
15 | ;If system is running then stop the execution so we can load symbols.\r | |
16 | break\r | |
17 | \r | |
18 | ;Reset all windows\r | |
19 | WINPAGE.RESET\r | |
20 | \r | |
21 | ;Create AREA to display the symbols we are loading.\r | |
22 | AREA.Reset\r | |
23 | AREA.Create SYMBOL 300. 100.\r | |
24 | AREA.View SYMBOL\r | |
25 | AREA.Select SYMBOL\r | |
26 | SYS.Option BE OFF\r | |
27 | \r | |
28 | ;Added based on suggestion from Lauterbach support.\r | |
29 | MMU.TABLEWALK ON\r | |
30 | MMU.ON\r | |
31 | \r | |
32 | ;Load symbols.\r | |
33 | GOSUB load_symbols &ram_start &ram_size\r | |
34 | \r | |
35 | ;Open some windows and enable semihosting.\r | |
36 | TOOLBAR ON\r | |
37 | STATUSBAR ON\r | |
38 | WINPAGE.RESET\r | |
39 | \r | |
40 | WINCLEAR\r | |
41 | WINPOS 0.0 17.0 72. 13. 0. 0. W000\r | |
42 | SYStem\r | |
43 | \r | |
44 | WINPOS 0.0 0.0 110. 55. 13. 1. W001\r | |
45 | WINTABS 10. 10. 25. 62.\r | |
46 | Data.List\r | |
47 | \r | |
48 | WINPAGE.SELECT P000\r | |
49 | \r | |
50 | //Enable semihosting\r | |
51 | System.Option.BigEndian OFF\r | |
52 | \r | |
53 | tronchip.set swi on // ARM9/10/11 variant\r | |
54 | \r | |
55 | // configure and open semihosting channel\r | |
56 | winpos 50% 50% 50% 50%\r | |
57 | term.heapinfo 0 0x20000 0x30000 0x20000\r | |
58 | term.method armswi\r | |
59 | term.mode string\r | |
60 | term.gate\r | |
61 | \r | |
62 | WINPOS 115.0 0. 70. 35. 0. 1. W002\r | |
63 | Var.Local %HEX\r | |
64 | \r | |
65 | WINPOS 115.10 45. 48. 9. 0. 0. W003\r | |
66 | Register\r | |
67 | \r | |
68 | END\r | |
69 | \r | |
70 | find_system_table:\r | |
71 | ENTRY &mem_start &mem_size\r | |
72 | &mem_ptr=&mem_start+&mem_size\r | |
73 | RPT \r | |
74 | (\r | |
75 | &mem_ptr=&mem_ptr-0x400000 // 4 MB\r | |
76 | &word1=Data.LONG(D:&mem_ptr)\r | |
77 | &word2=Data.LONG(D:&mem_ptr+0x04)\r | |
78 | IF &word1==0x20494249\r | |
79 | (\r | |
80 | IF &word2==0x54535953\r | |
81 | (\r | |
82 | &result=Data.LONG(D:&mem_ptr+0x08)\r | |
83 | RETURN &result\r | |
84 | )\r | |
85 | )\r | |
86 | )\r | |
87 | WHILE &mem_ptr>&mem_start\r | |
88 | &result=0\r | |
89 | RETURN &result\r | |
90 | \r | |
91 | compare_guid:\r | |
92 | ENTRY &guid\r | |
93 | IF Data.LONG(D:&guid)==0x49152E77\r | |
94 | (\r | |
95 | IF Data.LONG(D:&guid+0x04)==0x47641ADA\r | |
96 | (\r | |
97 | IF Data.LONG(D:&guid+0x08)==0xFE7AA2B7\r | |
98 | (\r | |
99 | IF Data.LONG(D:&guid+0x0C)==0x8B5ED9FE\r | |
100 | (\r | |
101 | RETURN 0\r | |
102 | )\r | |
103 | )\r | |
104 | )\r | |
105 | )\r | |
106 | RETURN 1 \r | |
107 | \r | |
108 | find_debug_info_table_header:\r | |
109 | ENTRY &system_table\r | |
110 | &config_table_entries=Data.LONG(D:&system_table+0x40)\r | |
111 | &config_table_pointer=Data.LONG(D:&system_table+0x44)\r | |
112 | RPT &config_table_entries\r | |
113 | (\r | |
114 | GOSUB compare_guid &config_table_pointer\r | |
115 | ENTRY &result\r | |
116 | IF &result==0\r | |
117 | (\r | |
118 | &result=Data.LONG(D:&config_table_pointer+0x10)\r | |
119 | RETURN &result\r | |
120 | ) \r | |
121 | &config_table_pointer=&config_table_pointer+0x14\r | |
122 | )\r | |
123 | RETURN 0;\r | |
124 | \r | |
125 | valid_pe_header:\r | |
126 | ENTRY &header\r | |
127 | IF Data.BYTE(D:&header+0x00)==0x4D\r | |
128 | (\r | |
129 | IF Data.BYTE(D:&header+0x01)==0x5A\r | |
130 | (\r | |
131 | IF Data.BYTE(D:&header+0x80)==0x50\r | |
132 | (\r | |
133 | IF Data.BYTE(D:&header+0x81)==0x45\r | |
134 | (\r | |
135 | RETURN 1\r | |
136 | )\r | |
137 | )\r | |
138 | )\r | |
139 | )\r | |
140 | RETURN 0\r | |
141 | \r | |
e6f3ed43 LL |
142 | get_file_string:\r |
143 | ENTRY &stringOffset\r | |
144 | \r | |
145 | local &string\r | |
146 | \r | |
147 | &more_string=data.string(d:&stringOffset)\r | |
148 | \r | |
149 | if (string.len("&more_string")>=128.)\r | |
150 | (\r | |
151 | &string="&string"+"&more_string"\r | |
152 | &stringOffset=&stringOffset+string.len("&more_string")\r | |
153 | \r | |
154 | //Get remaining file string\r | |
155 | GOSUB get_file_string &stringOffset\r | |
156 | ENTRY &more_string\r | |
157 | &string="&string"+"&more_string"\r | |
158 | )\r | |
159 | else\r | |
160 | (\r | |
161 | &string="&string"+"&more_string"\r | |
162 | &more_string=""\r | |
2ef2b01e A |
163 | )\r |
164 | RETURN &string\r | |
165 | \r | |
166 | load_symbol_file:\r | |
167 | ENTRY &header &load_address\r | |
168 | GOSUB valid_pe_header &header\r | |
169 | ENTRY &result\r | |
170 | \r | |
171 | IF &result==1\r | |
172 | (\r | |
173 | &debugOffset=Data.LONG(D:&header+0x0128)\r | |
174 | &stringOffset=&header+&debugOffset+0x002C\r | |
175 | \r | |
176 | GOSUB get_file_string &stringOffset\r | |
177 | ENTRY &filestring\r | |
178 | \r | |
179 | PRINT "&filestring 0x" &load_address\r | |
180 | TDIAG Data.load.elf &filestring &load_address /nocode /noclear\r | |
181 | )\r | |
182 | RETURN\r | |
183 | \r | |
184 | pe_headersize:\r | |
185 | ENTRY &header;\r | |
186 | RETURN Data.LONG(D:&header+0x00AC)\r | |
187 | \r | |
188 | load_symbols:\r | |
189 | ENTRY &mem_start &mem_size\r | |
190 | GOSUB find_system_table &mem_start &mem_size\r | |
191 | ENTRY &system_table\r | |
192 | GOSUB find_debug_info_table_header &system_table\r | |
193 | ENTRY &debug_info_table_header\r | |
194 | &debug_info_table=Data.LONG(D:&debug_info_table_header+0x08)\r | |
195 | &debug_info_table_size=Data.LONG(D:&debug_info_table_header+0x04)\r | |
196 | &index=0\r | |
197 | RPT &debug_info_table_size\r | |
198 | (\r | |
199 | &debug_image_info=Data.LONG(D:&debug_info_table+&index)\r | |
200 | IF &debug_image_info==0\r | |
201 | RETURN \r | |
202 | &loaded_image_protocol=Data.LONG(D:&debug_image_info+0x04);\r | |
203 | &image_base=Data.LONG(D:&loaded_image_protocol+0x20);\r | |
204 | GOSUB pe_headersize &image_base\r | |
205 | ENTRY &header_size\r | |
206 | &image_load_address=&image_base+&header_size\r | |
207 | GOSUB load_symbol_file &image_base &image_load_address\r | |
208 | &index=&index+0x4\r | |
209 | )\r | |
210 | \r | |
211 | RETURN\r |