~kris/9p

9hist

a93e2ace3e40f7ee822c7082fb6d8a961debde00 — David du Colombier 35 years ago 0ea653b
Plan 9 from Bell Labs 1991-07-12
9 files changed, 240 insertions(+), 37 deletions(-)

M pc/fns.h
M pc/main.c
M port/devproc.c
M port/proc.c
M port/sysproc.c
M ss/faultsparc.c
M ss/l.s
M ss/main.c
M ss/trap.c
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;