1*9ef1f84bSDavid du Colombier #include "u.h"
2*9ef1f84bSDavid du Colombier #include "../port/lib.h"
3*9ef1f84bSDavid du Colombier #include "mem.h"
4*9ef1f84bSDavid du Colombier #include "dat.h"
5*9ef1f84bSDavid du Colombier #include "fns.h"
6*9ef1f84bSDavid du Colombier
7*9ef1f84bSDavid du Colombier /*
8*9ef1f84bSDavid du Colombier Conf conf;
9*9ef1f84bSDavid du Colombier char *confname[1] = {
10*9ef1f84bSDavid du Colombier "console",
11*9ef1f84bSDavid du Colombier };
12*9ef1f84bSDavid du Colombier char *confval[1] = {
13*9ef1f84bSDavid du Colombier "0 b115200",
14*9ef1f84bSDavid du Colombier };
15*9ef1f84bSDavid du Colombier int nconf = nelem(confname);
16*9ef1f84bSDavid du Colombier */
17*9ef1f84bSDavid du Colombier
18*9ef1f84bSDavid du Colombier /*
19*9ef1f84bSDavid du Colombier * Where configuration info is left for the loaded programme.
20*9ef1f84bSDavid du Colombier * This will turn into a structure as more is done by the boot loader
21*9ef1f84bSDavid du Colombier * (e.g. why parse the .ini file twice?).
22*9ef1f84bSDavid du Colombier * There are 3584 bytes available at CONFADDR.
23*9ef1f84bSDavid du Colombier */
24*9ef1f84bSDavid du Colombier #define CONFADDR PTR2UINT(KADDR(0x0001200))
25*9ef1f84bSDavid du Colombier
26*9ef1f84bSDavid du Colombier #define BOOTLINE ((char*)CONFADDR)
27*9ef1f84bSDavid du Colombier #define BOOTLINELEN 64
28*9ef1f84bSDavid du Colombier #define BOOTARGS ((char*)(CONFADDR+BOOTLINELEN))
29*9ef1f84bSDavid du Colombier #define BOOTARGSLEN (4096-0x200-BOOTLINELEN)
30*9ef1f84bSDavid du Colombier #define MAXCONF 64
31*9ef1f84bSDavid du Colombier
32*9ef1f84bSDavid du Colombier char *confname[MAXCONF];
33*9ef1f84bSDavid du Colombier char *confval[MAXCONF];
34*9ef1f84bSDavid du Colombier int nconf;
35*9ef1f84bSDavid du Colombier
36*9ef1f84bSDavid du Colombier void
crapoptions(void)37*9ef1f84bSDavid du Colombier crapoptions(void)
38*9ef1f84bSDavid du Colombier {
39*9ef1f84bSDavid du Colombier long i, n;
40*9ef1f84bSDavid du Colombier char *cp, *line[MAXCONF], *p, *q;
41*9ef1f84bSDavid du Colombier
42*9ef1f84bSDavid du Colombier /*
43*9ef1f84bSDavid du Colombier * parse configuration args from dos file plan9.ini
44*9ef1f84bSDavid du Colombier */
45*9ef1f84bSDavid du Colombier cp = BOOTARGS; /* where b.com leaves its config */
46*9ef1f84bSDavid du Colombier cp[BOOTARGSLEN-1] = 0;
47*9ef1f84bSDavid du Colombier
48*9ef1f84bSDavid du Colombier /*
49*9ef1f84bSDavid du Colombier * Strip out '\r', change '\t' -> ' '.
50*9ef1f84bSDavid du Colombier */
51*9ef1f84bSDavid du Colombier p = cp;
52*9ef1f84bSDavid du Colombier for(q = cp; *q; q++){
53*9ef1f84bSDavid du Colombier if(*q == '\r')
54*9ef1f84bSDavid du Colombier continue;
55*9ef1f84bSDavid du Colombier if(*q == '\t')
56*9ef1f84bSDavid du Colombier *q = ' ';
57*9ef1f84bSDavid du Colombier *p++ = *q;
58*9ef1f84bSDavid du Colombier }
59*9ef1f84bSDavid du Colombier *p = 0;
60*9ef1f84bSDavid du Colombier
61*9ef1f84bSDavid du Colombier n = getfields(cp, line, MAXCONF, 1, "\n");
62*9ef1f84bSDavid du Colombier for(i = 0; i < n; i++){
63*9ef1f84bSDavid du Colombier if(*line[i] == '#')
64*9ef1f84bSDavid du Colombier continue;
65*9ef1f84bSDavid du Colombier cp = strchr(line[i], '=');
66*9ef1f84bSDavid du Colombier if(cp == nil)
67*9ef1f84bSDavid du Colombier continue;
68*9ef1f84bSDavid du Colombier *cp++ = '\0';
69*9ef1f84bSDavid du Colombier confname[nconf] = line[i];
70*9ef1f84bSDavid du Colombier confval[nconf] = cp;
71*9ef1f84bSDavid du Colombier nconf++;
72*9ef1f84bSDavid du Colombier }
73*9ef1f84bSDavid du Colombier }
74*9ef1f84bSDavid du Colombier
75*9ef1f84bSDavid du Colombier char*
getconf(char * name)76*9ef1f84bSDavid du Colombier getconf(char *name)
77*9ef1f84bSDavid du Colombier {
78*9ef1f84bSDavid du Colombier int i;
79*9ef1f84bSDavid du Colombier
80*9ef1f84bSDavid du Colombier for(i = 0; i < nconf; i++)
81*9ef1f84bSDavid du Colombier if(cistrcmp(confname[i], name) == 0)
82*9ef1f84bSDavid du Colombier return confval[i];
83*9ef1f84bSDavid du Colombier return 0;
84*9ef1f84bSDavid du Colombier }
85*9ef1f84bSDavid du Colombier
86*9ef1f84bSDavid du Colombier void
confsetenv(void)87*9ef1f84bSDavid du Colombier confsetenv(void)
88*9ef1f84bSDavid du Colombier {
89*9ef1f84bSDavid du Colombier int i;
90*9ef1f84bSDavid du Colombier
91*9ef1f84bSDavid du Colombier for(i = 0; i < nconf; i++){
92*9ef1f84bSDavid du Colombier if(confname[i][0] != '*')
93*9ef1f84bSDavid du Colombier ksetenv(confname[i], confval[i], 0);
94*9ef1f84bSDavid du Colombier ksetenv(confname[i], confval[i], 1);
95*9ef1f84bSDavid du Colombier }
96*9ef1f84bSDavid du Colombier }
97*9ef1f84bSDavid du Colombier
98*9ef1f84bSDavid du Colombier int
isaconfig(char * class,int ctlrno,ISAConf * isa)99*9ef1f84bSDavid du Colombier isaconfig(char *class, int ctlrno, ISAConf *isa)
100*9ef1f84bSDavid du Colombier {
101*9ef1f84bSDavid du Colombier char cc[32], *p;
102*9ef1f84bSDavid du Colombier int i;
103*9ef1f84bSDavid du Colombier
104*9ef1f84bSDavid du Colombier snprint(cc, sizeof cc, "%s%d", class, ctlrno);
105*9ef1f84bSDavid du Colombier p = getconf(cc);
106*9ef1f84bSDavid du Colombier if(p == nil)
107*9ef1f84bSDavid du Colombier return 0;
108*9ef1f84bSDavid du Colombier
109*9ef1f84bSDavid du Colombier isa->type = "";
110*9ef1f84bSDavid du Colombier isa->nopt = tokenize(p, isa->opt, NISAOPT);
111*9ef1f84bSDavid du Colombier for(i = 0; i < isa->nopt; i++){
112*9ef1f84bSDavid du Colombier p = isa->opt[i];
113*9ef1f84bSDavid du Colombier if(cistrncmp(p, "type=", 5) == 0)
114*9ef1f84bSDavid du Colombier isa->type = p + 5;
115*9ef1f84bSDavid du Colombier else if(cistrncmp(p, "port=", 5) == 0)
116*9ef1f84bSDavid du Colombier isa->port = strtoul(p+5, &p, 0);
117*9ef1f84bSDavid du Colombier else if(cistrncmp(p, "irq=", 4) == 0)
118*9ef1f84bSDavid du Colombier isa->irq = strtoul(p+4, &p, 0);
119*9ef1f84bSDavid du Colombier else if(cistrncmp(p, "dma=", 4) == 0)
120*9ef1f84bSDavid du Colombier isa->dma = strtoul(p+4, &p, 0);
121*9ef1f84bSDavid du Colombier else if(cistrncmp(p, "mem=", 4) == 0)
122*9ef1f84bSDavid du Colombier isa->mem = strtoul(p+4, &p, 0);
123*9ef1f84bSDavid du Colombier else if(cistrncmp(p, "size=", 5) == 0)
124*9ef1f84bSDavid du Colombier isa->size = strtoul(p+5, &p, 0);
125*9ef1f84bSDavid du Colombier else if(cistrncmp(p, "freq=", 5) == 0)
126*9ef1f84bSDavid du Colombier isa->freq = strtoul(p+5, &p, 0);
127*9ef1f84bSDavid du Colombier }
128*9ef1f84bSDavid du Colombier return 1;
129*9ef1f84bSDavid du Colombier }
130