#!/bin/ash
mknod /dev/ttyprintk c 5 3
echo "hello world" > /dev/ttyprintk

# Setup our path
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

# This is the very first script invoked by the Linux kernel and is
# running out of the ram disk.  There are no fileysstems mounted.
# It is important to have a way to invoke a recovery shell in case
# the boot scripts are messed up, but also important to modify the
# PCRs if this happens to prevent the TPM disk keys from being revealed.

# First thing it is vital to mount the /dev and other system directories
mkdir /proc /sys /dev /tmp /boot /media 2>&- 1>&-
mount /dev 2>/dev/ttyprintk
mount /proc 2>/dev/ttyprintk
mount /sys 2>/dev/ttyprintk
mount /sys/firmware/efi/efivars

# Setup the pty psudeo filesystem
mkdir /dev/pts
mount /dev/pts 2>/dev/ttyprintk

if [ ! -r /dev/ptmx ]; then
	ln -s /dev/pts/ptmx /dev/ptmx
fi

# Recovery shells will erase anything from here
mkdir -p /tmp/secret

# Now it is safe to print a banner
if [ -r /etc/motd ]; then
	cat /etc/motd
	cat /etc/motd > /dev/tty0
fi

# Load the date from the hardware clock, setting it in local time
hwclock -l -s

# Read the system configuration parameters
. /etc/functions
. /etc/config

# Add our boot devices into the /etc/fstab, if they are defined
# in the configuration file.
if [ ! -z "$CONFIG_BOOT_DEV" ]; then
	echo >> /etc/fstab "$CONFIG_BOOT_DEV /boot auto defaults,ro 0 0"
fi
if [ ! -z "$CONFIG_USB_BOOT_DEV" ]; then
	echo >> /etc/fstab "$CONFIG_USB_BOOT_DEV /media auto defaults,ro 0 0"
fi

if [ "$CONFIG_COREBOOT" = "y" ]; then
	/bin/cbfs-init
fi
if [ "$CONFIG_LINUXBOOT" = "y" ]; then
	/bin/uefi-init
fi
/bin/key-init

# Setup recovery serial shell
if [ ! -z "$CONFIG_BOOT_RECOVERY_SERIAL" ]; then
	stty -F "$CONFIG_BOOT_RECOVERY_SERIAL" 115200
	pause_recovery 'Console recovery shell' \
		< "$CONFIG_BOOT_RECOVERY_SERIAL" \
		> "$CONFIG_BOOT_RECOVERY_SERIAL" 2>&1 &
fi

# If the user has been holding down r, enter a recovery shell
# otherwise immediately start the configured boot script.
# We don't print a prompt, since this is a near instant timeout.
read \
	-t 0.1 \
	-n 1 \
	boot_option
echo

if [ "$boot_option" = "r" ]; then
	# Start an interactive shell
	recovery 'User requested recovery shell'
	# just in case...
	if [ "$CONFIG_TPM" = "y" ]; then
		tpm extend -ix 4 -ic recovery
	fi
	exec /bin/ash
	exit
fi

if [ ! -x "$CONFIG_BOOTSCRIPT" -a ! -x "$CONFIG_BOOTSCRIPT_NETWORK" ]; then
	recovery 'Boot script missing?  Entering recovery shell'
else
	if [ -x "$CONFIG_BOOTSCRIPT_NETWORK" ]; then
		echo '***** Network Boot:' $CONFIG_BOOTSCRIPT_NETWORK
		$CONFIG_BOOTSCRIPT_NETWORK
		echo '***** Network Boot Completed:' $CONFIG_BOOTSCRIPT_NETWORK
		# not blocking
	fi

	if [ -x "$CONFIG_BOOTSCRIPT" ]; then
		echo '***** Normal boot:' $CONFIG_BOOTSCRIPT
		exec "$CONFIG_BOOTSCRIPT"

		# We should never reach here, but just in case...
		recovery 'Boot script failure?  Entering recovery shell'
	else
		# wait for boot via network to occur
		pause_recovery 'Override network boot. Entering recovery shell'
	fi
fi

# belts and suspenders, just in case...
if [ "$CONFIG_TPM" = "y" ]; then
	tpm extend -ix 4 -ic recovery
fi
exec /bin/ash