summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/slof/fs/fcode/evaluator.fs
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/SLOF/slof/fs/fcode/evaluator.fs')
-rw-r--r--qemu/roms/SLOF/slof/fs/fcode/evaluator.fs119
1 files changed, 119 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/slof/fs/fcode/evaluator.fs b/qemu/roms/SLOF/slof/fs/fcode/evaluator.fs
new file mode 100644
index 000000000..8f0bae527
--- /dev/null
+++ b/qemu/roms/SLOF/slof/fs/fcode/evaluator.fs
@@ -0,0 +1,119 @@
+\ *****************************************************************************
+\ * Copyright (c) 2004, 2011 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
+\ ****************************************************************************/
+
+
+variable ip
+variable fcode-end
+variable fcode-num
+ 1 value fcode-spread
+ 2 value fcode-offset
+false value eva-debug?
+true value fcode-debug?
+defer fcode-rb@
+defer fcode@
+
+' c@ to fcode-rb@
+
+create token-table 2000 cells allot \ 1000h = 4096d
+
+#include "core.fs"
+#include "1275.fs"
+#include "tokens.fs"
+#include "locals.fs"
+
+0 value buff
+0 value buff-size
+
+' read-fcode# to fcode@
+
+( ---------------------------------------------------- )
+
+: execute-rom-fcode ( addr len | false -- )
+ reset-fcode-end
+ ?dup IF
+ diagnostic-mode? IF ." , executing ..." cr THEN
+ dup >r r@ alloc-mem dup >r swap rmove
+ r@ set-ip evaluate-fcode
+ diagnostic-mode? IF ." Done." cr THEN
+ r> r> free-mem
+ THEN
+;
+
+: rom-code-ignored ( image-addr name len -- image-addr )
+ diagnostic-mode? IF
+ type ." code found in image " dup . ." , ignoring ..." cr
+ ELSE
+ 2drop
+ THEN
+;
+
+: pci-find-rom ( baseaddr -- addr )
+ dup IF
+ dup rw@-le aa55 = IF
+ diagnostic-mode? IF ." Device ROM header found at " dup . cr THEN
+ ELSE
+ drop 0
+ THEN
+ THEN
+;
+
+: pci-find-fcode ( baseaddr -- addr len | false )
+ BEGIN
+ 1ff NOT and \ Image must start at 512 byte boundary
+ pci-find-rom dup
+ WHILE
+ dup 18 + rw@-le + ( pcir-addr )
+ \ Check for PCIR magic ... since pcir-addr might not be
+ \ 4-byte aligned, we've got to use two reads here:
+ dup rw@-le 4350 ( 'PC' ) <> ( pcir-addr hasPC? )
+ over 2+ rw@-le 5249 ( 'IR' ) <> OR IF
+ diagnostic-mode? IF
+ ." Invalid PCI Data structure, ignoring ROM contents" cr
+ THEN
+ drop false EXIT
+ THEN ( pcir-addr )
+ dup 14 + rb@ CASE \ Get image code type
+ 0 OF s" Intel x86 BIOS" rom-code-ignored ENDOF
+ 1 OF
+ diagnostic-mode? IF
+ ." Open Firmware FCode found in image at " dup . cr
+ THEN
+ dup 1ff NOT AND \ Back to the ROM image header
+ dup 2+ rw@-le + \ Pointer to FCODE (PCI bus binding ch.9)
+ swap 10 + rw@-le 200 * \ Image length
+ EXIT
+ ENDOF
+ 2 OF s" HP PA RISC" rom-code-ignored ENDOF
+ 3 OF s" EFI" rom-code-ignored ENDOF
+ dup OF s" Unknown type" rom-code-ignored ENDOF
+ ENDCASE
+ dup 15 + rb@ 80 and IF \ End of last image?
+ drop false EXIT
+ THEN
+ dup 10 + rw@-le 200 * + \ Next image start
+ REPEAT
+;
+
+
+\ Prepare and run a FCODE program from a PCI Option ROM.
+: pci-execute-fcode ( baseaddr -- )
+ pci-find-fcode dup 0= IF
+ 2drop EXIT
+ THEN ( addr len )
+ fc-set-pci-mmio-tokens \ Prepare PCI access functions
+ \ Now run the FCODE:
+ ['] execute-rom-fcode CATCH IF
+ cr ." FCODE failed!" cr
+ 2drop
+ THEN
+ fc-set-normal-mmio-tokens \ Restore normal MMIO access functions
+;