1*74a4d8c2SCharles.Forsyth #include "u.h"
2*74a4d8c2SCharles.Forsyth #include "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
8*74a4d8c2SCharles.Forsyth #include "dosfs.h"
9*74a4d8c2SCharles.Forsyth
10*74a4d8c2SCharles.Forsyth static char *confname[MAXCONF];
11*74a4d8c2SCharles.Forsyth static char *confval[MAXCONF];
12*74a4d8c2SCharles.Forsyth static int nconf;
13*74a4d8c2SCharles.Forsyth
14*74a4d8c2SCharles.Forsyth static char* defplan9ini =
15*74a4d8c2SCharles.Forsyth "ether0=type=CS8900\r\n"
16*74a4d8c2SCharles.Forsyth "vgasize=640x480x8\r\n"
17*74a4d8c2SCharles.Forsyth "kernelpercent=40\r\n"
18*74a4d8c2SCharles.Forsyth "console=1\r\nbaud=9600\r\n"
19*74a4d8c2SCharles.Forsyth ;
20*74a4d8c2SCharles.Forsyth
21*74a4d8c2SCharles.Forsyth extern char **ini;
22*74a4d8c2SCharles.Forsyth
23*74a4d8c2SCharles.Forsyth char*
getconf(char * name)24*74a4d8c2SCharles.Forsyth getconf(char *name)
25*74a4d8c2SCharles.Forsyth {
26*74a4d8c2SCharles.Forsyth int i;
27*74a4d8c2SCharles.Forsyth
28*74a4d8c2SCharles.Forsyth for(i = 0; i < nconf; i++)
29*74a4d8c2SCharles.Forsyth if(strcmp(confname[i], name) == 0)
30*74a4d8c2SCharles.Forsyth return confval[i];
31*74a4d8c2SCharles.Forsyth return 0;
32*74a4d8c2SCharles.Forsyth }
33*74a4d8c2SCharles.Forsyth
34*74a4d8c2SCharles.Forsyth /*
35*74a4d8c2SCharles.Forsyth * read configuration file
36*74a4d8c2SCharles.Forsyth */
37*74a4d8c2SCharles.Forsyth int
plan9ini(Dos * dos,char * val)38*74a4d8c2SCharles.Forsyth plan9ini(Dos *dos, char *val)
39*74a4d8c2SCharles.Forsyth {
40*74a4d8c2SCharles.Forsyth Dosfile rc;
41*74a4d8c2SCharles.Forsyth int i, n;
42*74a4d8c2SCharles.Forsyth char *cp, *p, *q, *line[MAXCONF];
43*74a4d8c2SCharles.Forsyth
44*74a4d8c2SCharles.Forsyth cp = BOOTARGS;
45*74a4d8c2SCharles.Forsyth if(dos) {
46*74a4d8c2SCharles.Forsyth if(dosstat(dos, *ini, &rc) <= 0)
47*74a4d8c2SCharles.Forsyth return -1;
48*74a4d8c2SCharles.Forsyth
49*74a4d8c2SCharles.Forsyth *cp = 0;
50*74a4d8c2SCharles.Forsyth n = dosread(&rc, cp, BOOTARGSLEN-1);
51*74a4d8c2SCharles.Forsyth if(n <= 0)
52*74a4d8c2SCharles.Forsyth return -1;
53*74a4d8c2SCharles.Forsyth cp[n] = 0;
54*74a4d8c2SCharles.Forsyth } else if(val != nil){
55*74a4d8c2SCharles.Forsyth if(memchr(val, 0, BOOTARGSLEN-1) == nil)
56*74a4d8c2SCharles.Forsyth return -1;
57*74a4d8c2SCharles.Forsyth print("Using flash configuration\n");
58*74a4d8c2SCharles.Forsyth strcpy(cp, val);
59*74a4d8c2SCharles.Forsyth n = strlen(cp);
60*74a4d8c2SCharles.Forsyth }else{
61*74a4d8c2SCharles.Forsyth print("Using default configuration\n");
62*74a4d8c2SCharles.Forsyth strcpy(cp, defplan9ini);
63*74a4d8c2SCharles.Forsyth n = strlen(cp);
64*74a4d8c2SCharles.Forsyth }
65*74a4d8c2SCharles.Forsyth
66*74a4d8c2SCharles.Forsyth /*
67*74a4d8c2SCharles.Forsyth * Make a working copy.
68*74a4d8c2SCharles.Forsyth * We could change this to pass the parsed strings
69*74a4d8c2SCharles.Forsyth * to the booted programme instead of the raw
70*74a4d8c2SCharles.Forsyth * string, then it only gets done once.
71*74a4d8c2SCharles.Forsyth */
72*74a4d8c2SCharles.Forsyth memmove(cp+BOOTARGSLEN, cp, n+1);
73*74a4d8c2SCharles.Forsyth cp += BOOTARGSLEN;
74*74a4d8c2SCharles.Forsyth
75*74a4d8c2SCharles.Forsyth /*
76*74a4d8c2SCharles.Forsyth * Strip out '\r', change '\t' -> ' '.
77*74a4d8c2SCharles.Forsyth */
78*74a4d8c2SCharles.Forsyth p = cp;
79*74a4d8c2SCharles.Forsyth for(q = cp; *q; q++){
80*74a4d8c2SCharles.Forsyth if(*q == '\r')
81*74a4d8c2SCharles.Forsyth continue;
82*74a4d8c2SCharles.Forsyth if(*q == '\t')
83*74a4d8c2SCharles.Forsyth *q = ' ';
84*74a4d8c2SCharles.Forsyth *p++ = *q;
85*74a4d8c2SCharles.Forsyth }
86*74a4d8c2SCharles.Forsyth *p = 0;
87*74a4d8c2SCharles.Forsyth n = getcfields(cp, line, MAXCONF, "\n");
88*74a4d8c2SCharles.Forsyth for(i = 0; i < n; i++){
89*74a4d8c2SCharles.Forsyth cp = strchr(line[i], '=');
90*74a4d8c2SCharles.Forsyth if(cp == 0)
91*74a4d8c2SCharles.Forsyth continue;
92*74a4d8c2SCharles.Forsyth *cp++ = 0;
93*74a4d8c2SCharles.Forsyth if(cp - line[i] >= NAMELEN+1)
94*74a4d8c2SCharles.Forsyth *(line[i]+NAMELEN-1) = 0;
95*74a4d8c2SCharles.Forsyth confname[nconf] = line[i];
96*74a4d8c2SCharles.Forsyth confval[nconf] = cp;
97*74a4d8c2SCharles.Forsyth nconf++;
98*74a4d8c2SCharles.Forsyth }
99*74a4d8c2SCharles.Forsyth return 0;
100*74a4d8c2SCharles.Forsyth }
101*74a4d8c2SCharles.Forsyth
102*74a4d8c2SCharles.Forsyth static int
parseether(uchar * to,char * from)103*74a4d8c2SCharles.Forsyth parseether(uchar *to, char *from)
104*74a4d8c2SCharles.Forsyth {
105*74a4d8c2SCharles.Forsyth char nip[4];
106*74a4d8c2SCharles.Forsyth char *p;
107*74a4d8c2SCharles.Forsyth int i;
108*74a4d8c2SCharles.Forsyth
109*74a4d8c2SCharles.Forsyth p = from;
110*74a4d8c2SCharles.Forsyth while(*p == ' ')
111*74a4d8c2SCharles.Forsyth ++p;
112*74a4d8c2SCharles.Forsyth for(i = 0; i < 6; i++){
113*74a4d8c2SCharles.Forsyth if(*p == 0)
114*74a4d8c2SCharles.Forsyth return -1;
115*74a4d8c2SCharles.Forsyth nip[0] = *p++;
116*74a4d8c2SCharles.Forsyth if(*p == 0)
117*74a4d8c2SCharles.Forsyth return -1;
118*74a4d8c2SCharles.Forsyth nip[1] = *p++;
119*74a4d8c2SCharles.Forsyth nip[2] = 0;
120*74a4d8c2SCharles.Forsyth to[i] = strtoul(nip, 0, 16);
121*74a4d8c2SCharles.Forsyth if(*p == ':')
122*74a4d8c2SCharles.Forsyth p++;
123*74a4d8c2SCharles.Forsyth }
124*74a4d8c2SCharles.Forsyth return 0;
125*74a4d8c2SCharles.Forsyth }
126*74a4d8c2SCharles.Forsyth
127*74a4d8c2SCharles.Forsyth int
isaconfig(char * class,int ctlrno,ISAConf * isa)128*74a4d8c2SCharles.Forsyth isaconfig(char *class, int ctlrno, ISAConf *isa)
129*74a4d8c2SCharles.Forsyth {
130*74a4d8c2SCharles.Forsyth char cc[NAMELEN], *p, *q, *r;
131*74a4d8c2SCharles.Forsyth int n;
132*74a4d8c2SCharles.Forsyth
133*74a4d8c2SCharles.Forsyth sprint(cc, "%s%d", class, ctlrno);
134*74a4d8c2SCharles.Forsyth for(n = 0; n < nconf; n++){
135*74a4d8c2SCharles.Forsyth if(strncmp(confname[n], cc, NAMELEN))
136*74a4d8c2SCharles.Forsyth continue;
137*74a4d8c2SCharles.Forsyth isa->nopt = 0;
138*74a4d8c2SCharles.Forsyth p = confval[n];
139*74a4d8c2SCharles.Forsyth while(*p){
140*74a4d8c2SCharles.Forsyth while(*p == ' ' || *p == '\t')
141*74a4d8c2SCharles.Forsyth p++;
142*74a4d8c2SCharles.Forsyth if(*p == '\0')
143*74a4d8c2SCharles.Forsyth break;
144*74a4d8c2SCharles.Forsyth if(strncmp(p, "type=", 5) == 0){
145*74a4d8c2SCharles.Forsyth p += 5;
146*74a4d8c2SCharles.Forsyth for(q = isa->type; q < &isa->type[NAMELEN-1]; q++){
147*74a4d8c2SCharles.Forsyth if(*p == '\0' || *p == ' ' || *p == '\t')
148*74a4d8c2SCharles.Forsyth break;
149*74a4d8c2SCharles.Forsyth *q = *p++;
150*74a4d8c2SCharles.Forsyth }
151*74a4d8c2SCharles.Forsyth *q = '\0';
152*74a4d8c2SCharles.Forsyth }
153*74a4d8c2SCharles.Forsyth else if(strncmp(p, "port=", 5) == 0)
154*74a4d8c2SCharles.Forsyth isa->port = strtoul(p+5, &p, 0);
155*74a4d8c2SCharles.Forsyth else if(strncmp(p, "irq=", 4) == 0)
156*74a4d8c2SCharles.Forsyth isa->irq = strtoul(p+4, &p, 0);
157*74a4d8c2SCharles.Forsyth else if(strncmp(p, "mem=", 4) == 0)
158*74a4d8c2SCharles.Forsyth isa->mem = strtoul(p+4, &p, 0);
159*74a4d8c2SCharles.Forsyth else if(strncmp(p, "size=", 5) == 0)
160*74a4d8c2SCharles.Forsyth isa->size = strtoul(p+5, &p, 0);
161*74a4d8c2SCharles.Forsyth else if(strncmp(p, "ea=", 3) == 0){
162*74a4d8c2SCharles.Forsyth if(parseether(isa->ea, p+3) == -1)
163*74a4d8c2SCharles.Forsyth memset(isa->ea, 0, 6);
164*74a4d8c2SCharles.Forsyth }
165*74a4d8c2SCharles.Forsyth else if(isa->nopt < NISAOPT){
166*74a4d8c2SCharles.Forsyth r = isa->opt[isa->nopt];
167*74a4d8c2SCharles.Forsyth while(*p && *p != ' ' && *p != '\t'){
168*74a4d8c2SCharles.Forsyth *r++ = *p++;
169*74a4d8c2SCharles.Forsyth if(r-isa->opt[isa->nopt] >= ISAOPTLEN-1)
170*74a4d8c2SCharles.Forsyth break;
171*74a4d8c2SCharles.Forsyth }
172*74a4d8c2SCharles.Forsyth *r = '\0';
173*74a4d8c2SCharles.Forsyth isa->nopt++;
174*74a4d8c2SCharles.Forsyth }
175*74a4d8c2SCharles.Forsyth while(*p && *p != ' ' && *p != '\t')
176*74a4d8c2SCharles.Forsyth p++;
177*74a4d8c2SCharles.Forsyth }
178*74a4d8c2SCharles.Forsyth return 1;
179*74a4d8c2SCharles.Forsyth }
180*74a4d8c2SCharles.Forsyth return 0;
181*74a4d8c2SCharles.Forsyth }
182