shithub: riscv

Download patch

ref: df04ea8d6c2e1e75307a77f2b086a836f480ab72
parent: 70d173bfa49e6c7cfd560799d83713d41b120e45
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Jul 27 14:21:08 EDT 2021

kernel: simplify /boot/boot: 28K down to less than 4K.

- avoid print() format routines (saves alot of code)
- avoid useless opens of /dev/cons (already done by initcode)
- avoid useless binds of /env and /dev (already done by initcode)
- do bind of /shr in bootrc, it is not needed by us
- we'r pid 1 so kernel will print the exit message for us

--- a/sys/src/9/boot/aux.c
+++ /dev/null
@@ -1,86 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <../boot/boot.h>
-
-void
-fatal(char *s)
-{
-	char buf[ERRMAX];
-
-	buf[0] = '\0';
-	errstr(buf, sizeof buf);
-	fprint(2, "boot: %s: %s\n", s, buf);
-	exits(0);
-}
-
-int
-readfile(char *name, char *buf, int len)
-{
-	int f, n;
-
-	buf[0] = 0;
-	f = open(name, OREAD);
-	if(f < 0)
-		return -1;
-	n = read(f, buf, len-1);
-	if(n >= 0)
-		buf[n] = 0;
-	close(f);
-	return 0;
-}
-
-void
-run(char *file, ...)
-{
-	char buf[64];
-	Waitmsg *w;
-	int pid;
-
-	switch(pid = fork()){
-	case -1:
-		fatal("fork");
-	case 0:
-		exec(file, &file);
-		snprint(buf, sizeof buf, "can't exec %s", file);
-		fatal(buf);
-	default:
-		while((w = wait()) != nil)
-			if(w->pid == pid)
-				break;
-		if(w == nil){
-			snprint(buf, sizeof buf, "wait returned nil running %s", file);
-			free(w);
-			fatal(buf);
-		}
-		free(w);
-	}
-}
-
-int
-writefile(char *name, char *buf, int len)
-{
-	int f, n;
-
-	f = open(name, OWRITE);
-	if(f < 0)
-		return -1;
-	n = write(f, buf, len);
-	close(f);
-	return (n != len) ? -1 : 0;
-}
-
-void
-setenv(char *name, char *val, int ec)
-{
-	int f;
-	char ename[64];
-
-	snprint(ename, sizeof ename, "#e%s/%s", ec ? "c" : "", name);
-	f = create(ename, 1, 0666);
-	if(f < 0){
-		fprint(2, "create %s: %r\n", ename);
-		return;
-	}
-	write(f, val, strlen(val));
-	close(f);
-}
--- a/sys/src/9/boot/boot.c
+++ b/sys/src/9/boot/boot.c
@@ -1,48 +1,34 @@
 #include <u.h>
 #include <libc.h>
-#include <auth.h>
-#include <fcall.h>
-#include "../boot/boot.h"
 
+char bin[] = "/bin";
+char root[] = "/root";
+
 void
-main(int argc, char *argv[])
+main(int, char *argv[])
 {
-	char cputype[64];
 	char buf[32];
 
-	fmtinstall('r', errfmt);
+	/* setup the boot namespace */
+	bind("/boot", bin, MAFTER);
 
-	bind("#c", "/dev", MREPL);
-	open("/dev/cons", OREAD);
-	open("/dev/cons", OWRITE);
-	open("/dev/cons", OWRITE);
-	/*
-	 * init will reinitialize its namespace.
-	 * #ec gets us plan9.ini settings (*var variables).
-	 */
-	bind("#ec", "/env", MREPL);
-	bind("#e", "/env", MBEFORE|MCREATE);
-	bind("#s", "/srv", MREPL|MCREATE);
-	bind("#σ", "/shr", MREPL);
-
-	if(Debug){
-		int i;
-
-		print("argc=%d\n", argc);
-		for(i = 0; i < argc; i++)
-			print("%p %s ", argv[i], argv[i]);
-		print("\n");
+	if(fork() == 0){
+		execl("/bin/paqfs", "-qa", "-c", "8", "-m", root, "/boot/bootfs.paq", nil);
+		goto Err;
 	}
-	USED(argc);
+	if(await(buf, sizeof(buf)) < 0)
+		goto Err;
 
-	readfile("#e/cputype", cputype, sizeof(cputype));
+	bind(root, "/", MAFTER);
 
-	/* setup the boot namespace */
-	bind("/boot", "/bin", MAFTER);
-	run("/bin/paqfs", "-qa", "-c", "8", "-m" "/root", "/boot/bootfs.paq", nil);
-	bind("/root", "/", MAFTER);
-	snprint(buf, sizeof(buf), "/%s/bin", cputype);
-	bind(buf, "/bin", MAFTER);
-	bind("/rc/bin", "/bin", MAFTER);
+	buf[0] = '/';
+	buf[1+read(open("/env/cputype", OREAD|OCEXEC), buf+1, sizeof buf - 5)] = '\0';
+	strcat(buf, bin);
+	bind(buf, bin, MAFTER);
+	bind("/rc/bin", bin, MAFTER);
+
 	exec("/bin/bootrc", argv);
+Err:
+	errstr(buf, sizeof buf);
+	_exits(buf);
 }
--- a/sys/src/9/boot/boot.h
+++ /dev/null
@@ -1,9 +1,0 @@
-enum {
-	Debug = 0,
-};
-
-extern void	fatal(char*);
-extern int	readfile(char*, char*, int);
-extern void	run(char*, ...);
-extern void	setenv(char*, char*, int);
-extern int	writefile(char*, char*, int);
--- a/sys/src/9/boot/bootmkfile
+++ b/sys/src/9/boot/bootmkfile
@@ -1,24 +1,15 @@
-BOOTDIR=../boot
+boot.$O:	../boot/boot.c
+	$CC -I../boot $CFLAGS ../boot/boot.c
 
-BOOTFILES=\
-	aux.$O\
-	boot.$O\
-	printstub.$O\
+boot:	boot.$O
+	$LD -o $target $prereq
 
-$BOOTFILES:	$BOOTDIR/boot.h
-
-%.$O:	$BOOTDIR/%.c
-	$CC -I$BOOTDIR $CFLAGS $BOOTDIR/$stem.c
-
-boot:	$BOOTFILES
-	$LD -o $target $BOOTFILES
-
 # look for proto file in order:
 #	1) $CONF.bootfs.proto		(config specific)
 #	2) bootfs.proto			(kernel specific)
-#	3) $BOOTDIR/bootfs.proto	(default generic)
+#	3) ../boot/bootfs.proto		(default generic)
 #
-BOOTFSPROTO=`{for(i in $CONF.bootfs.proto bootfs.proto $BOOTDIR/bootfs.proto) test -r $i && echo $i && exit}
+BOOTFSPROTO=`{for(i in $CONF.bootfs.proto bootfs.proto ../boot/bootfs.proto) test -r $i && echo $i && exit}
 
 bootfs.paq:	$BOOTFSPROTO `{disk/mkfs -aos / $BOOTFSPROTO >[2]/dev/null}
 	mkdir -p bootfs
--- a/sys/src/9/boot/bootrc
+++ b/sys/src/9/boot/bootrc
@@ -8,6 +8,7 @@
 bind /root /mnt/broot
 unmount /root
 
+bind -q '#σ' /shr
 bind -q '#d' /fd
 bind -q '#p' /proc
 for(i in ¶ P S f æ t b m)
--- a/sys/src/9/boot/printstub.c
+++ /dev/null
@@ -1,22 +1,0 @@
-#include <u.h>
-#include <libc.h>
-
-static Lock fmtl;
-
-void
-_fmtlock(void)
-{
-	lock(&fmtl);
-}
-
-void
-_fmtunlock(void)
-{
-	unlock(&fmtl);
-}
-
-int
-_efgfmt(Fmt*)
-{
-	return -1;
-}