]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/pc/bootargs.c
usbehci: catch interrupt in tsleep
[plan9front.git] / sys / src / 9 / pc / bootargs.c
1 #include        "u.h"
2 #include        "../port/lib.h"
3 #include        "mem.h"
4 #include        "dat.h"
5 #include        "fns.h"
6
7 #define MAXCONF 64
8 static char *confname[MAXCONF];
9 static char *confval[MAXCONF];
10 static int nconf;
11
12 /* screen.c */
13 extern char* rgbmask2chan(char *buf, int depth, u32int rm, u32int gm, u32int bm);
14
15 /* vgavesa.c */
16 extern char* vesabootscreenconf(char*, char*, uchar*);
17
18 static void
19 multibootargs(void)
20 {
21         extern ulong multibootptr;
22         ulong *multiboot;
23         char *cp, *ep;
24         ulong *m, l;
25
26         if(multibootptr == 0)
27                 return;
28
29         multiboot = (ulong*)KADDR(multibootptr);
30
31         cp = BOOTARGS;
32         ep = cp + BOOTARGSLEN-1;
33
34         /* memory map */
35         if((multiboot[0] & (1<<6)) != 0 && (l = multiboot[11]) >= 24){
36                 cp = seprint(cp, ep, "*e820=");
37                 m = KADDR(multiboot[12]);
38                 while(m[0] >= 20 && m[0]+4 <= l){
39                         uvlong base, size;
40                         m++;
41                         base = ((uvlong)m[0] | (uvlong)m[1]<<32);
42                         size = ((uvlong)m[2] | (uvlong)m[3]<<32);
43                         cp = seprint(cp, ep, "%.1lux %.16llux %.16llux ",
44                                 m[4] & 0xF, base, base+size);
45                         l -= m[-1]+4;
46                         m = (ulong*)((uintptr)m + m[-1]);
47                 }
48                 cp[-1] = '\n';
49         }
50
51         if((multiboot[0] & (1<<12)) != 0 && multiboot[22] != 0){        /* framebuffer */
52                 uchar *p = (uchar*)multiboot + 112;
53                 int depth = multiboot[27] & 0xFF;
54                 char chan[32];
55
56                 switch((multiboot[27]>>8) & 0xFF){
57                 case 0:
58                         snprint(chan, sizeof chan, "m%d", depth);
59                         if(0){
60                 case 1:
61                         rgbmask2chan(chan, depth,
62                                 (1UL<<p[1])-1 << p[0],
63                                 (1UL<<p[3])-1 << p[2],
64                                 (1UL<<p[5])-1 << p[4]);
65                         }
66                         cp = seprint(cp, ep, "*bootscreen=%dx%dx%d %s %#lux\n",
67                                 (int)multiboot[24]*8 / depth,
68                                 (int)multiboot[26],
69                                 depth,
70                                 chan,
71                                 multiboot[22]);
72                 }
73         } else
74         if((multiboot[0] & (1<<11)) != 0 && multiboot[19] != 0)         /* vbe mode info */
75                 cp = vesabootscreenconf(cp, ep, KADDR(multiboot[19]));
76
77         /* plan9.ini passed as the first module */
78         if((multiboot[0] & (1<<3)) != 0 && multiboot[5] > 0 && multiboot[6] != 0){
79                 m = KADDR(multiboot[6]);
80                 cp = seprint(cp, ep, "%.*s\n", (int)(m[1] - m[0]), (char*)KADDR(m[0]));
81         }
82
83         /* command line */
84         if((multiboot[0] & (1<<2)) != 0 && multiboot[4] != 0){
85                 int i, n = tokenize(KADDR(multiboot[4]), confval, MAXCONF);
86                 for(i=0; i<n; i++)
87                         cp = seprint(cp, ep, "%s\n", confval[i]);
88         }
89
90         *cp = 0;
91 }
92
93 void
94 bootargsinit(void)
95 {
96         int i, j, n;
97         char *cp, *line[MAXCONF], *p, *q;
98
99         multibootargs();
100
101         /*
102          *  parse configuration args from dos file plan9.ini
103          */
104         cp = BOOTARGS;  /* where b.com leaves its config */
105         cp[BOOTARGSLEN-1] = 0;
106
107         /*
108          * Strip out '\r', change '\t' -> ' '.
109          */
110         p = cp;
111         for(q = cp; *q; q++){
112                 if(*q == '\r')
113                         continue;
114                 if(*q == '\t')
115                         *q = ' ';
116                 *p++ = *q;
117         }
118         *p = 0;
119
120         n = getfields(cp, line, MAXCONF, 1, "\n");
121         for(i = 0; i < n; i++){
122                 if(*line[i] == '#')
123                         continue;
124                 cp = strchr(line[i], '=');
125                 if(cp == nil)
126                         continue;
127                 *cp++ = '\0';
128                 for(j = 0; j < nconf; j++){
129                         if(cistrcmp(confname[j], line[i]) == 0)
130                                 break;
131                 }
132                 confname[j] = line[i];
133                 confval[j] = cp;
134                 if(j == nconf)
135                         nconf++;
136         }
137 }
138
139 char*
140 getconf(char *name)
141 {
142         int i;
143
144         for(i = 0; i < nconf; i++)
145                 if(cistrcmp(confname[i], name) == 0)
146                         return confval[i];
147         return 0;
148 }
149
150 void
151 setconfenv(void)
152 {
153         int i;
154
155         for(i = 0; i < nconf; i++){
156                 if(confname[i][0] != '*')
157                         ksetenv(confname[i], confval[i], 0);
158                 ksetenv(confname[i], confval[i], 1);
159         }
160 }
161
162 void
163 writeconf(void)
164 {
165         char *p, *q;
166         int n;
167
168         p = getconfenv();
169         if(waserror()) {
170                 free(p);
171                 nexterror();
172         }
173
174         /* convert to name=value\n format */
175         for(q=p; *q; q++) {
176                 q += strlen(q);
177                 *q = '=';
178                 q += strlen(q);
179                 *q = '\n';
180         }
181         n = q - p + 1;
182         if(n >= BOOTARGSLEN)
183                 error("kernel configuration too large");
184         memmove(BOOTARGS, p, n);
185         memset(BOOTLINE, 0, BOOTLINELEN);
186         poperror();
187         free(p);
188 }