summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/boot/bootfs.proto1
-rwxr-xr-xsys/src/9/boot/reboot.rc56
2 files changed, 57 insertions, 0 deletions
diff --git a/sys/src/9/boot/bootfs.proto b/sys/src/9/boot/bootfs.proto
index a59ad6db5..1bffa0c47 100644
--- a/sys/src/9/boot/bootfs.proto
+++ b/sys/src/9/boot/bootfs.proto
@@ -48,6 +48,7 @@ $objtype
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
diff --git a/sys/src/9/boot/reboot.rc b/sys/src/9/boot/reboot.rc
new file mode 100755
index 000000000..536ac2009
--- /dev/null
+++ b/sys/src/9/boot/reboot.rc
@@ -0,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)