xref: /plan9-contrib/sys/src/9/vt4/dcr.c (revision d6dfd9ef91cf0fa8514a249d5f2a550978c19369)
1*d6dfd9efSDavid du Colombier #include	"u.h"
2*d6dfd9efSDavid du Colombier #include	"../port/lib.h"
3*d6dfd9efSDavid du Colombier #include	"mem.h"
4*d6dfd9efSDavid du Colombier #include	"dat.h"
5*d6dfd9efSDavid du Colombier #include	"fns.h"
6*d6dfd9efSDavid du Colombier 
7*d6dfd9efSDavid du Colombier /*
8*d6dfd9efSDavid du Colombier  * we pre-compile an array of get/putdcr functions,
9*d6dfd9efSDavid du Colombier  * later indexed by DCR number by getdcr and putdcr in l.s,
10*d6dfd9efSDavid du Colombier  * because the DCR number is part of the instruction,
11*d6dfd9efSDavid du Colombier  * and cannot be read from a register
12*d6dfd9efSDavid du Colombier  */
13*d6dfd9efSDavid du Colombier 
14*d6dfd9efSDavid du Colombier #define	MAXDCR	0x500
15*d6dfd9efSDavid du Colombier 
16*d6dfd9efSDavid du Colombier #define	DCRF(n)		((((n)>>5)&0x1F)|(((n)&0x1F)<<5))
17*d6dfd9efSDavid du Colombier #define	MTDCR(s,n)	((31<<26)|((s)<<21)|(DCRF(n)<<11)|(451<<1))
18*d6dfd9efSDavid du Colombier #define	MFDCR(n,t)	((31<<26)|((t)<<21)|(DCRF(n)<<11)|(323<<1))
19*d6dfd9efSDavid du Colombier #define	RETURN		0x4e800020   /* BR (LR) */
20*d6dfd9efSDavid du Colombier 
21*d6dfd9efSDavid du Colombier ulong	_getdcr[MAXDCR][2];
22*d6dfd9efSDavid du Colombier ulong	_putdcr[MAXDCR][2];
23*d6dfd9efSDavid du Colombier 
24*d6dfd9efSDavid du Colombier void
dcrcompile(void)25*d6dfd9efSDavid du Colombier dcrcompile(void)
26*d6dfd9efSDavid du Colombier {
27*d6dfd9efSDavid du Colombier 	ulong *p;
28*d6dfd9efSDavid du Colombier 	int i;
29*d6dfd9efSDavid du Colombier 
30*d6dfd9efSDavid du Colombier 	for(i=0; i<MAXDCR; i++){
31*d6dfd9efSDavid du Colombier 		p = _getdcr[i];
32*d6dfd9efSDavid du Colombier 		p[0] = MFDCR(i, 3);
33*d6dfd9efSDavid du Colombier 		p[1] = RETURN;
34*d6dfd9efSDavid du Colombier 		p = _putdcr[i];
35*d6dfd9efSDavid du Colombier 		p[0] = MTDCR(3, i);
36*d6dfd9efSDavid du Colombier 		p[1] = RETURN;
37*d6dfd9efSDavid du Colombier 	}
38*d6dfd9efSDavid du Colombier 	dcflush(PTR2UINT(_getdcr), sizeof(_getdcr));
39*d6dfd9efSDavid du Colombier 	dcflush(PTR2UINT(_putdcr), sizeof(_putdcr));
40*d6dfd9efSDavid du Colombier 	/* no need to flush icache since they won't be there */
41*d6dfd9efSDavid du Colombier }
42