|
|
1.1 root 1: \ *****************************************************************************
2: \ * Copyright (c) 2004, 2008 IBM Corporation
3: \ * All rights reserved.
4: \ * This program and the accompanying materials
5: \ * are made available under the terms of the BSD License
6: \ * which accompanies this distribution, and is available at
7: \ * http://www.opensource.org/licenses/bsd-license.php
8: \ *
9: \ * Contributors:
10: \ * IBM Corporation - initial implementation
11: \ ****************************************************************************/
12:
13: \ (rtas-size) determines the size required for RTAS.
14: \ It looks at the rtas binary in the flash and reads the rtas-size from
15: \ its header at offset 8.
16: : (rtas-size) ( -- rtas-size )
17: s" rtas" romfs-lookup dup 0=
18: ABORT" romfs-lookup for rtas failed"
19: drop 8 + @
20: ;
21:
22: (rtas-size) CONSTANT rtas-size
23:
24: : instantiate-rtas ( adr -- entry )
25: dup rtas-size erase
26: s" rtas" romfs-lookup 0=
27: ABORT" romfs-lookup for rtas failed"
28: rtas-config swap start-rtas ;
29:
30: here fff + fffffffffffff000 and here - allot
31: here rtas-size allot CONSTANT rtas-start-addr
32:
33: rtas-start-addr instantiate-rtas CONSTANT rtas-entry-point
34:
35: : drone-rtas
36: rtas-start-addr
37: dup rtas-size erase
38: 2000000 start-rtas to rtas-entry-point
39: ;
40:
41:
42: \ ffffffffffffffff CONSTANT rtas-entry-point
43:
44: \ rtas control block
45:
46: STRUCT
47: /l field rtas>token
48: /l field rtas>nargs
49: /l field rtas>nret
50: /l field rtas>args0
51: /l field rtas>args1
52: /l field rtas>args2
53: /l field rtas>args3
54: /l field rtas>args4
55: /l field rtas>args5
56: /l field rtas>args6
57: /l field rtas>args7
58: /l C * field rtas>args
59: /l field rtas>bla
60:
61: CONSTANT /rtas-control-block
62:
63: CREATE rtas-cb /rtas-control-block allot
64: rtas-cb /rtas-control-block erase
65:
66: \ call-c ( p0 p1 p2 entry -- ret )
67:
68: : enter-rtas ( -- )
69: rtas-cb rtas-start-addr 0 rtas-entry-point call-c drop ;
70:
71:
72: \ This is the structure of the RTAS function jump table in the C code:
73: STRUCT
74: cell FIELD rtasfunctab>name
75: cell FIELD rtasfunctab>func
76: cell FIELD rtasfunctab>flags
77: CONSTANT rtasfunctab-size
78:
79: \ Create RTAS token properties by analyzing the jump table in the C code:
80: : rtas-create-token-properties ( -- )
81: rtas-start-addr 10 + @ rtas-start-addr + \ Get pointer to jump table
82: rtas-start-addr 18 + @ rtas-start-addr + l@ \ Get the number of entries
83: 0 DO
84: dup rtasfunctab>func @ 0<> \ function pointer must not be NULL
85: over rtasfunctab>flags @ 1 and 0= \ Check the only-internal flag
86: and
87: IF
88: i 1+ encode-int \ Create the token value
89: 2 pick rtasfunctab>name @ zcount \ Create the token name string
90: property \ Create the property
91: THEN
92: rtasfunctab-size + \ Proceed to the next entry
93: LOOP
94: drop
95: ;
96:
97: \ Get the RTAS token that corresponds to an RTAS property name:
98: : rtas-get-token ( str len -- token|0 )
99: rtas-start-addr 10 + @ rtas-start-addr + \ Get pointer to jump table
100: rtas-start-addr 18 + @ rtas-start-addr + l@ \ Get the number of entries
101: 0 DO
102: dup rtasfunctab>name @ \ Get pointer to function name
103: dup 0<> \ function name must not be NULL
104: over zcount 5 pick = nip and \ Check if both strings have same length
105: IF
106: 3 pick 3 pick \ Make a copy of the token name string
107: comp 0=
108: IF
109: drop 2drop
110: i 1+ \ If the name matched, return the token
111: UNLOOP EXIT
112: THEN
113: ELSE
114: drop
115: THEN
116: rtasfunctab-size + \ Proceed to the next entry
117: LOOP
118: drop
119: ." RTAS token not found: " type cr
120: 0
121: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.