|
|
|
1991/0712/sys/src/9/pc/main.c:4,235 –
1991/0716/sys/src/9/pc/main.c:4,145
(short | long | prev | next)
|
|
1991/0702
| |
#include "dat.h"
#include "fns.h"
|
|
1991/0706
| |
#include "io.h"
|
|
1991/0716
| |
#include "ureg.h"
#include "init.h"
|
|
1991/0629
| |
|
|
1991/0716
| |
char user[NAMELEN] = "bootes";
extern long edata;
|
|
1991/0711
| |
|
|
1991/0712
| |
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];
|
|
1991/0711
| |
Conf conf;
|
|
1991/0712
| |
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;
|
|
1991/0716
| |
void
|
|
1991/0702
| |
main(void)
|
|
1991/0625
| |
{
|
|
1991/0712
| |
char *path; /* file path */
char element[2*NAMELEN]; /* next element in a file path */
char def[2*NAMELEN];
|
|
1991/0711
| |
machinit();
confinit();
|
|
1991/0703
| |
screeninit();
|
|
1991/0716
| |
printinit();
|
|
1991/0711
| |
print("%d pages in bank0, %d pages in bank1\n", conf.npage0, conf.npage1);
print("edata == %lux, end == %lux\n", &edata, &end);
|
|
1991/0703
| |
trapinit();
|
|
1991/0711
| |
mmuinit();
clockinit();
|
|
1991/0716
| |
procinit0();
initseg();
grpinit();
chaninit();
|
|
1991/0711
| |
alarminit();
|
|
1991/0703
| |
kbdinit();
|
|
1991/0706
| |
clockinit();
floppyinit();
|
|
1991/0705
| |
spllo();
|
|
1991/0716
| |
chandevreset();
streaminit();
trapinit();
swapinit();
pageinit();
userinit();
|
|
1991/0711
| |
|
|
1991/0712
| |
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");
}
|
|
1991/0716
| |
schedinit();
|
|
1991/0712
| |
}
|
|
1991/0706
| |
|
|
1991/0712
| |
/*
* parse the server line. return 0 if OK, -1 if bullshit
|
|
1991/0716
| |
* BUG -- needs floating point support
|
|
1991/0712
| |
*/
int
parse(char *line)
|
|
1991/0716
| |
void
machinit(void)
|
|
1991/0712
| |
{
char *def[3];
char **d;
char *s;
int i;
|
|
1991/0716
| |
int n;
|
|
1991/0712
| |
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;
}
|
|
1991/0706
| |
}
|
|
1991/0712
| |
return -1;
|
|
1991/0716
| |
n = m->machno;
memset(m, 0, sizeof(Mach));
m->machno = n;
m->mmask = 1<<m->machno;
m->fpstate = FPinit;
active.machs = 1;
|
|
1991/0625
| |
}
|
|
1991/0712
| |
/*
* read a line from the keyboard.
*/
int
getline(int quiet)
|
|
1991/0716
| |
void
init0(void)
|
|
1991/0712
| |
{
int c, i=0;
long start;
|
|
1991/0716
| |
Chan *c;
|
|
1991/0712
| |
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;
}
|
|
1991/0716
| |
u->nerrlab = 0;
m->proc = u->p;
u->p->state = Running;
u->p->mach = m;
|
|
1991/0712
| |
/*
* 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;
|
|
1991/0716
| |
spllo();
|
|
1991/0712
| |
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;
}
|
|
1991/0716
| |
/*
* These are o.k. because rootinit is null.
* Then early kproc's will have a root and dot.
*/
u->slash = (*devtab[0].attach)(0);
u->dot = clone(u->slash, 0);
|
|
1991/0712
| |
int
menu(void)
{
|
|
1991/0716
| |
chandevinit();
/* kickpager(); /* BUG */
touser();
|
|
1991/0712
| |
}
|
|
1991/0629
| |
void
|
|
1991/0711
| |
machinit(void)
|
|
1991/0716
| |
userinit(void)
|
|
1991/0711
| |
{
int n;
|
|
1991/0716
| |
Proc *p;
Segment *s;
User *up;
KMap *k;
|
|
1991/0711
| |
n = m->machno;
memset(m, 0, sizeof(Mach));
m->machno = n;
m->mmask = 1<<m->machno;
active.machs = 1;
|
|
1991/0716
| |
p = newproc();
p->pgrp = newpgrp();
p->egrp = newegrp();
p->fgrp = newfgrp();
strcpy(p->text, "*init*");
p->fpstate = FPinit;
/*
* Kernel Stack
*/
p->sched.pc = (ulong)init0;
p->sched.sp = USERADDR + BY2PG - 24;
p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF));
/*
* User
*/
k = kmap(p->upage);
up = (User*)VA(k);
up->p = p;
kunmap(k);
/*
* User Stack
*/
s = newseg(SG_STACK, USTKTOP-BY2PG, 1);
p->seg[SSEG] = s;
/*
* Text
*/
s = newseg(SG_TEXT, UTZERO, 1);
p->seg[TSEG] = s;
segpage(s, newpage(1, 0, UTZERO));
k = kmap(s->map[0]->pages[0]);
memmove((ulong*)VA(k), initcode, sizeof initcode);
kunmap(k);
ready(p);
|
|
1991/0711
| |
}
void
|
|
1991/0702
| |
delay(int l)
|
|
1991/0716
| |
exit(void)
|
|
1991/0625
| |
{
|
|
1991/0702
| |
int i;
|
|
1991/0625
| |
|
|
1991/0702
| |
while(--l){
|
|
1991/0711
| |
for(i=0; i < 404; i++)
|
|
1991/0702
| |
;
}
|
|
1991/0716
| |
u = 0;
splhi();
print("exiting\n");
for(;;)
;
|
|
1991/0625
| |
}
|
|
1991/0716
| |
Conf conf;
|
|
1991/0711
| |
void
confinit(void)
{
|
|
1991/0712/sys/src/9/pc/main.c:314,437 –
1991/0716/sys/src/9/pc/main.c:224,271
|
|
1991/0711
| |
conf.cntrlp = 0;
}
|
|
1991/0702
| |
int
sprint(char *s, char *fmt, ...)
|
|
1991/0625
| |
{
|
|
1991/0702
| |
return doprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s;
|
|
1991/0625
| |
}
|
|
1991/0629
| |
|
|
1991/0702
| |
int
print(char *fmt, ...)
|
|
1991/0629
| |
{
|
|
1991/0702
| |
char buf[PRINTSIZE];
int n;
|
|
1991/0629
| |
|
|
1991/0702
| |
n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
screenputs(buf, n);
return n;
|
|
1991/0703
| |
}
|
|
1991/0716
| |
/*
* set up floating point for a new process
* BUG -- needs floating point support
*/
|
|
1991/0703
| |
void
panic(char *fmt, ...)
|
|
1991/0716
| |
procsetup(Proc *p)
|
|
1991/0703
| |
{
char buf[PRINTSIZE];
int n;
screenputs("panic: ", 7);
n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
screenputs(buf, n);
|
|
1991/0706
| |
screenputs("\n", 1);
spllo();
for(;;)
idle();
|
|
1991/0716
| |
p->fpstate = FPinit;
m->fpstate = FPinit;
|
|
1991/0705
| |
}
|
|
1991/0711
| |
int
kbdputc(IOQ* q, int c)
{
if(c==0x10)
panic("^p");
putc(q, c);
}
struct Palloc palloc;
void*
ialloc(ulong n, int align)
{
ulong p;
if(palloc.active && n!=0)
print("ialloc bad\n");
if(palloc.addr == 0)
palloc.addr = ((ulong)&end)&~KZERO;
if(align)
palloc.addr = PGROUND(palloc.addr);
memset((void*)(palloc.addr|KZERO), 0, n);
p = palloc.addr;
palloc.addr += n;
if(align)
palloc.addr = PGROUND(palloc.addr);
if(palloc.addr >= conf.maxialloc)
panic("keep bill joy away");
return (void*)(p|KZERO);
}
|
|
1991/0712
| |
/*
* some dummy's so we can use kernel code
|
|
1991/0716
| |
* Save the part of the process state.
* BUG -- needs floating point support
|
|
1991/0712
| |
*/
|
|
1991/0705
| |
void
sched(void)
|
|
1991/0711
| |
{ }
void
ready(Proc*p)
{ }
int
postnote(Proc*p, int x, char* y, int z)
|
|
1991/0716
| |
procsave(uchar *state, int len)
|
|
1991/0705
| |
{
|
|
1991/0711
| |
panic("postnote");
|
|
1991/0712
| |
}
/*
* boot from hard disk
|
|
1991/0716
| |
* Restore what procsave() saves
* BUG -- needs floating point support
|
|
1991/0712
| |
*/
int
hdboot(void)
|
|
1991/0716
| |
void
procrestore(Proc *p, uchar *state)
|
|
1991/0712
| |
{
print("hdboot unimplemented\n");
return -1;
}
/*
* boot from the duart
*/
int
duartboot(void)
|
|
1991/0716
| |
void
firmware(void)
|
|
1991/0712
| |
{
print("duartboot unimplemented\n");
return -1;
|
|
1991/0716
| |
panic("firmware");
|
|
1991/0712
| |
}
#include "dosfs.h"
/*
* boot from the floppy
*/
int
fdboot(void)
|
|
1991/0716
| |
void
buzz(int f, int d)
|
|
1991/0712
| |
{
Dosbpb b;
extern int dosboot(Dosbpb*);
|
|
1991/0716
| |
}
|
|
1991/0712
| |
print("booting from floppy 0\n");
b.seek = floppyseek;
b.read = floppyread;
b.dev = 0;
return dosboot(&b);
|
|
1991/0716
| |
void
lights(int val)
{
|
|
1991/0702
| |
}
|