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