xref: /inferno-os/os/cerf405/compile.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1 #include	"u.h"
2 #include	"../port/lib.h"
3 #include	"mem.h"
4 #include	"dat.h"
5 #include	"fns.h"
6 #include	"io.h"
7 
8 #define	MAXDCR	0x220
9 
10 #define	DCRF(n)	((((n)>>5)&0x1F)|(((n)&0x1F)<<5))
11 #define	MTDCR(s,n)	((31<<26)|((s)<<21)|(DCRF(n)<<11)|(451<<1))
12 #define	MFDCR(n,t)	((31<<26)|((t)<<21)|(DCRF(n)<<11)|(323<<1))
13 #define	RETURN	0x4e800020
14 ulong	_getdcr[MAXDCR][2];
15 ulong	_putdcr[MAXDCR][2];
16 
17 void
compiledcr(void)18 compiledcr(void)
19 {
20 	ulong *p;
21 	int i;
22 
23 	for(i=0; i<MAXDCR; i++){
24 		p = _getdcr[i];
25 		p[0] = MFDCR(i, 3);
26 		p[1] = RETURN;
27 		p = _putdcr[i];
28 		p[0] = MTDCR(3, i);
29 		p[1] = RETURN;
30 	}
31 	dcflush(_getdcr, sizeof(_getdcr));
32 	dcflush(_putdcr, sizeof(_putdcr));
33 	/* no need to flush icache since they won't be there */
34 }
35