M pc/fns.h => pc/fns.h +2 -1
@@ 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);
M pc/main.c => pc/main.c +219 -13
@@ 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. <cr> 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);
+}
M port/devproc.c => port/devproc.c +8 -6
@@ 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;
M port/proc.c => port/proc.c +4 -3
@@ 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);
/*
M port/sysproc.c => port/sysproc.c +4 -4
@@ 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;
M ss/faultsparc.c => ss/faultsparc.c +0 -1
@@ 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);
M ss/l.s => ss/l.s +1 -3
@@ 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
M ss/main.c => ss/main.c +1 -1
@@ 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);
}
M ss/trap.c => ss/trap.c +1 -5
@@ 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;