summaryrefslogtreecommitdiff
path: root/usr/src/boot/forth
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/boot/forth')
-rw-r--r--usr/src/boot/forth/Makefile11
-rw-r--r--usr/src/boot/forth/brand-smartos.4th38
-rw-r--r--usr/src/boot/forth/loader.4th18
-rw-r--r--usr/src/boot/forth/loader.rc10
-rw-r--r--usr/src/boot/forth/logo-smartos.4th41
-rw-r--r--usr/src/boot/forth/menu-commands.4th114
-rw-r--r--usr/src/boot/forth/menu.4th44
-rw-r--r--usr/src/boot/forth/support.4th15
-rw-r--r--usr/src/boot/forth/triton-logo.pngbin0 -> 13720 bytes
-rw-r--r--usr/src/boot/forth/triton.menu.rc109
-rw-r--r--usr/src/boot/forth/triton.pngbin0 -> 2561 bytes
11 files changed, 395 insertions, 5 deletions
diff --git a/usr/src/boot/forth/Makefile b/usr/src/boot/forth/Makefile
index 5de1fc3878..5d43a4e9ad 100644
--- a/usr/src/boot/forth/Makefile
+++ b/usr/src/boot/forth/Makefile
@@ -11,6 +11,8 @@
#
# Copyright 2022 Toomas Soome <tsoome@me.com>
+# Copyright 2022 Joyent, Inc.
+# Copyright 2022 MNX Cloud, Inc.
#
include $(SRC)/Makefile.master
@@ -27,6 +29,7 @@ FORTH = beastie.4th
FORTH += beadm.4th
FORTH += brand.4th
FORTH += brand-illumos.4th
+FORTH += brand-smartos.4th
FORTH += check-password.4th
FORTH += color.4th
FORTH += delay.4th
@@ -40,6 +43,7 @@ FORTH += logo-fbsdbw.4th
FORTH += logo-illumos.4th
FORTH += logo-orb.4th
FORTH += logo-orbbw.4th
+FORTH += logo-smartos.4th
FORTH += menu.4th
FORTH += menu.rc
FORTH += menu-commands.4th
@@ -51,6 +55,8 @@ FORTH += support.4th
FORTH += version.4th
FILES += illumos-logo.png
FILES += illumos-brand.png
+FILES += triton-logo.png
+FILES += triton.png
FILES += loader.rc
all clean clobber:
@@ -64,6 +70,11 @@ $(ROOT_BOOT)/%: % $(ROOT_BOOT)
$(ROOT_BOOT_DEFAULTS)/%: % $(ROOT_BOOT_DEFAULTS)
$(INS.file)
+$(ROOT_BOOT_FORTH)/menu.rc: triton.menu.rc $(ROOT_BOOT_FORTH)
+ $(RM) $@; \
+ $(INS) -s -m $(FILEMODE) -f $(@D) triton.menu.rc; \
+ $(MV) $(@D)/triton.menu.rc $@
+
$(ROOT_BOOT_FORTH)/%: % $(ROOT_BOOT_FORTH)
$(INS.file)
diff --git a/usr/src/boot/forth/brand-smartos.4th b/usr/src/boot/forth/brand-smartos.4th
new file mode 100644
index 0000000000..acdbcf13af
--- /dev/null
+++ b/usr/src/boot/forth/brand-smartos.4th
@@ -0,0 +1,38 @@
+\
+\ This file and its contents are supplied under the terms of the
+\ Common Development and Distribution License ("CDDL"), version 1.0.
+\ You may only use this file in accordance with the terms of version
+\ 1.0 of the CDDL.
+\
+\ A full copy of the text of the CDDL should have accompanied this
+\ source. A copy of the CDDL is also available via the Internet at
+\ http://www.illumos.org/license/CDDL.
+\
+
+\
+\ Copyright 2019 Joyent, Inc.
+\ Copyright 2022 MNX Cloud, Inc.
+\
+
+2 brandX ! 1 brandY ! \ Initialize brand placement defaults
+
+: brand+ ( x y c-addr/u -- x y' )
+ 2swap 2dup at-xy 2swap \ position the cursor
+ type \ print to the screen
+ 1+ \ increase y for next time we're called
+;
+
+: brand ( x y -- ) \ "triton" [wide] logo in B/W (7 rows x 42 columns)
+
+ 0 1 1 0 0 s" /boot/triton-logo.png" fb-putimage if 2drop exit then
+
+ s" " brand+
+ s" ##### #### # ##### ### # # " brand+
+ s" # # # # # # # ## # " brand+
+ s" # #### # # # # # # # " brand+
+ s" # # # # # # # # ## " brand+
+ s" # # # # # # # # ## " brand+
+ s" # # # # # ### # # TM " brand+
+
+ 2drop
+;
diff --git a/usr/src/boot/forth/loader.4th b/usr/src/boot/forth/loader.4th
index d010b72a33..9bd01644e0 100644
--- a/usr/src/boot/forth/loader.4th
+++ b/usr/src/boot/forth/loader.4th
@@ -606,6 +606,24 @@ only forth definitions also support-functions
then
;
+create pathname 1024 chars allot
+
+: set-platform ( c-addr u -- )
+ 2dup
+ pathname place
+ s" /platform/i86pc/kernel/amd64/unix" pathname append
+ pathname count s" bootfile" setenv
+ pathname count erase
+ 2dup
+ pathname place
+ s" /platform/i86pc/amd64/boot_archive" pathname append
+ pathname count s" boot_archive" set-module-path
+ pathname count erase
+ pathname place
+ s" /platform/i86pc/amd64/boot_archive.hash" pathname append
+ pathname count s" boot_archive.hash" set-module-path
+;
+
\ Words to be used inside configuration files
: retry false ; \ For use in load error commands
diff --git a/usr/src/boot/forth/loader.rc b/usr/src/boot/forth/loader.rc
index 32f6bf8043..989a014da4 100644
--- a/usr/src/boot/forth/loader.rc
+++ b/usr/src/boot/forth/loader.rc
@@ -2,6 +2,16 @@
\
\ Includes additional commands
include /boot/forth/loader.4th
+
+\ For SmartOS, override the default color scheme back to the more traditional
+\ black background and white foreground.
+set tem.fg_color=white
+set tem.bg_color=black
+
+\ As another SmartOS customization, work around OS-8160 by limiting the size of
+\ the framebuffer.
+framebuffer set 1024x768
+
try-include /boot/loader.rc.local
\ Reads and processes loader.conf variables
diff --git a/usr/src/boot/forth/logo-smartos.4th b/usr/src/boot/forth/logo-smartos.4th
new file mode 100644
index 0000000000..f897c45165
--- /dev/null
+++ b/usr/src/boot/forth/logo-smartos.4th
@@ -0,0 +1,41 @@
+\
+\ This file and its contents are supplied under the terms of the
+\ Common Development and Distribution License ("CDDL"), version 1.0.
+\ You may only use this file in accordance with the terms of version
+\ 1.0 of the CDDL.
+\
+\ A full copy of the text of the CDDL should have accompanied this
+\ source. A copy of the CDDL is also available via the Internet at
+\ http://www.illumos.org/license/CDDL.
+\
+
+\
+\ Copyright 2019 Joyent, Inc.
+\
+
+52 logoX ! 11 logoY ! \ Initialize logo placement defaults
+
+: logo+ ( x y c-addr/u -- x y' )
+ 2swap 2dup at-xy 2swap \ position the cursor
+ [char] @ escc! \ replace @ with Esc
+ type \ print to the screen
+ 1+ \ increase y for next time we're called
+;
+
+: logo ( x y -- ) \ color Illumos logo
+
+ 0 0 0 0 0 s" /boot/triton.png" fb-putimage if 2drop exit then
+
+ s" @[31m--@[0;31m+--@[1;31m*@[0;33m--@[1;33m*" logo+
+ s" @[31m|@[1m\@[0m @[31m|\ |@[33m\ @[1m|\" logo+
+ s" @[31m| @[1m\@[0;31m|@[37m @[31m\| @[33m\@[1m| \" logo+
+ s" @[31m+--@[1;31m*@[31m--+@[0;33m--@[1;33m*@[33m--@[33m*" logo+
+ s" |@[31m\ |\ |\ @[33m|@[1m\ |" logo+
+ s" | @[31m\| \| \@[33m| @[1m\|" logo+
+ s" @[1m*@[0m--+@[31m--+@[33m--+@[1m--+" logo+
+ s" @[1m \ |@[0;34m\ |\ |@[1m\ |" logo+
+ s" @[1m \| @[0;34m\| \| @[1m\|" logo+
+ s" @[1m *--+@[0;34m--@[1;34m*@[34m--@[34m*" logo+
+
+ 2drop
+;
diff --git a/usr/src/boot/forth/menu-commands.4th b/usr/src/boot/forth/menu-commands.4th
index 5fe6c8c62f..4938608fb5 100644
--- a/usr/src/boot/forth/menu-commands.4th
+++ b/usr/src/boot/forth/menu-commands.4th
@@ -41,6 +41,43 @@ variable kmdb_state
also menu-namespace also menu-command-helpers
+\ PATH_MAX + 6
+create chaincmd 1030 chars allot
+
+\
+\ Rollback to previous platform image.
+\ Used by Joyent Triton
+\
+: rollback_boot ( N -- NOTREACHED )
+ dup
+ s" prev-platform" getenv s" bootfile" setenv
+ s" prev-archive" getenv s" boot_archive" set-module-path
+ s" prev-hash" getenv s" boot_archive.hash" set-module-path
+ 0 boot ( state -- )
+;
+
+\
+\ Boot from ipxe kernel
+\ Used by Joyent Triton when booted in BIOS/CSM mode
+\
+: ipxe_boot ( N -- NOTREACHED )
+ dup
+ s" ipxe-bootfile" getenv s" bootfile" setenv
+ s" ipxe-archive" getenv s" boot_archive" set-module-path
+ s" boot_archive.hash" disable-module
+ 0 boot ( state -- )
+;
+
+\
+\ Chainload the ipxe EFI binary
+\ Used by Joyent Triton when booted in UEFI mode
+\
+: ipxe_chainload ( N -- NOTREACHED )
+ s" chain " chaincmd place
+ s" ipxe-efi" getenv chaincmd append
+ chaincmd count evaluate
+;
+
\
\ Boot
\
@@ -102,6 +139,25 @@ also menu-namespace also menu-command-helpers
;
\
+\ Platform-image selection for standalone SmartOS is mostly in pi.rc.
+\ We will also steal a boot environment routine in pi_draw_screen (way below).
+
+: init_pi ( -- )
+ s" bootpi" getenv? 0= if
+ s" default" s" bootpi" setenv
+ then
+
+ \ Reset the "options" text to show current bootpi selected.
+ s" set menu_optionstext=${pitext}${bootpi}" evaluate
+ s" set pimenu_optionstext=${pitext}${bootpi}" evaluate
+;
+
+\ Shorter than inlining this in pi.rc.
+: pi_unload ( -- )
+ s" unload" evaluate
+;
+
+\
\ Single User Mode
\
@@ -246,6 +302,53 @@ also menu-namespace also menu-command-helpers
;
\
+\ Disaster Recovery boot
+\
+
+: rescue_enabled? ( -- flag )
+ s" noimport" getenv -1 <> dup if
+ swap drop ( c-addr flag -- flag )
+ then
+;
+
+: rescue_enable ( -- )
+ s" set noimport=true" evaluate
+ s" smartos" getenv? if
+ s" set standalone=true" evaluate
+ s" set smartos=false" evaluate
+ then
+;
+
+: rescue_disable ( -- )
+ s" noimport" unsetenv
+ s" standalone" unsetenv
+ s" smartos" getenv? if
+ s" set smartos=true" evaluate
+ then
+;
+
+: init_rescue ( N -- N )
+ rescue_enabled? if
+ toggle_menuitem ( n -- n )
+ then
+;
+
+: toggle_rescue ( N -- N TRUE )
+ toggle_menuitem
+ menu-redraw
+
+ \ Now we're going to make the change effective
+
+ dup toggle_stateN @ 0= if
+ rescue_disable
+ else
+ rescue_enable
+ then
+
+ TRUE \ loop menu again
+;
+
+\
\ Escape to Prompt
\
@@ -505,6 +608,17 @@ also menu-namespace also menu-command-helpers
menu-init \ Initialize menu and draw bounding box (in menu.4th)
;
+\ PI reuse of be_draw_screen, plus some other things to be used by pi.rc.
+
+: pi_draw_screen ( -- TRUE )
+ \ So we can make SURE we have the current boot PI on display.
+ init_pi
+
+ be_draw_screen
+ menu-redraw
+ TRUE
+;
+
\
\ Select a boot environment
\
diff --git a/usr/src/boot/forth/menu.4th b/usr/src/boot/forth/menu.4th
index 1fd20811c6..fee6ec3806 100644
--- a/usr/src/boot/forth/menu.4th
+++ b/usr/src/boot/forth/menu.4th
@@ -3,6 +3,7 @@
\ Copyright (c) 2006-2015 Devin Teske <dteske@FreeBSD.org>
\ Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
\ All rights reserved.
+\ Copyright 2019 Joyent, Inc.
\
\ Redistribution and use in source and binary forms, with or without
\ modification, are permitted provided that the following conditions
@@ -332,7 +333,7 @@ also menu-infrastructure definitions
\ Print the frame caption at (x,y)
s" loader_menu_title" getenv dup -1 = if
- drop s" Welcome to illumos"
+ drop s" Welcome to SmartOS"
then
TRUE ( use default alignment )
s" loader_menu_title_align" getenv dup -1 <> if
@@ -549,14 +550,39 @@ also menu-infrastructure definitions
then
;
-\ Takes an integer on the stack and updates the timeout display.
+: do_ipxe ( -- bool)
+ \ getenv? leaves -1 on stack if the env var exists. Thus if both
+ \ headnode and ipxe exist then the sum of what will be left on the
+ \ stack should be -2.
+ s" headnode" getenv? s" ipxe" getenv? + -2 = if
+ s" ipxe" getenv s" true" compare 0= if
+ true
+ else
+ false
+ then
+ else
+ false
+ then
+;
+
+\ Takes a single integer on the stack and updates the timeout display. The
+\ integer must be between 0 and 9 (we will only update a single digit in the
+\ source message).
\
: menu-timeout-update ( N -- )
\ Enforce minimum
dup 0 < if drop 0 then
- menu_timeout_x @ menu_timeout_y @ at-xy \ position cursor
+ s" headnode" getenv? if
+ do_ipxe if
+ s" Autoboot in N seconds from PXE. [Space] to pause" ( n -- n c-addr/u )
+ else
+ s" Autoboot in N seconds from the USB Key. [Space] to pause" ( n -- n c-addr/u )
+ then
+ else
+ s" Autoboot in N seconds. [Space] to pause" ( n -- n c-addr/u )
+ then
dup 0> if
s" Autoboot in " type
@@ -1012,8 +1038,16 @@ also menu-namespace
dup over 13 = swap 10 = or if
drop ( no longer needed )
cursor-normal cursor-set
- s" boot" evaluate
- exit ( pedantic; never reached )
+ do_ipxe if
+ s" efi-version" getenv? if
+ s" ipxe_chainload" evaluate
+ else
+ s" ipxe_boot" evaluate
+ then
+ else
+ s" boot" evaluate
+ exit ( pedantic; never reached )
+ then
then
dup menureboot @ = if 0 reboot then
diff --git a/usr/src/boot/forth/support.4th b/usr/src/boot/forth/support.4th
index 2abf48f70b..961d3b528a 100644
--- a/usr/src/boot/forth/support.4th
+++ b/usr/src/boot/forth/support.4th
@@ -245,6 +245,21 @@ create last_module_option sizeof module.next allot 0 last_module_option !
then
;
+\ Place string into an allocated buffer
+\
+\ e.g
+\ create mystring 32 chars allot
+\ s" Burning down " mystring place
+\
+: place over over >r >r char+ swap chars move r> r> c! ;
+
+\ Append string
+\
+\ e.g.
+\ s" the house!" mystring append
+\
+: append over over >r >r count chars + swap chars move r> r> dup >r c@ + r> c! ;
+
\ execute xt for each device listed in console variable.
\ this allows us to have device specific output for logos, menu frames etc
: console-iterate { xt | caddr clen taddr tlen -- }
diff --git a/usr/src/boot/forth/triton-logo.png b/usr/src/boot/forth/triton-logo.png
new file mode 100644
index 0000000000..79e917b1e8
--- /dev/null
+++ b/usr/src/boot/forth/triton-logo.png
Binary files differ
diff --git a/usr/src/boot/forth/triton.menu.rc b/usr/src/boot/forth/triton.menu.rc
new file mode 100644
index 0000000000..3dddb7ffe7
--- /dev/null
+++ b/usr/src/boot/forth/triton.menu.rc
@@ -0,0 +1,109 @@
+\ Menu.rc
+\
+\ Load required Forth modules
+include /boot/forth/version.4th
+include /boot/forth/brand.4th
+include /boot/forth/menu.4th
+include /boot/forth/menu-commands.4th
+include /boot/forth/shortcuts.4th
+
+\ Screen prep
+clear \ clear the screen (see `screen.4th')
+print_version \ print version string (bottom-right; see `version.4th')
+draw-beastie \ draw freebsd mascot (on right; see `beastie.4th')
+draw-brand \ draw the FreeBSD title (top-left; see `brand.4th')
+menu-init \ initialize the menu area (see `menu.4th')
+
+\ Initialize main menu constructs (see `menu.4th')
+\ NOTE: To use `non-ansi' variants, add `loader_color=0' to loader.conf(5)
+\ NOTE: ANSI variants can use `^' in place of literal `Esc' (ASCII 27)
+
+\
+\ MAIN MENU
+\
+
+set menuset_name1="main"
+
+set mainmenu_init[1]="init_boot"
+
+set mainmenu_caption[1]="Boot SmartOS [Enter]"
+set mainansi_caption[1]="^[1mB^[moot SmartOS ^[1m[Enter]^[m"
+set mainmenu_command[1]="boot"
+\ keycode set by init_boot
+
+set mainmenu_caption[2]="[Esc]ape to loader prompt"
+set mainmenu_command[2]="goto_prompt"
+set mainmenu_keycode[2]=27
+set mainansi_caption[2]="^[1mEsc^[mape to loader prompt"
+
+\ Enable built-in "Reboot" trailing menuitem
+\ NOTE: appears before menu_options if configured
+\
+set mainmenu_reboot
+
+\ Enable "Options:" separator. When set to a numerical value (1-8), a visual
+\ separator is inserted before that menuitem number.
+\
+set mainmenu_options=4
+
+set mainmenu_caption[4]="Configure Boot [O]ptions..."
+set mainmenu_command[4]="2 goto_menu"
+set mainmenu_keycode[4]=111
+set mainansi_caption[4]="Configure Boot ^[1mO^[mptions..."
+
+\
+\ If available, load the "Platform Image Selection" option.
+\
+try-include /os/pi.rc
+
+\
+\ BOOT OPTIONS MENU
+\
+
+set menuset_name2="options"
+
+set optionsmenu_caption[1]="Back to Main Menu [Backspace]"
+set optionsmenu_command[1]="1 goto_menu"
+set optionsmenu_keycode[1]=8
+set optionsansi_caption[1]="Back to Main Menu ^[1m[Backspace]^[m"
+
+set optionsmenu_options=2
+set optionsmenu_optionstext="Boot Options:"
+
+set optionsmenu_osconsole=2
+set optionsmenu_command[2]="cycle_osconsole"
+set optionsmenu_keycode[2]=99
+
+set optionsmenu_init[3]="init_verbose"
+set optionsmenu_caption[3]="[V]erbose............. Off"
+set optionstoggled_text[3]="[V]erbose............. On"
+set optionsmenu_command[3]="toggle_verbose"
+set optionsmenu_keycode[3]=118
+set optionsansi_caption[3]="^[1mV^[merbose............... ^[34;1mOff^[m"
+set optionstoggled_ansi[3]="^[1mV^[merbose............... ^[32;7mOn^[m"
+
+set optionsmenu_kmdb=4
+set optionsmenu_command[4]="cycle_kmdb"
+set optionsmenu_keycode[4]=107
+
+set optionsmenu_init[5]="init_rescue"
+set optionsmenu_caption[5]="[R]escue Mode......... Off"
+set optionstoggled_text[5]="[R]escue Mode......... On"
+set optionsmenu_command[5]="toggle_rescue"
+set optionsmenu_keycode[5]=114
+set optionsansi_caption[5]="^[1mR^[mescue Mode........... ^[34;1mOff^[m"
+set optionstoggled_ansi[5]="^[1mR^[mescue Mode........... ^[32;7mOn^[m"
+
+\ Enable automatic booting (add ``autoboot_delay=N'' to loader.conf(5) to
+\ customize the timeout; default is 10-seconds)
+\
+set menu_timeout_command="boot"
+
+\ Include optional elements defined in a local file
+\
+try-include /boot/menu.rc.local
+
+\ Display the main menu (see `menu.4th')
+set menuset_initial=1
+menuset-loadinitial
+menu-display
diff --git a/usr/src/boot/forth/triton.png b/usr/src/boot/forth/triton.png
new file mode 100644
index 0000000000..9b7e9a94b6
--- /dev/null
+++ b/usr/src/boot/forth/triton.png
Binary files differ