blob: f37440445496aae24f7065ce739cf84c2bf2171a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
\ 7.6 Client Program Debugging command group
\ 7.6.1 Registers display
: ctrace ( -- )
;
: .registers ( -- )
;
: .fregisters ( -- )
;
\ to ( param [old-name< >] -- )
\ 7.6.2 Program download and execute
struct ( saved-program-state )
/n field >sps.entry
/n field >sps.file-size
/n field >sps.file-type
constant saved-program-state.size
create saved-program-state saved-program-state.size allot
variable state-valid
0 state-valid !
variable file-size
: !load-size file-size ! ;
: load-size file-size @ ;
\ File types identified by (init-program)
0 constant elf-boot
1 constant elf
2 constant bootinfo
3 constant xcoff
4 constant pe
5 constant aout
10 constant fcode
11 constant forth
12 constant bootcode
: init-program ( -- )
\ Call down to the lower level for relocation etc.
s" (init-program)" $find if
execute
else
s" Unable to locate (init-program)!" type cr
then
;
: (find-bootdevice) ( param-str param-len -- bootpath-str bootpath-len)
\ Parse the <param> string which is a space-separated list of one or
\ more potential boot devices, and return the first one that can be
\ successfully opened.
\ Space-separated bootpath string
bl left-split \ bootpathstr bootpathstr-len bootdevstr bootdevstr-len
dup 0= if
\ None specified. As per IEEE-1275 specification, search through each value
\ in boot-device and use the first that returns a valid ihandle on open.
2drop \ drop the empty device string as we're going to use our own
s" boot-device" $find drop execute
bl left-split
begin
dup
while
2dup s" Trying " type type s" ..." type cr
2dup open-dev ?dup if
close-dev
2swap drop 0 \ Fake end of string so we exit loop
else
2drop
bl left-split
then
repeat
2drop
then
\ bootargs
2swap dup 0= if
\ None specified, use default from nvram
2drop s" boot-file" $find drop execute
then
\ Set the bootargs property
encode-string
" /chosen" (find-dev) if
" bootargs" rot (property)
then
;
\ Locate the boot-device opened by this ihandle (currently taken as being
\ the first non-interposed package in the instance chain)
: ihandle>boot-device-handle ( ihandle -- 0 | device-ihandle -1 )
>r 0
begin r> dup >in.my-parent @ dup >r while
( result ihandle R: ihandle.parent )
dup >in.interposed @ 0= if
\ Find the first non-interposed package
over 0= if
swap drop
else
drop
then
else
drop
then
repeat
r> drop drop
dup 0<> if
-1
then
;
: $load ( devstr len )
open-dev ( ihandle )
dup 0= if
drop
exit
then
dup >r
" load-base" evaluate swap ( load-base ihandle )
dup ihandle>phandle " load" rot find-method ( xt 0|1 )
if swap call-package !load-size else cr ." Cannot find load for this package" 2drop then
\ If the boot device path doesn't contain an explicit partition id, e.g. cd:,\\:tbxi
\ then the interposed partition package may have auto-probed a suitable partition. If
\ this is the case then it will have set the " selected-partition-args" property in
\ the partition package to contain the new device arguments.
\
\ In order to ensure that bootpath contains the partition argument, we use the contents
\ of this property if it exists to override the boot device arguments when generating
\ the full bootpath using get-instance-path.
my-self
r@ to my-self
" selected-partition-args" get-inherited-property 0= if
decode-string 2swap 2drop
( myself-save partargs-str partargs-len )
r@ ihandle>boot-device-handle if
( myself-save partargs-str partargs-len block-ihandle )
\ Override the arguments before get-instance-path
dup >in.arguments 2@ >r >r dup >r ( R: block-ihandle arg-len arg-str )
>in.arguments 2! ( myself-save )
r@ " get-instance-path" $find if
execute ( myself-save bootpathstr bootpathlen )
then
\ Now write the original arguments back
r> r> r> rot >in.arguments 2! ( myself-save bootpathstr bootpathlen R: )
rot ( bootpathstr bootpathlen myself-save )
then
else
my-self " get-instance-path" $find if
execute ( myself-save bootpathstr pathlen )
rot ( bootpathstr bootpathlen myself-save )
then
then
to my-self
\ Set bootpath property in /chosen
encode-string " /chosen" (find-dev) if
" bootpath" rot (property)
then
r> close-dev
init-program
;
: load ( "{params}<cr>" -- )
linefeed parse
(find-bootdevice)
$load
;
: dir ( "{paths}<cr>" -- )
linefeed parse
ascii , split-after
2dup open-dev dup 0= if
drop
cr ." Unable to locate device " type
2drop
exit
then
-rot 2drop -rot 2 pick
" dir" rot ['] $call-method catch
if
3drop
cr ." Cannot find dir for this package"
then
close-dev
;
: go ( -- )
state-valid @ not if
s" No valid state has been set by load or init-program" type cr
exit
then
\ Call the architecture-specific code to launch the client image
s" (go)" $find if
execute
else
." go is not yet implemented"
2drop
then
;
\ 7.6.3 Abort and resume
\ already defined !?
\ : go ( -- )
\ ;
\ 7.6.4 Disassembler
: dis ( addr -- )
;
: +dis ( -- )
;
\ 7.6.5 Breakpoints
: .bp ( -- )
;
: +bp ( addr -- )
;
: -bp ( addr -- )
;
: --bp ( -- )
;
: bpoff ( -- )
;
: step ( -- )
;
: steps ( n -- )
;
: hop ( -- )
;
: hops ( n -- )
;
\ already defined
\ : go ( -- )
\ ;
: gos ( n -- )
;
: till ( addr -- )
;
: return ( -- )
;
: .breakpoint ( -- )
;
: .step ( -- )
;
: .instruction ( -- )
;
\ 7.6.6 Symbolic debugging
: .adr ( addr -- )
;
: sym ( "name< >" -- n )
;
: sym>value ( addr len -- addr len false | n true )
;
: value>sym ( n1 -- n1 false | n2 addr len true )
;
|