mirror of
https://github.com/OpenDriver2/REDRIVER2.git
synced 2024-11-26 04:12:34 +01:00
97e738ba36
- re-arrange includes
236 lines
7.6 KiB
C
236 lines
7.6 KiB
C
#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 */
|