1*f43f8ee6SDavid du Colombier/* 2*f43f8ee6SDavid du Colombier * mips 24k machine assist 3*f43f8ee6SDavid du Colombier */ 4*f43f8ee6SDavid du Colombier#undef MASK 5*f43f8ee6SDavid du Colombier#define MASK(w) ((1<<(w))-1) 6*f43f8ee6SDavid du Colombier 7*f43f8ee6SDavid du Colombier#define SP R29 8*f43f8ee6SDavid du Colombier 9*f43f8ee6SDavid du Colombier#define NOP NOR R0, R0, R0 10*f43f8ee6SDavid du Colombier 11*f43f8ee6SDavid du Colombier#define CONST(x,r) MOVW $((x)&0xffff0000), r; OR $((x)&0xffff), r 12*f43f8ee6SDavid du Colombier 13*f43f8ee6SDavid du Colombier/* a mips 24k erratum requires a NOP after; experience dictates EHB before */ 14*f43f8ee6SDavid du Colombier#define ERET EHB; WORD $0x42000018; NOP 15*f43f8ee6SDavid du Colombier 16*f43f8ee6SDavid du Colombier#define RETURN RET; NOP 17*f43f8ee6SDavid du Colombier 18*f43f8ee6SDavid du Colombier/* 19*f43f8ee6SDavid du Colombier * R4000 instructions 20*f43f8ee6SDavid du Colombier */ 21*f43f8ee6SDavid du Colombier#define LL(base, rt) WORD $((060<<26)|((base)<<21)|((rt)<<16)) 22*f43f8ee6SDavid du Colombier#define SC(base, rt) WORD $((070<<26)|((base)<<21)|((rt)<<16)) 23*f43f8ee6SDavid du Colombier 24*f43f8ee6SDavid du Colombier/* new instructions in mips 24k (mips32r2) */ 25*f43f8ee6SDavid du Colombier#define DI(rt) WORD $(0x41606000|((rt)<<16)) /* interrupts off */ 26*f43f8ee6SDavid du Colombier#define EI(rt) WORD $(0x41606020|((rt)<<16)) /* interrupts on */ 27*f43f8ee6SDavid du Colombier#define EHB WORD $0xc0 28*f43f8ee6SDavid du Colombier/* jalr with hazard barrier, link in R22 */ 29*f43f8ee6SDavid du Colombier#define JALRHB(r) WORD $(((r)<<21)|(22<<11)|(1<<10)|9); NOP 30*f43f8ee6SDavid du Colombier/* jump register with hazard barrier */ 31*f43f8ee6SDavid du Colombier#define JRHB(r) WORD $(((r)<<21)|(1<<10)|8); NOP 32*f43f8ee6SDavid du Colombier#define MFC0(src,sel,dst) WORD $(0x40000000|((src)<<11)|((dst)<<16)|(sel)) 33*f43f8ee6SDavid du Colombier#define MTC0(src,dst,sel) WORD $(0x40800000|((dst)<<11)|((src)<<16)|(sel)) 34*f43f8ee6SDavid du Colombier#define MIPS24KNOP NOP /* for erratum #48 */ 35*f43f8ee6SDavid du Colombier#define RDHWR(hwr, r) WORD $(0x7c00003b|((hwr)<<11)|((r)<<16)) 36*f43f8ee6SDavid du Colombier#define SYNC WORD $0xf /* all sync barriers */ 37*f43f8ee6SDavid du Colombier#define WAIT WORD $0x42000020 /* wait for interrupt */ 38*f43f8ee6SDavid du Colombier 39*f43f8ee6SDavid du Colombier/* all barriers, clears all hazards; clobbers r/Reg and R22 */ 40*f43f8ee6SDavid du Colombier#define BARRIERS(r, Reg, label) \ 41*f43f8ee6SDavid du Colombier SYNC; EHB; MOVW $ret(SB), Reg; JALRHB(r) 42*f43f8ee6SDavid du Colombier/* same but return to KSEG1 */ 43*f43f8ee6SDavid du Colombier#define UBARRIERS(r, Reg, label) \ 44*f43f8ee6SDavid du Colombier SYNC; EHB; MOVW $ret(SB), Reg; OR $KSEG1, Reg; JALRHB(r) 45*f43f8ee6SDavid du Colombier 46*f43f8ee6SDavid du Colombier/* alternative definitions using labels */ 47*f43f8ee6SDavid du Colombier#ifdef notdef 48*f43f8ee6SDavid du Colombier/* all barriers, clears all hazards; clobbers r/Reg */ 49*f43f8ee6SDavid du Colombier#define BARRIERS(r, Reg, label) \ 50*f43f8ee6SDavid du Colombier SYNC; EHB; \ 51*f43f8ee6SDavid du Colombier MOVW $label(SB), Reg; \ 52*f43f8ee6SDavid du Colombier JRHB(r); \ 53*f43f8ee6SDavid du ColombierTEXT label(SB), $-4; \ 54*f43f8ee6SDavid du Colombier NOP 55*f43f8ee6SDavid du Colombier#define UBARRIERS(r, Reg, label) \ 56*f43f8ee6SDavid du Colombier SYNC; EHB; \ 57*f43f8ee6SDavid du Colombier MOVW $label(SB), Reg; \ 58*f43f8ee6SDavid du Colombier OR $KSEG1, Reg; \ 59*f43f8ee6SDavid du Colombier JRHB(r); \ 60*f43f8ee6SDavid du ColombierTEXT label(SB), $-4; \ 61*f43f8ee6SDavid du Colombier NOP 62*f43f8ee6SDavid du Colombier#endif 63*f43f8ee6SDavid du Colombier 64*f43f8ee6SDavid du Colombier#define PUTC(c, r1, r2) CONST(PHYSCONS, r1); MOVW $(c), r2; MOVW r2, (r1); NOP 65*f43f8ee6SDavid du Colombier 66*f43f8ee6SDavid du Colombier/* 67*f43f8ee6SDavid du Colombier * cache manipulation 68*f43f8ee6SDavid du Colombier */ 69*f43f8ee6SDavid du Colombier 70*f43f8ee6SDavid du Colombier#define CACHE BREAK /* overloaded op-code */ 71*f43f8ee6SDavid du Colombier 72*f43f8ee6SDavid du Colombier#define PI R((0 /* primary I cache */ 73*f43f8ee6SDavid du Colombier#define PD R((1 /* primary D cache */ 74*f43f8ee6SDavid du Colombier#define TD R((2 /* tertiary I/D cache */ 75*f43f8ee6SDavid du Colombier#define SD R((3 /* secondary combined I/D cache */ 76*f43f8ee6SDavid du Colombier 77*f43f8ee6SDavid du Colombier#define IWBI (0<<2))) /* index write-back invalidate */ 78*f43f8ee6SDavid du Colombier#define ILT (1<<2))) /* index load tag */ 79*f43f8ee6SDavid du Colombier#define IST (2<<2))) /* index store tag */ 80*f43f8ee6SDavid du Colombier/* #define CDE (3<<2))) /* create dirty exclusive */ 81*f43f8ee6SDavid du Colombier#define HINV (4<<2))) /* hit invalidate */ 82*f43f8ee6SDavid du Colombier#define HWBI (5<<2))) /* hit write back invalidate */ 83*f43f8ee6SDavid du Colombier#define HWB (6<<2))) /* hit write back */ 84*f43f8ee6SDavid du Colombier/* #define HSV (7<<2))) /* hit set virtual */ 85