xref: /inferno-os/os/fads/main.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth #include	"u.h"
2*74a4d8c2SCharles.Forsyth #include	"../port/lib.h"
3*74a4d8c2SCharles.Forsyth #include	"mem.h"
4*74a4d8c2SCharles.Forsyth #include	"dat.h"
5*74a4d8c2SCharles.Forsyth #include	"fns.h"
6*74a4d8c2SCharles.Forsyth #include	"io.h"
7*74a4d8c2SCharles.Forsyth #include	"ureg.h"
8*74a4d8c2SCharles.Forsyth #include "version.h"
9*74a4d8c2SCharles.Forsyth 
10*74a4d8c2SCharles.Forsyth /* where b.com or qboot leaves configuration info */
11*74a4d8c2SCharles.Forsyth #define BOOTARGS	((char*)CONFADDR)
12*74a4d8c2SCharles.Forsyth #define	BOOTARGSLEN	1024
13*74a4d8c2SCharles.Forsyth #define	MAXCONF		32
14*74a4d8c2SCharles.Forsyth 
15*74a4d8c2SCharles.Forsyth extern ulong kerndate;
16*74a4d8c2SCharles.Forsyth extern int cflag;
17*74a4d8c2SCharles.Forsyth int	remotedebug;
18*74a4d8c2SCharles.Forsyth 
19*74a4d8c2SCharles.Forsyth extern int main_pool_pcnt;
20*74a4d8c2SCharles.Forsyth extern int heap_pool_pcnt;
21*74a4d8c2SCharles.Forsyth extern int image_pool_pcnt;
22*74a4d8c2SCharles.Forsyth 
23*74a4d8c2SCharles.Forsyth char	bootargs[BOOTARGSLEN+1];
24*74a4d8c2SCharles.Forsyth char bootdisk[KNAMELEN];
25*74a4d8c2SCharles.Forsyth char *confname[MAXCONF];
26*74a4d8c2SCharles.Forsyth char *confval[MAXCONF];
27*74a4d8c2SCharles.Forsyth int nconf;
28*74a4d8c2SCharles.Forsyth 
29*74a4d8c2SCharles.Forsyth extern void addconf(char *, char *);
30*74a4d8c2SCharles.Forsyth 
31*74a4d8c2SCharles.Forsyth /*
32*74a4d8c2SCharles.Forsyth  *  arguments passed to initcode and /boot
33*74a4d8c2SCharles.Forsyth  */
34*74a4d8c2SCharles.Forsyth char argbuf[128];
35*74a4d8c2SCharles.Forsyth 
36*74a4d8c2SCharles.Forsyth static void
options(void)37*74a4d8c2SCharles.Forsyth options(void)
38*74a4d8c2SCharles.Forsyth {
39*74a4d8c2SCharles.Forsyth 	long i, n;
40*74a4d8c2SCharles.Forsyth 	char *cp, *line[MAXCONF], *p, *q;
41*74a4d8c2SCharles.Forsyth 
42*74a4d8c2SCharles.Forsyth 	/*
43*74a4d8c2SCharles.Forsyth 	 *  parse configuration args from bootstrap
44*74a4d8c2SCharles.Forsyth 	 */
45*74a4d8c2SCharles.Forsyth 	memmove(bootargs, BOOTARGS, BOOTARGSLEN);	/* where b.com leaves its config */
46*74a4d8c2SCharles.Forsyth 	cp = bootargs;
47*74a4d8c2SCharles.Forsyth 	cp[BOOTARGSLEN-1] = 0;
48*74a4d8c2SCharles.Forsyth 
49*74a4d8c2SCharles.Forsyth 	/*
50*74a4d8c2SCharles.Forsyth 	 * Strip out '\r', change '\t' -> ' '.
51*74a4d8c2SCharles.Forsyth 	 */
52*74a4d8c2SCharles.Forsyth 	p = cp;
53*74a4d8c2SCharles.Forsyth 	for(q = cp; *q; q++){
54*74a4d8c2SCharles.Forsyth 		if(*q == '\r')
55*74a4d8c2SCharles.Forsyth 			continue;
56*74a4d8c2SCharles.Forsyth 		if(*q == '\t')
57*74a4d8c2SCharles.Forsyth 			*q = ' ';
58*74a4d8c2SCharles.Forsyth 		*p++ = *q;
59*74a4d8c2SCharles.Forsyth 	}
60*74a4d8c2SCharles.Forsyth 	*p = 0;
61*74a4d8c2SCharles.Forsyth 
62*74a4d8c2SCharles.Forsyth 	n = getfields(cp, line, MAXCONF, 1, "\n");
63*74a4d8c2SCharles.Forsyth 	for(i = 0; i < n; i++){
64*74a4d8c2SCharles.Forsyth 		if(*line[i] == '#')
65*74a4d8c2SCharles.Forsyth 			continue;
66*74a4d8c2SCharles.Forsyth 		cp = strchr(line[i], '=');
67*74a4d8c2SCharles.Forsyth 		if(cp == 0)
68*74a4d8c2SCharles.Forsyth 			continue;
69*74a4d8c2SCharles.Forsyth 		*cp++ = 0;
70*74a4d8c2SCharles.Forsyth 		confname[nconf] = line[i];
71*74a4d8c2SCharles.Forsyth 		confval[nconf] = cp;
72*74a4d8c2SCharles.Forsyth 		nconf++;
73*74a4d8c2SCharles.Forsyth 	}
74*74a4d8c2SCharles.Forsyth }
75*74a4d8c2SCharles.Forsyth 
76*74a4d8c2SCharles.Forsyth void
doc(char * m)77*74a4d8c2SCharles.Forsyth doc(char *m)
78*74a4d8c2SCharles.Forsyth {
79*74a4d8c2SCharles.Forsyth 	USED(m);
80*74a4d8c2SCharles.Forsyth 	print("%s...\n", m); uartwait();
81*74a4d8c2SCharles.Forsyth }
82*74a4d8c2SCharles.Forsyth 
83*74a4d8c2SCharles.Forsyth static void
poolsizeinit(void)84*74a4d8c2SCharles.Forsyth poolsizeinit(void)
85*74a4d8c2SCharles.Forsyth {
86*74a4d8c2SCharles.Forsyth 	ulong nb;
87*74a4d8c2SCharles.Forsyth 
88*74a4d8c2SCharles.Forsyth 	nb = conf.npage*BY2PG;
89*74a4d8c2SCharles.Forsyth 	poolsize(mainmem, (nb*main_pool_pcnt)/100, 0);
90*74a4d8c2SCharles.Forsyth 	poolsize(heapmem, (nb*heap_pool_pcnt)/100, 0);
91*74a4d8c2SCharles.Forsyth 	poolsize(imagmem, (nb*image_pool_pcnt)/100, 1);
92*74a4d8c2SCharles.Forsyth }
93*74a4d8c2SCharles.Forsyth 
94*74a4d8c2SCharles.Forsyth static void
serialconsole(void)95*74a4d8c2SCharles.Forsyth serialconsole(void)
96*74a4d8c2SCharles.Forsyth {
97*74a4d8c2SCharles.Forsyth 	char *p;
98*74a4d8c2SCharles.Forsyth 	int port, baud;
99*74a4d8c2SCharles.Forsyth 
100*74a4d8c2SCharles.Forsyth 	p = getconf("console");
101*74a4d8c2SCharles.Forsyth 	if(p == nil)
102*74a4d8c2SCharles.Forsyth 		p = "0";
103*74a4d8c2SCharles.Forsyth 	if(p != nil && !remotedebug){
104*74a4d8c2SCharles.Forsyth 		port = strtol(p, nil, 0);
105*74a4d8c2SCharles.Forsyth 		baud = 9600;
106*74a4d8c2SCharles.Forsyth 		p = getconf("baud");
107*74a4d8c2SCharles.Forsyth 		if(p != nil){
108*74a4d8c2SCharles.Forsyth 			baud = strtol(p, nil, 0);
109*74a4d8c2SCharles.Forsyth 			if(baud < 9600)
110*74a4d8c2SCharles.Forsyth 				baud = 9600;
111*74a4d8c2SCharles.Forsyth 		}
112*74a4d8c2SCharles.Forsyth 		uartspecial(port, baud, &kbdq, &printq, kbdcr2nl);
113*74a4d8c2SCharles.Forsyth 	}
114*74a4d8c2SCharles.Forsyth }
115*74a4d8c2SCharles.Forsyth 
116*74a4d8c2SCharles.Forsyth void
main(void)117*74a4d8c2SCharles.Forsyth main(void)
118*74a4d8c2SCharles.Forsyth {
119*74a4d8c2SCharles.Forsyth 	machinit();
120*74a4d8c2SCharles.Forsyth 	options();
121*74a4d8c2SCharles.Forsyth 	archinit();
122*74a4d8c2SCharles.Forsyth 	quotefmtinstall();
123*74a4d8c2SCharles.Forsyth 	confinit();
124*74a4d8c2SCharles.Forsyth 	cpminit();
125*74a4d8c2SCharles.Forsyth 	xinit();
126*74a4d8c2SCharles.Forsyth 	poolsizeinit();
127*74a4d8c2SCharles.Forsyth 	trapinit();
128*74a4d8c2SCharles.Forsyth 	mmuinit();
129*74a4d8c2SCharles.Forsyth 	printinit();
130*74a4d8c2SCharles.Forsyth 	uartinstall();
131*74a4d8c2SCharles.Forsyth 	serialconsole();
132*74a4d8c2SCharles.Forsyth 	doc("screeninit");
133*74a4d8c2SCharles.Forsyth 	screeninit();
134*74a4d8c2SCharles.Forsyth 	doc("kbdinit");
135*74a4d8c2SCharles.Forsyth 	kbdinit();
136*74a4d8c2SCharles.Forsyth 	doc("clockinit");
137*74a4d8c2SCharles.Forsyth 	clockinit();
138*74a4d8c2SCharles.Forsyth 	doc("procinit");
139*74a4d8c2SCharles.Forsyth 	procinit();
140*74a4d8c2SCharles.Forsyth 	cpuidprint();
141*74a4d8c2SCharles.Forsyth 	doc("links");
142*74a4d8c2SCharles.Forsyth 	links();
143*74a4d8c2SCharles.Forsyth 	doc("chandevreset");
144*74a4d8c2SCharles.Forsyth 	chandevreset();
145*74a4d8c2SCharles.Forsyth 
146*74a4d8c2SCharles.Forsyth 	eve = strdup("inferno");
147*74a4d8c2SCharles.Forsyth 
148*74a4d8c2SCharles.Forsyth 	print("\nInferno %s\n", VERSION);
149*74a4d8c2SCharles.Forsyth 	print("Vita Nuova\n");
150*74a4d8c2SCharles.Forsyth 	print("conf %s (%lud) jit %d\n\n",conffile, kerndate, cflag);
151*74a4d8c2SCharles.Forsyth 
152*74a4d8c2SCharles.Forsyth 	doc("userinit");
153*74a4d8c2SCharles.Forsyth 	userinit();
154*74a4d8c2SCharles.Forsyth 	doc("schedinit");
155*74a4d8c2SCharles.Forsyth 	schedinit();
156*74a4d8c2SCharles.Forsyth }
157*74a4d8c2SCharles.Forsyth 
158*74a4d8c2SCharles.Forsyth void
machinit(void)159*74a4d8c2SCharles.Forsyth machinit(void)
160*74a4d8c2SCharles.Forsyth {
161*74a4d8c2SCharles.Forsyth 	int n;
162*74a4d8c2SCharles.Forsyth 
163*74a4d8c2SCharles.Forsyth 	n = m->machno;
164*74a4d8c2SCharles.Forsyth 	memset(m, 0, sizeof(Mach));
165*74a4d8c2SCharles.Forsyth 	m->machno = n;
166*74a4d8c2SCharles.Forsyth 	m->mmask = 1<<m->machno;
167*74a4d8c2SCharles.Forsyth 	m->iomem = KADDR(getimmr() & ~0xFFFF);
168*74a4d8c2SCharles.Forsyth 	m->cputype = getpvr()>>16;
169*74a4d8c2SCharles.Forsyth 	m->delayloop = 20000;	/* initial estimate only; set by clockinit */
170*74a4d8c2SCharles.Forsyth 	m->speed = 50;	/* initial estimate only; set by archinit */
171*74a4d8c2SCharles.Forsyth }
172*74a4d8c2SCharles.Forsyth 
173*74a4d8c2SCharles.Forsyth void
init0(void)174*74a4d8c2SCharles.Forsyth init0(void)
175*74a4d8c2SCharles.Forsyth {
176*74a4d8c2SCharles.Forsyth 	Osenv *o;
177*74a4d8c2SCharles.Forsyth 	int i;
178*74a4d8c2SCharles.Forsyth 	char buf[2*KNAMELEN];
179*74a4d8c2SCharles.Forsyth 
180*74a4d8c2SCharles.Forsyth 	up->nerrlab = 0;
181*74a4d8c2SCharles.Forsyth 
182*74a4d8c2SCharles.Forsyth 	spllo();
183*74a4d8c2SCharles.Forsyth 
184*74a4d8c2SCharles.Forsyth 	if(waserror())
185*74a4d8c2SCharles.Forsyth 		panic("init0");
186*74a4d8c2SCharles.Forsyth 	/*
187*74a4d8c2SCharles.Forsyth 	 * These are o.k. because rootinit is null.
188*74a4d8c2SCharles.Forsyth 	 * Then early kproc's will have a root and dot.
189*74a4d8c2SCharles.Forsyth 	 */
190*74a4d8c2SCharles.Forsyth 	o = up->env;
191*74a4d8c2SCharles.Forsyth 	o->pgrp->slash = namec("#/", Atodir, 0, 0);
192*74a4d8c2SCharles.Forsyth 	cnameclose(o->pgrp->slash->name);
193*74a4d8c2SCharles.Forsyth 	o->pgrp->slash->name = newcname("/");
194*74a4d8c2SCharles.Forsyth 	o->pgrp->dot = cclone(o->pgrp->slash);
195*74a4d8c2SCharles.Forsyth 
196*74a4d8c2SCharles.Forsyth 	chandevinit();
197*74a4d8c2SCharles.Forsyth 
198*74a4d8c2SCharles.Forsyth 	if(!waserror()){
199*74a4d8c2SCharles.Forsyth 		ksetenv("cputype", "power", 0);
200*74a4d8c2SCharles.Forsyth 		snprint(buf, sizeof(buf), "power %s", conffile);
201*74a4d8c2SCharles.Forsyth 		ksetenv("terminal", buf, 0);
202*74a4d8c2SCharles.Forsyth 		poperror();
203*74a4d8c2SCharles.Forsyth 	}
204*74a4d8c2SCharles.Forsyth 	for(i = 0; i < nconf; i++)
205*74a4d8c2SCharles.Forsyth 		if(confname[i][0] != '*'){
206*74a4d8c2SCharles.Forsyth 			if(!waserror()){
207*74a4d8c2SCharles.Forsyth 				ksetenv(confname[i], confval[i], 0);
208*74a4d8c2SCharles.Forsyth 				poperror();
209*74a4d8c2SCharles.Forsyth 			}
210*74a4d8c2SCharles.Forsyth 		}
211*74a4d8c2SCharles.Forsyth 
212*74a4d8c2SCharles.Forsyth 	poperror();
213*74a4d8c2SCharles.Forsyth 	disinit("/osinit.dis");
214*74a4d8c2SCharles.Forsyth }
215*74a4d8c2SCharles.Forsyth 
216*74a4d8c2SCharles.Forsyth void
userinit(void)217*74a4d8c2SCharles.Forsyth userinit(void)
218*74a4d8c2SCharles.Forsyth {
219*74a4d8c2SCharles.Forsyth 	Proc *p;
220*74a4d8c2SCharles.Forsyth 	Osenv *o;
221*74a4d8c2SCharles.Forsyth 
222*74a4d8c2SCharles.Forsyth 	p = newproc();
223*74a4d8c2SCharles.Forsyth 	o = p->env;
224*74a4d8c2SCharles.Forsyth 
225*74a4d8c2SCharles.Forsyth 	o->fgrp = newfgrp(nil);
226*74a4d8c2SCharles.Forsyth 
227*74a4d8c2SCharles.Forsyth 	o->pgrp = newpgrp();
228*74a4d8c2SCharles.Forsyth 	o->egrp = newegrp();
229*74a4d8c2SCharles.Forsyth 	kstrdup(&o->user, eve);
230*74a4d8c2SCharles.Forsyth 
231*74a4d8c2SCharles.Forsyth 	strcpy(p->text, "interp");
232*74a4d8c2SCharles.Forsyth 
233*74a4d8c2SCharles.Forsyth 	/*
234*74a4d8c2SCharles.Forsyth 	 * Kernel Stack
235*74a4d8c2SCharles.Forsyth 	 */
236*74a4d8c2SCharles.Forsyth 	p->sched.pc = (ulong)init0;
237*74a4d8c2SCharles.Forsyth 	p->sched.sp = (ulong)p->kstack+KSTACK;
238*74a4d8c2SCharles.Forsyth 
239*74a4d8c2SCharles.Forsyth 	ready(p);
240*74a4d8c2SCharles.Forsyth }
241*74a4d8c2SCharles.Forsyth 
242*74a4d8c2SCharles.Forsyth Conf	conf;
243*74a4d8c2SCharles.Forsyth 
244*74a4d8c2SCharles.Forsyth void
addconf(char * name,char * val)245*74a4d8c2SCharles.Forsyth addconf(char *name, char *val)
246*74a4d8c2SCharles.Forsyth {
247*74a4d8c2SCharles.Forsyth 	if(nconf >= MAXCONF)
248*74a4d8c2SCharles.Forsyth 		return;
249*74a4d8c2SCharles.Forsyth 	confname[nconf] = name;
250*74a4d8c2SCharles.Forsyth 	confval[nconf] = val;
251*74a4d8c2SCharles.Forsyth 	nconf++;
252*74a4d8c2SCharles.Forsyth }
253*74a4d8c2SCharles.Forsyth 
254*74a4d8c2SCharles.Forsyth char*
getconf(char * name)255*74a4d8c2SCharles.Forsyth getconf(char *name)
256*74a4d8c2SCharles.Forsyth {
257*74a4d8c2SCharles.Forsyth 	int i;
258*74a4d8c2SCharles.Forsyth 
259*74a4d8c2SCharles.Forsyth 	for(i = 0; i < nconf; i++)
260*74a4d8c2SCharles.Forsyth 		if(cistrcmp(confname[i], name) == 0)
261*74a4d8c2SCharles.Forsyth 			return confval[i];
262*74a4d8c2SCharles.Forsyth 	return 0;
263*74a4d8c2SCharles.Forsyth }
264*74a4d8c2SCharles.Forsyth 
265*74a4d8c2SCharles.Forsyth void
confinit(void)266*74a4d8c2SCharles.Forsyth confinit(void)
267*74a4d8c2SCharles.Forsyth {
268*74a4d8c2SCharles.Forsyth 	char *p;
269*74a4d8c2SCharles.Forsyth 	int pcnt;
270*74a4d8c2SCharles.Forsyth 
271*74a4d8c2SCharles.Forsyth 	if(p = getconf("*kernelpercent"))
272*74a4d8c2SCharles.Forsyth 		pcnt = 100 - strtol(p, 0, 0);
273*74a4d8c2SCharles.Forsyth 	else
274*74a4d8c2SCharles.Forsyth 		pcnt = 0;
275*74a4d8c2SCharles.Forsyth 
276*74a4d8c2SCharles.Forsyth 	conf.nscc = 4;
277*74a4d8c2SCharles.Forsyth 	conf.smcuarts = 1<<0;	/* SMC1 (usual console) */
278*74a4d8c2SCharles.Forsyth 	conf.sccuarts = 1<<1;	/* SCC2 available by default */
279*74a4d8c2SCharles.Forsyth 
280*74a4d8c2SCharles.Forsyth 	archconfinit();
281*74a4d8c2SCharles.Forsyth 
282*74a4d8c2SCharles.Forsyth 	conf.npage = conf.npage0 + conf.npage1;
283*74a4d8c2SCharles.Forsyth 	if(pcnt < 10)
284*74a4d8c2SCharles.Forsyth 		pcnt = 70;
285*74a4d8c2SCharles.Forsyth 	conf.ialloc = (((conf.npage*(100-pcnt))/100)/2)*BY2PG;
286*74a4d8c2SCharles.Forsyth 
287*74a4d8c2SCharles.Forsyth 	conf.nproc = 100 + ((conf.npage*BY2PG)/MB)*5;
288*74a4d8c2SCharles.Forsyth 	conf.nmach = MAXMACH;
289*74a4d8c2SCharles.Forsyth }
290*74a4d8c2SCharles.Forsyth 
291*74a4d8c2SCharles.Forsyth void
exit(int ispanic)292*74a4d8c2SCharles.Forsyth exit(int ispanic)
293*74a4d8c2SCharles.Forsyth {
294*74a4d8c2SCharles.Forsyth 	up = 0;
295*74a4d8c2SCharles.Forsyth 	spllo();
296*74a4d8c2SCharles.Forsyth 	print("cpu %d exiting\n", m->machno);
297*74a4d8c2SCharles.Forsyth 
298*74a4d8c2SCharles.Forsyth 	/* Shutdown running devices */
299*74a4d8c2SCharles.Forsyth 	chandevshutdown();
300*74a4d8c2SCharles.Forsyth 
301*74a4d8c2SCharles.Forsyth 	delay(1000);
302*74a4d8c2SCharles.Forsyth 	splhi();
303*74a4d8c2SCharles.Forsyth 	if(ispanic)
304*74a4d8c2SCharles.Forsyth 		for(;;);
305*74a4d8c2SCharles.Forsyth 	archreboot();
306*74a4d8c2SCharles.Forsyth }
307*74a4d8c2SCharles.Forsyth 
308*74a4d8c2SCharles.Forsyth void
reboot(void)309*74a4d8c2SCharles.Forsyth reboot(void)
310*74a4d8c2SCharles.Forsyth {
311*74a4d8c2SCharles.Forsyth 	exit(0);
312*74a4d8c2SCharles.Forsyth }
313*74a4d8c2SCharles.Forsyth 
314*74a4d8c2SCharles.Forsyth void
halt(void)315*74a4d8c2SCharles.Forsyth halt(void)
316*74a4d8c2SCharles.Forsyth {
317*74a4d8c2SCharles.Forsyth 	print("cpu halted\n");
318*74a4d8c2SCharles.Forsyth 	microdelay(1000);
319*74a4d8c2SCharles.Forsyth 	for(;;)
320*74a4d8c2SCharles.Forsyth 		;
321*74a4d8c2SCharles.Forsyth }
322*74a4d8c2SCharles.Forsyth 
323*74a4d8c2SCharles.Forsyth int
isaconfig(char * class,int ctlrno,ISAConf * isa)324*74a4d8c2SCharles.Forsyth isaconfig(char *class, int ctlrno, ISAConf *isa)
325*74a4d8c2SCharles.Forsyth {
326*74a4d8c2SCharles.Forsyth 	char cc[KNAMELEN], *p;
327*74a4d8c2SCharles.Forsyth 	int i;
328*74a4d8c2SCharles.Forsyth 
329*74a4d8c2SCharles.Forsyth 	snprint(cc, sizeof cc, "%s%d", class, ctlrno);
330*74a4d8c2SCharles.Forsyth 	p = getconf(cc);
331*74a4d8c2SCharles.Forsyth 	if(p == nil)
332*74a4d8c2SCharles.Forsyth 		return 0;
333*74a4d8c2SCharles.Forsyth 
334*74a4d8c2SCharles.Forsyth 	isa->nopt = tokenize(p, isa->opt, NISAOPT);
335*74a4d8c2SCharles.Forsyth 	for(i = 0; i < isa->nopt; i++){
336*74a4d8c2SCharles.Forsyth 		p = isa->opt[i];
337*74a4d8c2SCharles.Forsyth 		if(cistrncmp(p, "type=", 5) == 0)
338*74a4d8c2SCharles.Forsyth 			isa->type = p + 5;
339*74a4d8c2SCharles.Forsyth 		else if(cistrncmp(p, "port=", 5) == 0)
340*74a4d8c2SCharles.Forsyth 			isa->port = strtoul(p+5, &p, 0);
341*74a4d8c2SCharles.Forsyth 		else if(cistrncmp(p, "irq=", 4) == 0)
342*74a4d8c2SCharles.Forsyth 			isa->irq = strtoul(p+4, &p, 0);
343*74a4d8c2SCharles.Forsyth 		else if(cistrncmp(p, "mem=", 4) == 0)
344*74a4d8c2SCharles.Forsyth 			isa->mem = strtoul(p+4, &p, 0);
345*74a4d8c2SCharles.Forsyth 		else if(cistrncmp(p, "size=", 5) == 0)
346*74a4d8c2SCharles.Forsyth 			isa->size = strtoul(p+5, &p, 0);
347*74a4d8c2SCharles.Forsyth 		else if(cistrncmp(p, "freq=", 5) == 0)
348*74a4d8c2SCharles.Forsyth 			isa->freq = strtoul(p+5, &p, 0);
349*74a4d8c2SCharles.Forsyth 		else if(cistrncmp(p, "dma=", 4) == 0)
350*74a4d8c2SCharles.Forsyth 			isa->dma = strtoul(p+4, &p, 0);
351*74a4d8c2SCharles.Forsyth 	}
352*74a4d8c2SCharles.Forsyth 	return 1;
353*74a4d8c2SCharles.Forsyth }
354*74a4d8c2SCharles.Forsyth 
355*74a4d8c2SCharles.Forsyth /*
356*74a4d8c2SCharles.Forsyth  *  Save the mach dependent part of the process state.
357*74a4d8c2SCharles.Forsyth  */
358*74a4d8c2SCharles.Forsyth void
procsave(Proc *)359*74a4d8c2SCharles.Forsyth procsave(Proc*)
360*74a4d8c2SCharles.Forsyth {
361*74a4d8c2SCharles.Forsyth }
362*74a4d8c2SCharles.Forsyth 
363*74a4d8c2SCharles.Forsyth void
uartputs(char * s,int n)364*74a4d8c2SCharles.Forsyth uartputs(char *s, int n)
365*74a4d8c2SCharles.Forsyth {
366*74a4d8c2SCharles.Forsyth //	screenputs(buf, n);
367*74a4d8c2SCharles.Forsyth 	putstrn(s, n);
368*74a4d8c2SCharles.Forsyth 	uartwait();
369*74a4d8c2SCharles.Forsyth }
370*74a4d8c2SCharles.Forsyth 
371*74a4d8c2SCharles.Forsyth /* stubs */
372*74a4d8c2SCharles.Forsyth void
setfsr(ulong)373*74a4d8c2SCharles.Forsyth setfsr(ulong)
374*74a4d8c2SCharles.Forsyth {
375*74a4d8c2SCharles.Forsyth }
376*74a4d8c2SCharles.Forsyth 
377*74a4d8c2SCharles.Forsyth ulong
getfsr()378*74a4d8c2SCharles.Forsyth getfsr()
379*74a4d8c2SCharles.Forsyth {
380*74a4d8c2SCharles.Forsyth 	return 0;
381*74a4d8c2SCharles.Forsyth }
382*74a4d8c2SCharles.Forsyth 
383*74a4d8c2SCharles.Forsyth void
setfcr(ulong)384*74a4d8c2SCharles.Forsyth setfcr(ulong)
385*74a4d8c2SCharles.Forsyth {
386*74a4d8c2SCharles.Forsyth }
387*74a4d8c2SCharles.Forsyth 
388*74a4d8c2SCharles.Forsyth ulong
getfcr()389*74a4d8c2SCharles.Forsyth getfcr()
390*74a4d8c2SCharles.Forsyth {
391*74a4d8c2SCharles.Forsyth 	return 0;
392*74a4d8c2SCharles.Forsyth }
393