git: 9front

Download patch

ref: 00ccded1f6085d3b6d0125dbb0d694effb6b2517
parent: abf61c231fd6fb10e8fc94171a4bcf2d0a71d67d
author: cinap_lenrek <cinap_lenrek@localhost>
date: Tue Apr 19 01:24:46 EDT 2011

boot(8): fix it

--- a/sys/src/9/boot/bootmkfile
+++ b/sys/src/9/boot/bootmkfile
@@ -16,7 +16,3 @@
 
 %.$O:	$BOOTDIR/%.c
 	$CC -I$BOOTDIR $CFLAGS $BOOTDIR/$stem.c
-
-tread: tread.c
-	$CC tread.c
-	$LD -o tread tread.8
--- a/sys/src/9/boot/bootrc
+++ b/sys/src/9/boot/bootrc
@@ -13,15 +13,10 @@
 mtab = (mlocal mtcp)
 config=1
 connect=2
-bootargs=()
 
-. /rc/lib/conf.rc
-. /rc/lib/menu.rc
 . /rc/lib/local.rc
 . /rc/lib/tcp.rc
 
-cputype=`{cat '#e'/cputype}
-
 fn fatal {
 	echo $*
 	exit $"*
@@ -31,74 +26,66 @@
 	$* || fatal $"*^': '^$status
 }
 
-fn devinit{
-	bind -qa '#c' /dev
-	bind -qa '#S' /dev
-	bind -qa '#f' /dev
-	bind -qa '#k' /dev
-	bind -qa '#æ' /dev
-}
-
-fn usbinit{
-	if(test -e '#u'){
-		bind -a '#u' /dev
-		usb/usbd
+fn ask {
+	echo -n $1
+	echo -n $2
+	if(! ~ $#3 0){
+		echo -n ' ['
+		echo -n $3
+		echo -n '] '
 	}
-}
-
-fn kbmap{
-	if(! ~ $#kbmap 0){
-		bind -a '#κ' /dev
-		cat $kbmap > /dev/kbmap
+	$1=`{read}
+	if(~ $#$1 0)
+		$1=$3
+	if(~ $"$1 '!rc'){
+		rc -i
+		$1=()
 	}
+	if(~ $#$1 0)
+		ask $*
 }
 
 fn readmethod{
-	echo
-	echo Storage devices
-	for(i in /dev/sd[A-Z][0-9]*){
-		echo -n local!^$i'	'
-		echo `{sed 's/inquiry[ ]+//g; q' $i/ctl}\
-			partitions: `{cat $i/ctl | grep part | awk '{print $2}'}
-	}
-
 	found=0
 	while(~ $found 0){
-		timeo=5
-		resp=()
-		while(~ $#resp 0){
-			echo -n 'root is from: '
-			resp=`{tread $timeo}
-			if(! ~ $status ''){
-				bootconf	# set configuration from file
-				if(! ~ $#nobootprompt 0)
-					bootargs=$nobootprompt
-				resp=$bootargs
-			}
-			if(~ $resp !rc)
-				rc -i
-			timeo=0
+		if(~ $#nobootprompt 0){
+			echo
+			showlocaldevs
+			ask bootargs ' are? (tcp, local!device)' $"bootargs
 		}
-
-		method=`{echo $resp | awk -F! '{print $1}'}
-		NF=`{echo $resp | awk -F! '{print NF}'}
-
+		if not {
+			bootargs=$nobootprompt
+			nobootprompt=()
+		}
+		method=`{echo $bootargs | awk -F! '{print $1}'}
+		NF=`{echo $bootargs | awk -F! '{print NF}'}
 		for(i in `{seq 1 $#mtab}){
 			if(~ $mtab($i) m^$method)
-				found = $i 
+				found=$i 
 		}
-	 	if(~ $found 0){
+		if(~ $found 0)
 			echo method $method not found
-		}
 	}
-
-	methodarg = `{echo $resp | sed 's/^[A-Za-z]+!(.*)$/\1/'}
+	methodarg = `{echo $bootargs | awk -F! '{print $2}'}
 	mp = $$mtab($found)
 }
 
-fn authentication{
+fn main{
+	rm -f /srv/boot
+
+	readmethod
+	$mp($config) $methodarg
+
+	switch($method){
+	case local
+		islocal=1
+	case hybrid
+		ishybrid=1
+	}
+
+	# authentication agent
 	if(! test -f /srv/factotum){
-		x=(auth/factotum -sfactotum)
+		x=(/boot/factotum -sfactotum)
 		if(~ $cpuflag 1)
 			x=($x -kS)
 		if not
@@ -109,38 +96,20 @@
 			x=($x -p)
 		must $x
 	}
-}
 
-fn swapproc{
-	if(test -x '#c'/swap)
-		echo -n start > '#c'/swap
-}
-
-fn main{
-	readmethod
-	$mp($config)
-
-	switch($method){
-	case local
-		islocal=1
-	case hybrid
-		ishybrid=1
-	}
-
-	# authentication agent
-	authentication
-
 	# connect to the root file system
-	$mp($connect)
+	$mp($connect) $methodarg
 
+	# mount root filesystem
 	must mount -c /srv/boot /root
 
-	swapproc
+	# start pager
+	if(test -x /dev/swap)
+		echo -n start >/dev/swap
 
 	# remove part of our temporary root
-	unmount /$cputype/bin /bin
+	/mnt/broot/$cputype/bin/unmount /$cputype/bin /bin
 	/mnt/broot/$cputype/bin/unmount /rc/bin /bin
-	/mnt/broot/$cputype/bin/unmount /boot /bin
 	/mnt/broot/$cputype/bin/unmount /
 
 	# create the name space, mount the root fs
@@ -165,12 +134,26 @@
 
 bind -q '#p' /proc
 
-devinit
-usbinit		# set up usb keyboard, mouse, and disk, if any
-kbmap
+bind -qa '#S' /dev
+bind -qa '#f' /dev
+bind -qa '#k' /dev
+bind -qa '#æ' /dev
 
+if(test -e '#u'){
+	bind -a '#u' /dev
+	usb/usbd
+	sleep 1
+}
+
+if(! ~ $#kbmap 0){
+	bind -a '#κ' /dev
+	if(test -r $"kbmap)
+		cat $"kbmap >/dev/kbmap
+}
+
 configlocal	# add partitions and binds
 
-while(){
-	@{rfork n; main}
+while()@{
+	rfork n
+	main
 }
--- a/sys/src/9/boot/conf.rc
+++ /dev/null
@@ -1,49 +1,0 @@
-#!/bin/rc
-
-mounted=0
-found=0
-
-fn confmount{
-	part=`{echo $1 | sed 's!^.*/!!g; s!''$!!g'}
-
-	switch($part){
-	case dos
-		mprog=dossrv
-	case 9fat
-		mprog=dossrv
-	case fd?disk
-		mprog=dossrv
-	case data
-		mprog=9660srv
-	case *
-		mprog=0
-		mounted=0
-	}
-
-	if(! ~ $mprog 0){
-		$mprog -f $1 conf >/dev/null >[2=1]
-		mount /srv/conf /mnt/conf
-		mounted=1
-	}
-}
-
-fn findconf{
-	for(d in /dev/sd*)
-	for(p in `{ls $d}){
-		if(~ $found 0){
-			confmount $p
-			if(test -e /mnt/conf/plan9.ini)
-				found=1
-			if(test $mounted -eq 1 -a $found -eq 0){
-				unmount /mnt/conf
-				rm /srv/conf
-			}
-		}
-	}
-}
-
-fn bootconf{
-	findconf
-	if(~ $found 1)
-		parseconf
-}
--- a/sys/src/9/boot/local.rc
+++ b/sys/src/9/boot/local.rc
@@ -1,23 +1,39 @@
 #!/bin/rc
 
+fn showlocaldevs{
+	echo local devices found:
+	for(c in /dev/sd*/ctl){
+		d=`{echo $c | sed 's,/ctl,,g'}
+		echo $d':' `{sed 's/inquiry[ ]+//g; q' $c}
+		for(i in `{awk '/^part/{print $2}' $c})
+			echo $d'/'$i
+		echo
+	}
+}
+
 fn configlocal{
-	disk=`{echo $methodarg | sed 's,(.*)!.*,\1,g'}
-	fstype=`{echo $disk | sed 's,.*/(.*)$,\1,g'}
-	disk=`{echo $disk | sed 's,(.*)/.*$,\1,'}
+	if(~ $pcload 1){
+		kern=`{echo $* | sed 's,.*!(.*)$,\1,g'}
 
+		# for now we only allow kernels in the same dev/part of $methodargs
+		if(~ $#kern 0 || ! ~ $#bootfile 0)
+			kern=`{echo $bootfile | sed 's,.*!(.*)$,\1,g'}
+	}
 	diskparts
+
 }
 
 fn connectlocal{
-	rm -f /srv/boot
-	switch($fstype){
+	part=`{echo $* | sed 's,.*/([^ ]+),\1,g'}
+	part=$part(1)
+	switch($part){
 	case kfs fs
-		must disk/kfs -n boot -f $disk^/$fstype 
+		must disk/kfs -n boot -f $*
 	case cwfs fscache fsworm w0 w1 w2 w3
-		must cwfs64x -n boot -f $disk^/$fstype 
+		must cwfs64x -n boot -f $*
 	case data
-		must 9660srv -f $disk^/$fstype boot
+		must 9660srv -f $* boot
 	case *
-		fatal unknown partition $fstype
+		fatal unknown partition $part
 	}
 }
--- a/sys/src/9/boot/menu.rc
+++ /dev/null
@@ -1,134 +1,0 @@
-#!/bin/rc
-
-conffile=/mnt/conf/plan9.ini
-items=()
-
-fn menuitems{
-oifs=$ifs
-ifs='
-'
-	# get menu items and save them in the form 'item\tstring'
-	x=(`{awk -F'\n' '
-			$0 ~ /\[menu\]/ {
-				FS="[= ]"
-				for(nitem=1;;nitem++){
-					getline
-					if(match($0, /\[/))	# if we entered a block, we are done
-						break
-					sub(/\,/, "")		# remove comma
-					if(match($0, /^#/)) # comments
-						continue
-					if(match($0, /^$/)) # empty line
-						continue
-					printf("%s\t\"    %d. ", $2, nitem)
-					for(i=3; i <= NF; i++)
-						printf("%s ", $i)
-					printf("\"\t\n")
-				}
-			}
-	' $conffile})
-
-	ifs='	'
-	for(itemline in $x){
-		# separate item from string
-		item=`{echo $itemline(1)}
-
-		# $menuitemtext holds the string for the item
-		$item(1)^text=$item(2)
-		items=($items $item(1))
-	}
-	if(! ~ $#items 0){
-		echo 'Plan 9 Startup Menu:'
-		echo '--------------------'
-	}
-	ifs=$oifs
-}
-
-# load block definitions
-fn menublock{
-	for(i in `{
-		awk -F'\n' -v item'='`{echo '['$1']' | sed 's/ //g'} '
-		{
-				# find menuitem block
-				if(index($0, item)){
-					for(;;){
-						if(getline <= 0)
-							break
-						if(match($0, /\[/))	# entered a block, we are done
-							break
-						if(match($0, /^$/))
-							continue
-			
-						# skip comments, quote kernel devices
-						if(index($0, "#") == 1)
-							continue
-						else
-							gsub("#", "''#''")
-						printf("%s\n", $1)
-					}
-				}
-		}' $conffile}){
-			name=`{echo $i | awk -F'=' '{print $1}'}
-			val=`{echo $i | awk -F'=' '{print $2}'}
-
-			# a name beginning with * denotes
-			# a kernel variable, save to #ec
-			v0=`{echo $i | sed 's/(\*).*/\1/'}
-			if(~ $v0 '*'){
-				bind -bc '#ec' /env
-				eval $name'='$val
-				unmount '#ec' /env
-			}
-			if not 
-				eval $name'='$val
-		}
-}
-
-fn freevars{
-	for(i in `{
-		awk -F'\n' '{
-			if(match($0, /\[/))	# entered a block, we are done
-				exit
-			if(match($0, /^$/))
-				exit
-			# skip comments, quote kernel devices
-			if(index($0, "#") == 1)
-				exit
-			else
-				gsub("#", "''#''")
-			printf("%s\n", $1)
-		}' $conffile}){
-		# a name beginning with * denotes
-		# a kernel variable, save to #ec
-		val=`{echo $i | sed 's/(\*).*/\1/'}
-		if(~ $val '*'){
-			bind -bc '#ec' /env
-			eval $i
-			unmount '#ec' /env
-		}
-		if not eval $i
-	}
-}
-
-fn parseconf{
-	opt=0
-	if(test -f $conffile){
-		freevars	
-		menuitems
-		menublock 'common'
-
-		if(! ~ $#items 0){
-			while(test $opt -lt 1 || test $opt -gt $#items){
-				for(item in $items)
-					echo -n $`{echo $item^text} | sed 's/"//g'
-
-				echo -n '    Selection: '
-				opt=`{read}
-
-				if(test $opt -ge 1 && test $opt -le $#items)
-					menublock $items($opt)
-			}
-		}
-	}
-}
-
--- a/sys/src/9/boot/tcp.rc
+++ b/sys/src/9/boot/tcp.rc
@@ -1,61 +1,25 @@
 #!/bin/rc
 
-fn isvalidip{
-	# TODO: more precise test
-	if(! ~ $#1 0 && ! test `{echo $1 | sed '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/d'})
-		echo -n
-}
-
 fn configtcp{
-	# TODO: 
-	# should we accept a different mount point?
-	# should we add more interfaces?
-
 	# bind in an ip interface
 	for(i in I l`{seq 0 3})
 		bind -a '#'$i /net >/dev/null >[2=1]
 
-	if(! test -x /bin/ip/ipconfig){
-		echo no ipconfig
-		exit noipconfig
-	}
-
-	ip/ipconfig	# TODO: should receive args passed to boot(8)
+	must ip/ipconfig -p $*
 	
-	# XXX: should configuration from file override the values from ipconfig(8)?
-	if(~ $#fs 0){
-		_fsip=`{grep fs /net/ndb | awk -F'=' '{print $2}' >/dev/null >[2=1]}
-		if(! ~ $#_fsip 0 && `{isvalidip $_fsip})
-			fsip=$_fsip
-	}
-
-	# if we didn't get a file and auth server from either 
-	# the configuration file or ipconfig(8), ask the user
-	if(~ $#fsip 0){
-		while(! isvalidip $fsip){
-			echo -n 'filesystem IP address: '
-			fsip=`{read}
-		}
-	}
+	if(~ $#fs 0)
+		fs=`{awk -F'=' '/fs=/{print $2; exit}' /net/ndb}
+	if(~ $#auth 0)
+		auth=`{awk -F'=' '/auth=/{print $2; exit}' /net/ndb}
+	if(~ $#fs 0)
+		ask fs ' ip is?' $"auth
+	if(~ $#auth 0)
+		ask auth ' ip is?' $"fs
 	
-	if(~ $#auth 0){
-		_authip=`{grep auth /net/ndb | awk -F'=' '{print $2}' >/dev/null >[2=1]}
-		if(! ~ $#_authip 0 && `{isvalidip $_authip})
-			authip=_authip
-	}
-	
-	if(~ $#authip 0){
-		while(! isvalidip $authip){
-			echo -n 'authentication server IP address: '
-			authip=`{read}
-		}
-	}
-
-	authaddr=tcp!$authip!567	# leave this for factotum(4)
-
-	rm -f /env/_authip /env/_fsip
+	fsaddr=tcp!$fs!564
+	authaddr=tcp!$auth!567
 }
 
 fn connecttcp{
-	srv -q tcp!$fsip!564 boot 
+	srv -q $"fsaddr boot 
 }
--- a/sys/src/9/boot/tread.c
+++ /dev/null
@@ -1,73 +1,0 @@
-#include <u.h>
-#include <libc.h>
-
-int c;
-
-int
-alarmed(void *a, char *msg)
-{
-	USED(a);
-	USED(msg);
-	if(!c)
-		exits("timedout");
-	noted(NCONT);
-	return 1;
-}
-
-void
-readline(int fd, char *buf, int nbuf)
-{
-	int i, n;
-
-	i = 0;
-	while(i < nbuf-1){
-		n = read(fd, &c, sizeof c);
-		alarm(0);
-		c &= 0xff;
-		write(fd, &c, 1);
-		if(n != 1 || c == '\04' || c == '\177'){
-			i = 0;
-			break;
-		} else if(c == '\n')
-			break;
-		else if(c == '\b' && i > 0)
-			--i;
-		else if(c == ('u' & 037)){
-			c = '\b';
-			for(n=0; n <= i; n++)
-				write(fd, &c, 1);
-			i = 0;
-		} else
-			buf[i++] = c;
-	}
-	buf[i] = 0;
-}
-
-void
-main(int argc, char *argv[])
-{
-	int fd, ctl, i;
-	char buf[256];
-	long n;
-
-	if(argc < 2)
-		sysfatal("usage: tread timeout");
-
-	atnotify(alarmed, 1);
-
-	fd = open("/dev/cons", ORDWR);
-	if(fd < 0)
-		sysfatal("open cons: %r");
-	ctl = open("/dev/consctl", OWRITE);
-	if(ctl < 0)
-		sysfatal("open consctl: %r");
-
-	write(ctl, "rawon", 5);
-	alarm(atoi(argv[1])*1000);
-
-	readline(fd, buf, sizeof(buf));
-	close(ctl);
-	close(fd);
-	print("%s", buf);
-	exits(nil);
-}
--- a/sys/src/9/pc/pcf
+++ b/sys/src/9/pc/pcf
@@ -132,4 +132,5 @@
 	bootpcf.out boot
 	/386/bin/bzfs
 	/386/bin/mntgen
+	/386/bin/auth/factotum
 	rootfs.bz2
--- a/sys/src/9/port/bootfs.proto
+++ b/sys/src/9/port/bootfs.proto
@@ -1,8 +1,6 @@
 $cputype
 	bin
 		9660srv
-		auth
-			factotum
 		awk
 		bind
 		bzfs
@@ -28,9 +26,9 @@
 		rm
 		sed
 		seq
+		sleep
 		srv
 		test
-		tread	555 sys sys ../boot/tread
 		unmount
 		usb
 			usbd
@@ -38,12 +36,9 @@
 rc
 	lib
 		rcmain
-		conf.rc 555 sys sys ../boot/conf.rc
 		local.rc 555 sys sys ../boot/local.rc
-		menu.rc 555 sys sys ../boot/menu.rc
 		tcp.rc 555 sys sys ../boot/tcp.rc
 	bin
 		diskparts
 		bootrc 555 sys sys ../boot/bootrc
 tmp
-
--- a/sys/src/9/port/mkbootfs
+++ b/sys/src/9/port/mkbootfs
@@ -33,11 +33,6 @@
 	rm boot.bz2
 }
 
-@{cd ../boot
-	. /$cputype/mkfile
-	mk -f bootmkfile tread
-}
-
 bootraw
 bootbz2
 rootbz2
--- a/sys/src/boot/pc/sub.c
+++ b/sys/src/boot/pc/sub.c
@@ -128,7 +128,9 @@
 Clear:
 	kern = 0;
 	inblock = 0;
-	p = (char*)((CONFADDR + 64) & ~0xF0000000UL);
+	p = (char*)(CONFADDR & ~0xF0000000UL);
+	memset(p, 0, 0xE00);
+	p += 64;
 Loop:
 	while((n = readline(f, line)) > 0){
 		if(*line == 0 || strchr("#;=", *line))
--