#ifndef R3000_H #define R3000_H #define K0BASE 0x80000000 #define K0SIZE 0x20000000 #define K1BASE 0xA0000000 #define K1SIZE 0x20000000 #define K2BASE 0xC0000000 #define K2SIZE 0x20000000 #define UT_VEC K0BASE /* utlbmiss vector */ #define E_VEC (K0BASE+0x80) /* exception vector */ #define R_VEC (K1BASE+0x1fc00000) /* reset vector */ /* * Address conversion macros */ #define K0_TO_K1(x) ((unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */ #define K1_TO_K0(x) ((unsigned)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */ #define K0_TO_PHYS(x) ((unsigned)(x)&0x1FFFFFFF) /* kseg0 to physical */ #define K1_TO_PHYS(x) ((unsigned)(x)&0x1FFFFFFF) /* kseg1 to physical */ #define PHYS_TO_K0(x) ((unsigned)(x)|0x80000000) /* physical to kseg0 */ #define PHYS_TO_K1(x) ((unsigned)(x)|0xA0000000) /* physical to kseg1 */ /* * Address predicates */ #define IS_KSEG0(x) ((unsigned)(x) >= K0BASE && (unsigned)(x) < K1BASE) #define IS_KSEG1(x) ((unsigned)(x) >= K1BASE && (unsigned)(x) < K2BASE) #define IS_KSEG2(x) ((unsigned)(x) >= K2BASE && (unsigned)(x) < KPTEBASE) #define IS_KPTESEG(x) ((unsigned)(x) >= KPTEBASE) #define IS_KUSEG(x) ((unsigned)(x) < K0BASE) /* * Cache size constants */ #define MINCACHE +(4*1024) /* leading plus for mas's benefit */ #define MAXCACHE +(64*1024) /* leading plus for mas's benefit */ /* * Status register */ #define SR_CUMASK 0xf0000000 /* coproc usable bits */ #define SR_CU3 0x80000000 /* Coprocessor 3 usable */ #define SR_CU2 0x40000000 /* Coprocessor 2 usable */ #define SR_CU1 0x20000000 /* Coprocessor 1 usable */ #define SR_CU0 0x10000000 /* Coprocessor 0 usable */ #define SR_BEV 0x00400000 /* use boot exception vectors */ /* Cache control bits */ #define SR_TS 0x00200000 /* TLB shutdown */ #define SR_PE 0x00100000 /* cache parity error */ #define SR_CM 0x00080000 /* cache miss */ #define SR_PZ 0x00040000 /* cache parity zero */ #define SR_SWC 0x00020000 /* swap cache */ #define SR_ISC 0x00010000 /* Isolate data cache */ #define SR_MM_MODE 0x00010000 /* lwl/swl/etc become scache/etc */ #define lcache lwl #define scache swl #define flush lwr $0, #define inval swr $0, /* * Interrupt enable bits * (NOTE: bits set to 1 enable the corresponding level interrupt) */ #define SR_IMASK 0x0000ff00 /* Interrupt mask */ #define SR_IMASK8 0x00000000 /* mask level 8 */ #define SR_IMASK7 0x00008000 /* mask level 7 */ #define SR_IMASK6 0x0000c000 /* mask level 6 */ #define SR_IMASK5 0x0000e000 /* mask level 5 */ #define SR_IMASK4 0x0000f000 /* mask level 4 */ #define SR_IMASK3 0x0000f800 /* mask level 3 */ #define SR_IMASK2 0x0000fc00 /* mask level 2 */ #define SR_IMASK1 0x0000fe00 /* mask level 1 */ #define SR_IMASK0 0x0000ff00 /* mask level 0 */ #define SR_IBIT8 0x00008000 /* bit level 8 */ #define SR_IBIT7 0x00004000 /* bit level 7 */ #define SR_IBIT6 0x00002000 /* bit level 6 */ #define SR_IBIT5 0x00001000 /* bit level 5 */ #define SR_IBIT4 0x00000800 /* bit level 4 */ #define SR_IBIT3 0x00000400 /* bit level 3 */ #define SR_IBIT2 0x00000200 /* bit level 2 */ #define SR_IBIT1 0x00000100 /* bit level 1 */ #define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */ #define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */ #define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */ #define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */ #define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */ #define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */ #define SR_IMASKSHIFT 8 #define SR_FMT "\20\40BD\26TS\25PE\24CM\23PZ\22SwC\21IsC\20IM7\17IM6\16IM5\15IM4\14IM3\13IM2\12IM1\11IM0\6KUo\5IEo\4KUp\3IEp\2KUc\1IEc" /* * Cause Register */ #define CAUSE_BD 0x80000000 /* Branch delay slot */ #define CAUSE_CEMASK 0x30000000 /* coprocessor error */ #define CAUSE_CESHIFT 28 /* Interrupt pending bits */ #define CAUSE_IP8 0x00008000 /* External level 8 pending */ #define CAUSE_IP7 0x00004000 /* External level 7 pending */ #define CAUSE_IP6 0x00002000 /* External level 6 pending */ #define CAUSE_IP5 0x00001000 /* External level 5 pending */ #define CAUSE_IP4 0x00000800 /* External level 4 pending */ #define CAUSE_IP3 0x00000400 /* External level 3 pending */ #define CAUSE_SW2 0x00000200 /* Software level 2 pending */ #define CAUSE_SW1 0x00000100 /* Software level 1 pending */ #define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */ #define CAUSE_IPSHIFT 8 #define CAUSE_EXCMASK 0x0000003C /* Cause code bits */ #define CAUSE_EXCSHIFT 2 #define CAUSE_FMT "\20\40BD\36CE1\35CE0\20IP8\17IP7\16IP6\15IP5\14IP4\13IP3\12SW2\11SW1\1INT" /* Cause register exception codes */ #define EXC_CODE(x) ((x)<<2) /* Hardware exception codes */ #define EXC_INT EXC_CODE(0) /* interrupt */ #define EXC_MOD EXC_CODE(1) /* TLB mod */ #define EXC_RMISS EXC_CODE(2) /* Read TLB Miss */ #define EXC_WMISS EXC_CODE(3) /* Write TLB Miss */ #define EXC_RADE EXC_CODE(4) /* Read Address Error */ #define EXC_WADE EXC_CODE(5) /* Write Address Error */ #define EXC_IBE EXC_CODE(6) /* Instruction Bus Error */ #define EXC_DBE EXC_CODE(7) /* Data Bus Error */ #define EXC_SYSCALL EXC_CODE(8) /* SYSCALL */ #define EXC_BREAK EXC_CODE(9) /* BREAKpoint */ #define EXC_II EXC_CODE(10) /* Illegal Instruction */ #define EXC_CPU EXC_CODE(11) /* CoProcessor Unusable */ #define EXC_OV EXC_CODE(12) /* OVerflow */ /* software exception codes */ #define SEXC_SEGV EXC_CODE(16) /* Software detected seg viol */ #define SEXC_RESCHED EXC_CODE(17) /* resched request */ #define SEXC_PAGEIN EXC_CODE(18) /* page-in request */ #define SEXC_CPU EXC_CODE(19) /* coprocessor unusable */ /* * Coprocessor 0 registers */ #define C0_INX $0 /* tlb index */ #define C0_RAND $1 /* tlb random */ #define C0_TLBLO $2 /* tlb entry low */ #define C0_CTXT $4 /* tlb context */ #define C0_PIDMASK $6 /* Mips2 */ #define C0_BADVADDR $8 /* bad virtual address */ #define C0_TLBHI $10 /* tlb entry hi */ #define C0_PID $10 /* Mips2 */ #define C0_SR $12 /* status register */ #define C0_CAUSE $13 /* exception cause */ #define C0_EPC $14 /* exception pc */ #define C0_PRID $15 /* revision identifier */ #define C0_ERREG $16 /* Mips2 */ /* * Coprocessor 0 operations */ #define C0_READI 0x1 /* read ITLB entry addressed by C0_INDEX */ #define C0_WRITEI 0x2 /* write ITLB entry addressed by C0_INDEX */ #define C0_WRITER 0x6 /* write ITLB entry addressed by C0_RAND */ #define C0_PROBE 0x8 /* probe for ITLB entry addressed by TLBHI */ #define C0_RFE 0x10 /* restore for exception */ /* * Flags for the nofault handler. 0 means no fault is expected. */ #define NF_BADADDR 1 /* badaddr, wbadaddr */ #define NF_COPYIO 2 /* copyin, copyout */ #define NF_ADDUPC 3 /* addupc */ #define NF_FSUMEM 4 /* fubyte, subyte, fuword, suword */ #define NF_USERACC 5 /* useracc */ #define NF_SOFTFP 6 /* softfp */ #define NF_REVID 7 /* revision ids */ #define NF_NENTRIES 8 /* * TLB size constants */ #define TLBWIREDBASE 0 /* WAG for now */ #define NWIREDENTRIES 8 /* WAG for now */ #define TLBRANDOMBASE NWIREDENTRIES #define NRANDOMENTRIES (NTLBENTRIES-NWIREDENTRIES) #define NTLBENTRIES 64 /* WAG for now */ #define TLBRAND_RANDMASK 0x00003f00 #define TLBRAND_RANDSHIFT 8 /* * Chip interrupt vector */ #define NC0VECS 8 #ifndef LOCORE #ifdef KERNEL #if defined(_LANGUAGE_C_PLUS_PLUS)||defined(__cplusplus)||defined(c_plusplus) extern "C" { #endif extern int (*c0vec_tbl[])(); #if defined(_LANGUAGE_C_PLUS_PLUS)||defined(__cplusplus)||defined(c_plusplus) } #endif #endif #endif /* !LOCORE */ #define BRK_KERNEL 0xf1 #define EXCEPT_NORM 1 #define EXCEPT_UTLB 2 #define EXCEPT_BRKPT 3 #define EXCEPT_DB 4 #define EXCEPT_GDB 4 #define EXCEPT_INT 9 #define EXCEPT_ELSE 0xff #endif /* _R3000_H */