Annotation of qemu/roms/SLOF/slof/fs/rtas/rtas-init.fs, revision 1.1

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: ;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.