xref: /plan9-contrib/sys/src/9k/k10/crap.c (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
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