#include "all.h"
#include "mem.h"
#include "io.h"
#include "ureg.h"
#include "../pc/dosfs.h"
#ifndef DATE
#define DATE 568011600L+4*3600
#endif
ulong mktime = DATE; /* set by mkfile */
Startsb startsb[] =
{
"main", 2,
0
};
Dos dos;
static
struct
{
char *name;
long (*read)(int, void*, long);
long (*seek)(int, long);
long (*write)(int, void*, long);
int (*part)(int, char*);
} nvrdevs[] =
{
{ "fd", floppyread, floppyseek, floppywrite, 0, },
{ "hd", ataread, ataseek, atawrite, setatapart, },
/*
{ "sd", scsiread, scsiseek, scsiwrite, setscsipart, },
*/
{ 0, },
};
void
otherinit(void)
{
int dev, i, nfd, nhd, s;
char *p, *q, buf[sizeof(nvrfile)+8];
kbdinit();
printcpufreq();
etherinit();
scsiinit();
s = spllo();
nhd = atainit();
nfd = floppyinit();
dev = 0;
if(p = getconf("nvr")){
strncpy(buf, p, sizeof(buf)-2);
buf[sizeof(buf)-1] = 0;
p = strchr(buf, '!');
q = strrchr(buf, '!');
if(p == 0 || q == 0 || strchr(p+1, '!') != q)
panic("malformed nvrfile: %s\n", buf);
*p++ = 0;
*q++ = 0;
dev = strtoul(p, 0, 0);
strcpy(nvrfile, q);
p = buf;
} else
if(p = getconf("bootfile")){
strncpy(buf, p, sizeof(buf)-2);
buf[sizeof(buf)-1] = 0;
p = strchr(buf, '!');
q = strrchr(buf, '!');
if(p == 0 || q == 0 || strchr(p+1, '!') != q)
panic("malformed bootfile: %s\n", buf);
*p++ = 0;
*q = 0;
dev = strtoul(p, 0, 0);
p = buf;
} else
if(nfd)
p = "fd";
else
if(nhd)
p = "hd";
else
p = "sd";
for(i = 0; nvrdevs[i].name; i++){
if(strcmp(p, nvrdevs[i].name) == 0){
dos.dev = dev;
if(nvrdevs[i].part && (*nvrdevs[i].part)(dos.dev, "disk") == 0)
break;
dos.read = nvrdevs[i].read;
dos.seek = nvrdevs[i].seek;
dos.write = nvrdevs[i].write;
break;
}
}
if(dos.read == 0)
panic("no device for nvram\n");
if(dosinit(&dos) < 0)
panic("can't init dos dosfs on %s\n", p);
splx(s);
}
void
touser(void)
{
int i;
settime(rtctime());
boottime = time();
print("sysinit\n");
sysinit();
userinit(floppyproc, 0, "floppyproc");
/*
* Ethernet i/o processes
*/
etherstart();
/*
* read ahead processes
*/
userinit(rahead, 0, "rah");
/*
* server processes
*/
for(i=0; i<conf.nserve; i++)
userinit(serve, 0, "srv");
/*
* worm "dump" copy process
*/
userinit(wormcopy, 0, "wcp");
/*
* processes to read the console
*/
consserve();
/*
* "sync" copy process
* this doesn't return.
*/
u->text = "scp";
synccopy();
}
void
localconfinit(void)
{
conf.nfile = 5000;
conf.wcpsize = 10;
conf.nodump = 1;
conf.firstsb = 0;
conf.recovsb = 0;
conf.ripoff = 1;
}
int (*fsprotocol[])(Msgbuf*) = {
serve9p1,
serve9p2,
nil,
};