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
This commit is contained in:
cinap_lenrek 2021-07-27 18:21:08 +00:00
parent 70d173bfa4
commit df04ea8d6c
6 changed files with 31 additions and 170 deletions

View file

@ -1,86 +0,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);
}

View file

@ -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);
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");
}
USED(argc);
readfile("#e/cputype", cputype, sizeof(cputype));
/* 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);
bind("/boot", bin, MAFTER);
if(fork() == 0){
execl("/bin/paqfs", "-qa", "-c", "8", "-m", root, "/boot/bootfs.paq", nil);
goto Err;
}
if(await(buf, sizeof(buf)) < 0)
goto Err;
bind(root, "/", 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);
}

View file

@ -1,9 +0,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);

View file

@ -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\
$BOOTFILES: $BOOTDIR/boot.h
%.$O: $BOOTDIR/%.c
$CC -I$BOOTDIR $CFLAGS $BOOTDIR/$stem.c
boot: $BOOTFILES
$LD -o $target $BOOTFILES
boot: boot.$O
$LD -o $target $prereq
# 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

View file

@ -8,6 +8,7 @@ mntgen -s mntexport /mnt/exportfs && chmod 666 /srv/mntexport
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)

View file

@ -1,22 +0,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;
}