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