git: 9front

Download patch

ref: c27a1fcaef0c20cce5551b6a9e9e633d141db41a
parent: d7a8280d953a01aafad0a9a962eb6968f002604d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Sep 16 18:35:16 EDT 2018

bootrc: add experimental reboot method to load another kernel

syntax: reboot!bootfile[!method...]

this echos bootfile to /dev/reboot, causing bootfile kernel
to be started.

when method is given, we first connect to the filesystem and
set bootargs so that bootfile can be loaded from the target
network or local fileserver.

note, when no bootfile is given, this causes the kernel to
reboot to bios.

--- a/sys/src/9/boot/bootfs.proto
+++ b/sys/src/9/boot/bootfs.proto
@@ -48,6 +48,7 @@
 rc
 	lib
 		rcmain
+		reboot.rc 555 sys sys ../boot/reboot.rc
 		local.rc 555 sys sys ../boot/local.rc
 		net.rc 555 sys sys ../boot/net.rc
 	bin
--- /dev/null
+++ b/sys/src/9/boot/reboot.rc
@@ -1,0 +1,56 @@
+#!/bin/rc
+
+fn configreboot {
+	if(~ $"* *!*){
+		*=`{echo $* | sed 's,!, ,'}
+		shift
+		*=`{echo $* | sed 's,!, ,'}
+		x=m$1
+		x=$$x
+		shift
+
+		# config method
+		$x(1) $*
+	}
+}
+
+fn connectreboot {
+	if(~ $"* *!*){
+		*=`{echo $* | sed 's,!, ,'}
+		bootfile=$1
+		shift
+		bootargs=$*
+		*=`{echo $* | sed 's,!, ,'}
+		x=m$1
+		x=$$x
+		shift
+
+		# connect method
+		$x(2) $*
+
+		rfork ne
+
+		# set new kernel parameters
+		echo -n $bootargs > '#ec/bootargs'
+
+		# remove part of our temporary root
+		/mnt/broot/$cputype/bin/unmount /$cputype/bin /bin
+		/mnt/broot/$cputype/bin/unmount /rc/bin /bin
+		/mnt/broot/$cputype/bin/unmount /
+
+		# create the name space, mount the root fs
+		/mnt/broot/$cputype/bin/bind / /
+		/mnt/broot/$cputype/bin/mount -ac '#s/boot' /
+	}
+	if not {
+		bootfile=$1
+	}
+
+	# load the new kernel
+	/mnt/broot/$cputype/bin/echo reboot $bootfile > /dev/reboot
+	exit 'reboot failed'
+}
+
+mreboot=(configreboot connectreboot)
+
+mt=(mreboot $mt)
--