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 Colombierdcrcompile(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