2 #include "../port/lib.h"
9 #include "../port/error.h"
13 int normalprint, delaylink;
15 enum { MAXCONF = 64 };
17 char *confname[MAXCONF], *confval[MAXCONF];
28 reboot(void *, void *, ulong)
37 postnote(up, 1, "sys: odd address", NDebug);
47 p->kentry = up->kentry;
48 p->pcycles = -p->kentry;
51 switch(up->fpstate & ~FPillegal){
54 up->fpstate = FPinactive;
56 memmove(p->fpsave, up->fpsave, sizeof(FPsave));
57 p->fpstate = FPinactive;
69 p->pcycles = -p->kentry;
78 tos = (Tos*)(USTKTOP-sizeof(Tos));
80 tos->kcycles += t - up->kentry;
81 tos->pcycles = t + up->pcycles;
101 slcr[0xa1c/4] = 0x020202;
102 l2 = vmap(L2_BASE, BY2PG);
104 l2[TAGRAM] = l2[TAGRAM] & ~0x777 | 0x111;
105 l2[DATARAM] = l2[DATARAM] & ~0x777 | 0x121;
106 l2[PREFETCH] |= 3<<28 | 1<<24;
107 l2[AUX] |= 3<<28 | 1<<20;
109 while((l2[INVPA] & 1) != 0)
115 clean2pa(uintptr start, uintptr end)
120 end = (end + 31) & ~31;
121 for(pa = start; pa < end; pa += 32)
126 inval2pa(uintptr start, uintptr end)
131 end = (end + 31) & ~31;
132 for(pa = start; pa < end; pa += 32)
140 char *cp, *line[MAXCONF], *p, *q;
142 cp = (char *) CONFADDR;
145 for(q = cp; *q; q++){
154 n = getfields(cp, line, MAXCONF, 1, "\n");
155 for(i = 0; i < n; i++){
158 cp = strchr(line[i], '=');
162 confname[nconf] = line[i];
177 conf.ialloc = 16*1024*1024;
179 conf.mem[0].base = PGROUND((ulong)end - KZERO);
180 conf.mem[0].limit = 1024*1024*1024;
182 for(i = 0; i < nelem(conf.mem); i++)
183 conf.npage += conf.mem[i].npage = (conf.mem[i].limit - conf.mem[i].base) >> PGSHIFT;
184 kmem = 200*1024*1024;
185 conf.upages = conf.npage - kmem/BY2PG;
186 kmem -= conf.upages*sizeof(Page)
187 + conf.nproc*sizeof(Proc)
188 + conf.nimage*sizeof(Image);
189 mainmem->maxsize = kmem;
190 imagmem->maxsize = kmem - (kmem/10);
196 char buf[ERRMAX], **sp;
202 up->slash = namec("#/", Atodir, 0, 0);
203 pathclose(up->slash->path);
204 up->slash->path = newpath("/");
205 up->dot = cclone(up->slash);
211 ksetenv("cputype", "arm", 0);
213 ksetenv("service", "cpu", 0);
215 ksetenv("service", "terminal", 0);
216 ksetenv("console", "0", 0);
217 snprint(buf, sizeof(buf), "zynq %s", conffile);
218 ksetenv("terminal", buf, 0);
219 for(i = 0; i < nconf; i++){
220 if(*confname[i] != '*')
221 ksetenv(confname[i], confval[i], 0);
222 ksetenv(confname[i], confval[i], 1);
226 kproc("alarm", alarmkproc, 0);
228 sp = (char**)(USTKTOP - sizeof(Tos) - 8 - sizeof(sp[0])*4);
230 strcpy(sp[1] = (char*)&sp[4], "boot");
245 p->egrp = smalloc(sizeof(Egrp));
247 p->fgrp = dupfgrp(nil);
252 kstrdup(&p->text, "*init*");
253 kstrdup(&p->user, eve);
257 p->sched.pc = (ulong)init0;
258 p->sched.sp = (ulong)p->kstack + KSTACK - (sizeof(Sargs) + BY2WD);
260 s = newseg(SG_STACK, USTKTOP - USTKSIZE, USTKSIZE / BY2PG);
262 pg = newpage(0, 0, USTKTOP - BY2PG);
268 s = newseg(SG_TEXT, UTZERO, 1);
271 pg = newpage(0, 0, UTZERO);
277 memmove(v, initcode, sizeof(initcode));
286 static int dat = 0xdeadbeef;
287 extern ulong vectors[];
289 assert(dat == 0xdeadbeef);
290 assert(((uintptr)vectors & 31) == 0);
291 assert(sizeof(Mach) + KSTACK <= MACHSIZE);
292 assert((KZERO & SECSZ - 1) == 0);
300 for(i = 0; i < nconf; i++)
301 if(cistrcmp(confname[i], n) == 0)
307 isaconfig(char *, int, ISAConf*)
315 print("cpu%d: %dMHz ARM Cortex-A9\n", m->machno, m->cpumhz);
321 extern void mpbootstrap(void); /* l.s */
333 memset(m1, 0, MACHSIZE);
335 m1->l1.pa = MACHL1(m1->machno)-KZERO;
336 m1->l1.va = KADDR(m1->l1.pa);
338 memset(m1->l1.va, 0, L1SZ);
339 for(i=0; i<L1X(VMAPSZ); i++)
340 m1->l1.va[L1X(VMAP)+i] = m->l1.va[L1X(VMAP)+i];
341 for(i=0; i<L1X(-KZERO); i++)
342 m1->l1.va[L1X(KZERO)+i] = m->l1.va[L1X(KZERO)+i];
344 cleandse((uchar*)KZERO, (uchar*)0xFFFFFFFF);
345 invaldse((uchar*)KZERO, (uchar*)0xFFFFFFFF);
347 /* ocm is uncached */
348 v = KADDR(0xFFFFF000);
349 v[0xFF0/4] = PADDR(mpbootstrap);
359 active.machs[m->machno] = 1;
378 uartputs(" from Bell Labs\n", 16);
402 setupwatchpts(Proc *, Watchpt *, int n)
405 error("no watchpoints");