]>
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 | AREA.Reset\r | |
22 | AREA.Create SYMBOL 300. 100.\r | |
23 | AREA.View SYMBOL\r | |
24 | AREA.Select SYMBOL\r | |
25 | SYS.Option BE OFF\r | |
26 | \r | |
27 | ; Added based on suggestion from Lauterbach support.\r | |
28 | MMU.TABLEWALK ON\r | |
29 | MMU.ON\r | |
30 | \r | |
31 | GOSUB load_symbols &ram_start &ram_size\r | |
32 | \r | |
33 | ;Open some windows.\r | |
34 | WINPOS 83.125 29.063 48. 9. 0. 0. W003\r | |
35 | Register\r | |
36 | \r | |
37 | WINPOS 83.25 10. 48. 9. 0. 1. W002\r | |
38 | Var.Local\r | |
39 | \r | |
40 | END\r | |
41 | \r | |
42 | find_system_table:\r | |
43 | ENTRY &mem_start &mem_size\r | |
44 | &mem_ptr=&mem_start+&mem_size\r | |
45 | RPT \r | |
46 | (\r | |
47 | &mem_ptr=&mem_ptr-0x400000 // 4 MB\r | |
48 | &word1=Data.LONG(D:&mem_ptr)\r | |
49 | &word2=Data.LONG(D:&mem_ptr+0x04)\r | |
50 | IF &word1==0x20494249\r | |
51 | (\r | |
52 | IF &word2==0x54535953\r | |
53 | (\r | |
54 | &result=Data.LONG(D:&mem_ptr+0x08)\r | |
55 | RETURN &result\r | |
56 | )\r | |
57 | )\r | |
58 | )\r | |
59 | WHILE &mem_ptr>&mem_start\r | |
60 | &result=0\r | |
61 | RETURN &result\r | |
62 | \r | |
63 | compare_guid:\r | |
64 | ENTRY &guid\r | |
65 | IF Data.LONG(D:&guid)==0x49152E77\r | |
66 | (\r | |
67 | IF Data.LONG(D:&guid+0x04)==0x47641ADA\r | |
68 | (\r | |
69 | IF Data.LONG(D:&guid+0x08)==0xFE7AA2B7\r | |
70 | (\r | |
71 | IF Data.LONG(D:&guid+0x0C)==0x8B5ED9FE\r | |
72 | (\r | |
73 | RETURN 0\r | |
74 | )\r | |
75 | )\r | |
76 | )\r | |
77 | )\r | |
78 | RETURN 1 \r | |
79 | \r | |
80 | find_debug_info_table_header:\r | |
81 | ENTRY &system_table\r | |
82 | &config_table_entries=Data.LONG(D:&system_table+0x40)\r | |
83 | &config_table_pointer=Data.LONG(D:&system_table+0x44)\r | |
84 | RPT &config_table_entries\r | |
85 | (\r | |
86 | GOSUB compare_guid &config_table_pointer\r | |
87 | ENTRY &result\r | |
88 | IF &result==0\r | |
89 | (\r | |
90 | &result=Data.LONG(D:&config_table_pointer+0x10)\r | |
91 | RETURN &result\r | |
92 | ) \r | |
93 | &config_table_pointer=&config_table_pointer+0x14\r | |
94 | )\r | |
95 | RETURN 0;\r | |
96 | \r | |
97 | valid_pe_header:\r | |
98 | ENTRY &header\r | |
99 | IF Data.BYTE(D:&header+0x00)==0x4D\r | |
100 | (\r | |
101 | IF Data.BYTE(D:&header+0x01)==0x5A\r | |
102 | (\r | |
103 | IF Data.BYTE(D:&header+0x80)==0x50\r | |
104 | (\r | |
105 | IF Data.BYTE(D:&header+0x81)==0x45\r | |
106 | (\r | |
107 | RETURN 1\r | |
108 | )\r | |
109 | )\r | |
110 | )\r | |
111 | )\r | |
112 | RETURN 0\r | |
113 | \r | |
e6f3ed43 LL |
114 | get_file_string:\r |
115 | ENTRY &stringOffset\r | |
116 | \r | |
2ef2b01e A |
117 | local &string\r |
118 | \r | |
e6f3ed43 LL |
119 | &more_string=data.string(d:&stringOffset)\r |
120 | \r | |
121 | if (string.len("&more_string")>=128.)\r | |
122 | (\r | |
123 | &string="&string"+"&more_string"\r | |
124 | &stringOffset=&stringOffset+string.len("&more_string")\r | |
125 | \r | |
126 | //Get remaining file string\r | |
127 | GOSUB get_file_string &stringOffset\r | |
128 | ENTRY &more_string\r | |
129 | &string="&string"+"&more_string"\r | |
130 | )\r | |
131 | else\r | |
132 | (\r | |
133 | &string="&string"+"&more_string"\r | |
134 | &more_string=""\r | |
2ef2b01e A |
135 | )\r |
136 | RETURN &string\r | |
137 | \r | |
138 | load_symbol_file:\r | |
139 | ENTRY &header &load_address\r | |
140 | GOSUB valid_pe_header &header\r | |
141 | ENTRY &result\r | |
142 | \r | |
143 | IF &result==1\r | |
144 | (\r | |
145 | &debugOffset=Data.LONG(D:&header+0x0128)\r | |
146 | &stringOffset=&header+&debugOffset+0x002C\r | |
147 | \r | |
148 | &stringOffset=&stringOffset+11.\r | |
149 | \r | |
150 | GOSUB get_file_string &stringOffset\r | |
151 | ENTRY &filestring\r | |
152 | \r | |
153 | &filestring="c:"+"&filestring"\r | |
154 | \r | |
155 | PRINT "&filestring 0x" &load_address\r | |
156 | Data.load.elf &filestring &load_address /nocode /noclear\r | |
157 | )\r | |
158 | RETURN\r | |
159 | \r | |
160 | pe_headersize:\r | |
161 | ENTRY &header;\r | |
162 | RETURN Data.LONG(D:&header+0x00AC)\r | |
163 | \r | |
164 | load_symbols:\r | |
165 | ENTRY &mem_start &mem_size\r | |
166 | GOSUB find_system_table &mem_start &mem_size\r | |
167 | ENTRY &system_table\r | |
168 | GOSUB find_debug_info_table_header &system_table\r | |
169 | ENTRY &debug_info_table_header\r | |
170 | &debug_info_table=Data.LONG(D:&debug_info_table_header+0x08)\r | |
171 | &debug_info_table_size=Data.LONG(D:&debug_info_table_header+0x04)\r | |
172 | &index=0\r | |
173 | RPT &debug_info_table_size\r | |
174 | (\r | |
175 | &debug_image_info=Data.LONG(D:&debug_info_table+&index)\r | |
176 | IF &debug_image_info==0\r | |
177 | RETURN \r | |
178 | &loaded_image_protocol=Data.LONG(D:&debug_image_info+0x04);\r | |
179 | &image_base=Data.LONG(D:&loaded_image_protocol+0x20);\r | |
180 | GOSUB pe_headersize &image_base\r | |
181 | ENTRY &header_size\r | |
182 | &image_load_address=&image_base+&header_size\r | |
183 | GOSUB load_symbol_file &image_base &image_load_address\r | |
184 | &index=&index+0x4\r | |
185 | )\r | |
186 | \r | |
187 | RETURN\r | |
188 |