From a93e2ace3e40f7ee822c7082fb6d8a961debde00 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 12 Jul 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-07-12 --- pc/fns.h | 3 +- pc/main.c | 232 +++++++++++++++++++++++++++++++++++++++++++++--- port/devproc.c | 14 +-- port/proc.c | 7 +- port/sysproc.c | 8 +- ss/faultsparc.c | 1 - ss/l.s | 4 +- ss/main.c | 2 +- ss/trap.c | 6 +- 9 files changed, 240 insertions(+), 37 deletions(-) diff --git a/pc/fns.h b/pc/fns.h index 21240c916857999ddc9424ce25c0f7cc41cf4ff8..4aec1dc202199a586629cefeff802c8df45bf78b 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -8,7 +8,8 @@ void delay(int); void fault386(Ureg*); void floppyinit(void); void floppyintr(Ureg*); -long floppyseek(int, ulong); +long floppyseek(int, long); +long floppyread(int, void*, long); #define flushvirt(); void idle(void); int inb(int); diff --git a/pc/main.c b/pc/main.c index 48549a6fcf69032cb9161369307ebb5d491d9e7c..2b617fd226fe9be8aed10aae9d22a60264498850 100644 --- a/pc/main.c +++ b/pc/main.c @@ -6,15 +6,50 @@ #include "io.h" -char sysname[NAMELEN]; +extern ulong edata; + +/* + * predeclared + */ +int fdboot(void); +int hdboot(void); +int duartboot(void); +int parse(char*); +int getline(int); +int getstr(char*, char*, int, char*, int); +int menu(void); + +char file[2*NAMELEN]; +char server[NAMELEN]; +char sysname[NAMELEN]; +char user[NAMELEN] = "none"; +char linebuf[256]; Conf conf; -char user[NAMELEN] = "bootes"; -extern ulong edata; + +typedef struct Booter Booter; +struct Booter +{ + char *name; + char *srv; + int (*func)(void); +}; +Booter booter[] = { + { "fd", 0, fdboot }, + { "hd", 0, hdboot }, + { "2400", 0, duartboot }, + { "1200", 0, duartboot }, +}; + +int bootdev; +char *bootchars = "fh21"; +int usecache; main(void) { - int i; + char *path; /* file path */ + char element[2*NAMELEN]; /* next element in a file path */ + char def[2*NAMELEN]; machinit(); confinit(); @@ -30,17 +65,146 @@ main(void) floppyinit(); spllo(); - for(i=0; i<100; i++){ - int c; + for(;;){ + sprint(def, "%s!%s!/%s", booter[bootdev].name, booter[bootdev].srv, + usecache ? "9.cache" : "9.com"); + if(getstr("server", element, sizeof element, def, 0)<0) + continue; + if(parse(element) < 0) + continue; + if(getstr("user", user, sizeof user, 0, 0)<0) + continue; + if(*user==0) + continue; + if((*booter[bootdev].func)() < 0) + continue; + print("success\n"); + } +} - c = getc(&kbdq); - if(c!=-1) - screenputc(c); - idle(); - floppyseek(0, 0); - floppyseek(0, 18*512*20); +/* + * parse the server line. return 0 if OK, -1 if bullshit + */ +int +parse(char *line) +{ + char *def[3]; + char **d; + char *s; + int i; + + def[0] = booter[bootdev].name; + def[1] = booter[bootdev].srv; + def[2] = "/9.com"; + + d = &def[2]; + s = line + strlen(line); + while((*d = s) > line) + if(*--s == '!'){ + if(d-- == def) + return -1; + *s = '\0'; + } + + for(i = 0; i < strlen(bootchars); i++){ + if(strcmp(def[0], booter[i].name)==0){ + strcpy(server, def[1]); + strcpy(file, def[2]); + bootdev = i; + return 0; + } } - for(;;); + + return -1; +} + +/* + * read a line from the keyboard. + */ +int +getline(int quiet) +{ + int c, i=0; + long start; + + for (start=m->ticks;;) { + do{ + if(TK2SEC(m->ticks - start) > 60) + return -2; + c = getc(&kbdq); + } while(c==-1); + if(c == '\r') + c = '\n'; /* turn carriage return into newline */ + if(c == '\177') + c = '\010'; /* turn delete into backspace */ + if(!quiet){ + if(c == '\033'){ + menu(); + return -1; + } + if(c == '\025') + screenputc('\n'); /* echo ^U as a newline */ + else + screenputc(c); + } + if(c == '\010'){ + if(i > 0) + i--; /* bs deletes last character */ + continue; + } + /* a newline ends a line */ + if (c == '\n') + break; + /* ^U wipes out the line */ + if (c =='\025') + return -1; + linebuf[i++] = c; + } + linebuf[i] = 0; + return i; +} + +/* + * prompt for a string from the keyboard. returns the default. + */ +int +getstr(char *prompt, char *buf, int size, char *def, int quiet) +{ + int len; + char *cp; + + for (;;) { + if(def) + print("%s[default==%s]: ", prompt, def); + else + print("%s: ", prompt); + len = getline(quiet); + switch(len){ + case -1: + /* ^U typed */ + continue; + case -2: + /* timeout */ + return -1; + default: + break; + } + if(len >= size){ + print("line too long\n"); + continue; + } + break; + } + if(*linebuf==0 && def) + strcpy(buf, def); + else + strcpy(buf, linebuf); + return 0; +} + +int +menu(void) +{ } void @@ -216,6 +380,9 @@ ialloc(ulong n, int align) return (void*)(p|KZERO); } +/* + * some dummy's so we can use kernel code + */ void sched(void) { } @@ -229,3 +396,42 @@ postnote(Proc*p, int x, char* y, int z) { panic("postnote"); } + + +/* + * boot from hard disk + */ +int +hdboot(void) +{ + print("hdboot unimplemented\n"); + return -1; +} + +/* + * boot from the duart + */ +int +duartboot(void) +{ + print("duartboot unimplemented\n"); + return -1; +} + +#include "dosfs.h" + +/* + * boot from the floppy + */ +int +fdboot(void) +{ + Dosbpb b; + extern int dosboot(Dosbpb*); + + print("booting from floppy 0\n"); + b.seek = floppyseek; + b.read = floppyread; + b.dev = 0; + return dosboot(&b); +} diff --git a/port/devproc.c b/port/devproc.c index 07126527bff762e7213b98d1873eb660acc843e3..76cb003b6202245551b04d8d2b257116104d49a5 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -19,6 +19,7 @@ enum{ Qtext, }; +#define STATSIZE (2*NAMELEN+12+6*12) Dirtab procdir[]={ "ctl", {Qctl}, 0, 0600, "mem", {Qmem}, 0, 0600, @@ -26,7 +27,7 @@ Dirtab procdir[]={ "notepg", {Qnotepg}, 0, 0200, "proc", {Qproc}, sizeof(Proc), 0600, "segment", {Qsegment}, 0, 0400, - "status", {Qstatus}, NAMELEN+12+6*12, 0600, + "status", {Qstatus}, STATSIZE, 0600, "text", {Qtext}, 0, 0600, }; @@ -348,17 +349,18 @@ procread(Chan *c, void *va, long n, ulong offset) return n; case Qstatus: - if(offset >= sizeof statbuf) + if(offset >= STATSIZE) return 0; - if(offset+n > sizeof statbuf) - n = sizeof statbuf - offset; - sprint(statbuf, "%-27s %-27s %-11s ", p->text, p->pgrp->user, statename[p->state]); + if(offset+n > STATSIZE) + n = STATSIZE - offset; + j = sprint(statbuf, "%-27s %-27s %-11s ", + p->text, p->pgrp->user, statename[p->state]); for(i=0; i<6; i++){ l = p->time[i]; if(i == TReal) l = MACHP(0)->ticks - l; l = TK2MS(l); - readnum(0, statbuf+2*NAMELEN+12+NUMSIZE*i, NUMSIZE, l, NUMSIZE); + readnum(0, statbuf+j+NUMSIZE*i, NUMSIZE, l, NUMSIZE); } memmove(a, statbuf+offset, n); return n; diff --git a/port/proc.c b/port/proc.c index 59637cf21fa193bf80ef49380cc59217e84c60e5..efaac997b0185087262c154cd5af43cbf460ee0a 100644 --- a/port/proc.c +++ b/port/proc.c @@ -491,7 +491,8 @@ pexit(char *s, int freemem) c->alarm = 0; mypid = c->pid; - closefgrp(c->fgrp); + if(c->fgrp) + closefgrp(c->fgrp); if(freemem){ flushvirt(); @@ -499,7 +500,8 @@ pexit(char *s, int freemem) if(c->seg[i]) putseg(c->seg[i]); closepgrp(c->pgrp); - closeegrp(c->egrp); + if(c->egrp) + closeegrp(c->egrp); close(u->dot); } /* @@ -672,7 +674,6 @@ kproc(char *name, void (*func)(void *), void *arg) * Refs */ incref(up->dot); - p->fgrp = newfgrp(); kunmap(k); /* diff --git a/port/sysproc.c b/port/sysproc.c index 804bac2b0aac08ddd80cf9ade5fd5a7298f056ce..9241ecebdcad4a537b20ad75ef562ceac8b53cbe 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -517,21 +517,21 @@ long syssegfree(ulong *arg) { Segment *s; - ulong from, len; + ulong from, pages; from = PGROUND(arg[0]); s = seg(u->p, from, 1); if(s == 0) errors("not in address space"); - len = arg[1]; + pages = (arg[1]+BY2PG-1)/BY2PG; - if(from+len > s->top) { + if(from+pages*BY2PG > s->top) { qunlock(&s->lk); errors("segment too short"); } - mfreeseg(s, from, len); + mfreeseg(s, from, pages); qunlock(&s->lk); return 0; diff --git a/ss/faultsparc.c b/ss/faultsparc.c index 8cef7e483a37e89073d59e643f5b87295b823cd0..a2c2f5b932de6ef30dbe131e3166f0618362a20c 100644 --- a/ss/faultsparc.c +++ b/ss/faultsparc.c @@ -25,7 +25,6 @@ faultsparc(Ureg *ur) read = 0; } spllo(); -print("fault %lux %lux %d\n", ur->pc, addr, read); if(u == 0){ dumpregs(ur); panic("fault u==0 pc=%lux addr=%lux", ur->pc, addr); diff --git a/ss/l.s b/ss/l.s index e399cd6635090b79dd2bba1f7a873c400f0ff3e1..dfdbc0c5016128fff29a1cb33703eef6f3c72259 100644 --- a/ss/l.s +++ b/ss/l.s @@ -117,13 +117,12 @@ TEXT splx(SB), $0 RETURN TEXT touser(SB), $-4 - MOVW $(SYSPSR&~PSREF), R7 MOVW R7, PSR - OR R0, R0 OR R0, R0 OR R0, R0 + MOVW sp+0(FP), R1 SAVE R0, R0 /* RETT is implicit RESTORE */ MOVW $(UTZERO+32), R7 /* PC; header appears in text */ @@ -331,7 +330,6 @@ TEXT gotolabel(SB), $0 MOVW b+0(FP), R8 MOVW (R8), R1 MOVW 4(R8), R15 - MOVW R15, 0(R1) MOVW $1, R7 RETURN diff --git a/ss/main.c b/ss/main.c index e9bdfa97e3194cbfdab48907a265d7d441d68435..91818ae2620825958573f51c7c02f8957e891a10 100644 --- a/ss/main.c +++ b/ss/main.c @@ -110,7 +110,7 @@ init0(void) u->slash = (*devtab[0].attach)(0); u->dot = clone(u->slash, 0); - kickpager(); + kickpager(); /**/ touser(USTKTOP-(1+MAXSYSARG)*BY2WD); } diff --git a/ss/trap.c b/ss/trap.c index 93b49d01b1944eb77ba33c2e2aa2128b4d2e05b2..5b2067c9c7c31e838aa349e60d00387124507a7e 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -325,10 +325,8 @@ syscall(Ureg *aur) char *msg; ur = aur; - if(ur->psr & PSRPSUPER){ - dumpregs(ur); + if(ur->psr & PSRPSUPER) panic("recursive system call"); - } u->p->insyscall = 1; u->p->pc = ur->pc; @@ -340,9 +338,7 @@ syscall(Ureg *aur) u->p->fpstate = FPinit; ur->psr &= ~PSREF; } -print("syscall %d\n", ur->r7); spllo(); -print("got low in syscall\n"); r7 = ur->r7; sp = ur->usp;