121 lines
3.5 KiB
Forth
121 lines
3.5 KiB
Forth
\ *****************************************************************************
|
|
\ * Copyright (c) 2004, 2008 IBM Corporation
|
|
\ * All rights reserved.
|
|
\ * This program and the accompanying materials
|
|
\ * are made available under the terms of the BSD License
|
|
\ * which accompanies this distribution, and is available at
|
|
\ * http://www.opensource.org/licenses/bsd-license.php
|
|
\ *
|
|
\ * Contributors:
|
|
\ * IBM Corporation - initial implementation
|
|
\ ****************************************************************************/
|
|
|
|
\ (rtas-size) determines the size required for RTAS.
|
|
\ It looks at the rtas binary in the flash and reads the rtas-size from
|
|
\ its header at offset 8.
|
|
: (rtas-size) ( -- rtas-size )
|
|
s" rtas" romfs-lookup dup 0=
|
|
ABORT" romfs-lookup for rtas failed"
|
|
drop 8 + @
|
|
;
|
|
|
|
(rtas-size) CONSTANT rtas-size
|
|
|
|
: instantiate-rtas ( adr -- entry )
|
|
dup rtas-size erase
|
|
s" rtas" romfs-lookup 0=
|
|
ABORT" romfs-lookup for rtas failed"
|
|
rtas-config swap start-rtas ;
|
|
|
|
here fff + fffffffffffff000 and here - allot
|
|
here rtas-size allot CONSTANT rtas-start-addr
|
|
|
|
rtas-start-addr instantiate-rtas CONSTANT rtas-entry-point
|
|
|
|
: drone-rtas
|
|
rtas-start-addr
|
|
dup rtas-size erase
|
|
2000000 start-rtas to rtas-entry-point
|
|
;
|
|
|
|
|
|
\ ffffffffffffffff CONSTANT rtas-entry-point
|
|
|
|
\ rtas control block
|
|
|
|
STRUCT
|
|
/l field rtas>token
|
|
/l field rtas>nargs
|
|
/l field rtas>nret
|
|
/l field rtas>args0
|
|
/l field rtas>args1
|
|
/l field rtas>args2
|
|
/l field rtas>args3
|
|
/l field rtas>args4
|
|
/l field rtas>args5
|
|
/l field rtas>args6
|
|
/l field rtas>args7
|
|
/l C * field rtas>args
|
|
/l field rtas>bla
|
|
|
|
CONSTANT /rtas-control-block
|
|
|
|
CREATE rtas-cb /rtas-control-block allot
|
|
rtas-cb /rtas-control-block erase
|
|
|
|
\ call-c ( p0 p1 p2 entry -- ret )
|
|
|
|
: enter-rtas ( -- )
|
|
rtas-cb rtas-start-addr 0 rtas-entry-point call-c drop ;
|
|
|
|
|
|
\ This is the structure of the RTAS function jump table in the C code:
|
|
STRUCT
|
|
cell FIELD rtasfunctab>name
|
|
cell FIELD rtasfunctab>func
|
|
cell FIELD rtasfunctab>flags
|
|
CONSTANT rtasfunctab-size
|
|
|
|
\ Create RTAS token properties by analyzing the jump table in the C code:
|
|
: rtas-create-token-properties ( -- )
|
|
rtas-start-addr 10 + @ rtas-start-addr + \ Get pointer to jump table
|
|
rtas-start-addr 18 + @ rtas-start-addr + l@ \ Get the number of entries
|
|
0 DO
|
|
dup rtasfunctab>func @ 0<> \ function pointer must not be NULL
|
|
over rtasfunctab>flags @ 1 and 0= \ Check the only-internal flag
|
|
and
|
|
IF
|
|
i 1+ encode-int \ Create the token value
|
|
2 pick rtasfunctab>name @ zcount \ Create the token name string
|
|
property \ Create the property
|
|
THEN
|
|
rtasfunctab-size + \ Proceed to the next entry
|
|
LOOP
|
|
drop
|
|
;
|
|
|
|
\ Get the RTAS token that corresponds to an RTAS property name:
|
|
: rtas-get-token ( str len -- token|0 )
|
|
rtas-start-addr 10 + @ rtas-start-addr + \ Get pointer to jump table
|
|
rtas-start-addr 18 + @ rtas-start-addr + l@ \ Get the number of entries
|
|
0 DO
|
|
dup rtasfunctab>name @ \ Get pointer to function name
|
|
dup 0<> \ function name must not be NULL
|
|
over zcount 5 pick = nip and \ Check if both strings have same length
|
|
IF
|
|
3 pick 3 pick \ Make a copy of the token name string
|
|
comp 0=
|
|
IF
|
|
drop 2drop
|
|
i 1+ \ If the name matched, return the token
|
|
UNLOOP EXIT
|
|
THEN
|
|
ELSE
|
|
drop
|
|
THEN
|
|
rtasfunctab-size + \ Proceed to the next entry
|
|
LOOP
|
|
drop
|
|
." RTAS token not found: " type cr
|
|
0
|
|
;
|