Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / fs / start-up.fs
diff --git a/qemu/roms/SLOF/slof/fs/start-up.fs b/qemu/roms/SLOF/slof/fs/start-up.fs
new file mode 100644 (file)
index 0000000..f1488fa
--- /dev/null
@@ -0,0 +1,171 @@
+\ *****************************************************************************
+\ * 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
+\ ****************************************************************************/
+
+: (boot) ( -- )
+   s" Executing following boot-command: "
+   boot-command $cat nvramlog-write-string-cr
+   s" boot-command" evaluate      \ get boot command
+   ['] evaluate catch ?dup IF     \ and execute it
+      ." boot attempt returned: "
+      abort"-str @ count type cr
+      nip nip                     \ drop string from 1st evaluate
+      throw
+   THEN
+;
+
+\ Note: The following ESC sequences has to be handled:
+\     1B 4F 50
+\     1B 5B 31 31 7E
+
+\ Reads and converts the function key.
+\ key = F1 -- n = 1
+: (function-key) ( -- n )
+   key? IF
+      key CASE
+        50  OF 1 ENDOF
+        7e  OF 1 ENDOF
+        dup OF 0 ENDOF
+      ENDCASE
+   THEN
+;
+
+\ Checks if an ESC sequence occurs.
+: (esc-sequence) ( -- n )
+   key? IF
+      key CASE
+         4f  OF (function-key) ENDOF
+         5b  OF
+            key key (function-key) ENDOF
+         dup OF 0 ENDOF
+       ENDCASE
+   THEN
+;
+
+: (s-pressed) ( -- )
+   s" An 's' has been pressed. Entering Open Firmware Prompt"
+   nvramlog-write-string-cr
+;
+
+: (boot?) ( -- )
+   of-prompt? not auto-boot? and IF
+      (boot)
+   THEN
+;
+
+
+#include "sms/sms-load.fs"
+
+
+\ Watchdog will be rearmed during load if use-load-watchdog variable is TRUE
+TRUE VALUE use-load-watchdog?
+
+1 value my-boot-dev
+1 value digit-val
+0 value boot-dev-no
+
+: boot-selected
+   1 to my-boot-dev
+   BEGIN parse-word dup WHILE
+      boot-dev-no my-boot-dev = IF
+         s" boot " 2swap $cat
+         ['] evaluate catch ?dup IF     \ and execute it
+            ." boot attempt returned: "
+            abort"-str @ count type cr
+            throw
+         THEN
+         0 0 load-list 2!
+         UNLOOP EXIT
+      ELSE
+         2drop
+      THEN
+      my-boot-dev 1 + to my-boot-dev
+   REPEAT 2drop 0 0 load-list 2!
+
+   (boot)
+;
+
+: boot-start
+   \ Remove multiple F12 key presses if any
+   BEGIN key? WHILE
+      key drop
+   REPEAT
+
+   decimal
+   BEGIN parse-word dup WHILE
+      my-boot-dev (u.) s" . " $cat type 2dup type ." : " de-alias type cr
+      my-boot-dev 1 + to my-boot-dev
+   REPEAT 2drop 0 0 load-list 2!
+
+   cr BEGIN KEY dup emit
+      dup isdigit IF
+         dup 30 - to digit-val
+         boot-dev-no a * digit-val + to boot-dev-no
+      THEN
+   d = UNTIL
+
+   boot-dev-no my-boot-dev < IF
+      s" boot-selected " s" $bootdev" evaluate $cat strdup evaluate
+   ELSE
+      ." Invalid choice!" cr
+   THEN
+   hex
+;
+
+: boot-menu-start
+   ." Select boot device:" cr cr
+   s" boot-start " s" $bootdev" evaluate $cat strdup evaluate
+;
+
+: boot-menu-enabled? ( -- true|false )
+   s" qemu,boot-menu" get-chosen IF
+      decode-int 1 = IF
+         2drop TRUE EXIT
+      THEN
+      2drop
+   THEN
+   FALSE
+;
+
+: f12-pressed?
+   34 = >r 32 = r> and IF
+      TRUE
+   ELSE
+      FALSE
+   THEN
+;
+
+: start-it ( -- )
+   key? IF
+      key CASE
+        [char] s  OF (s-pressed) ENDOF
+        1b        OF
+            (esc-sequence) CASE
+                1   OF
+                        console-clean-fifo
+                        f12-pressed? boot-menu-enabled? and IF
+                          boot-menu-start
+                        ELSE
+                           (boot?)
+                        THEN
+                     ENDOF
+                dup OF (boot?) ENDOF
+            ENDCASE
+        ENDOF
+        dup OF (boot?) ENDOF
+      ENDCASE
+   ELSE
+      (boot?)
+   THEN
+
+   disable-watchdog  FALSE to use-load-watchdog?
+   .banner
+;