| \ ***************************************************************************** |
| \ * 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 |
| ; |