Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / fs / rtas / rtas-init.fs
diff --git a/qemu/roms/SLOF/slof/fs/rtas/rtas-init.fs b/qemu/roms/SLOF/slof/fs/rtas/rtas-init.fs
new file mode 100644 (file)
index 0000000..8451cfd
--- /dev/null
@@ -0,0 +1,121 @@
+\ *****************************************************************************
+\ * 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
+;