⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mips.h

📁 MIPS下的boottloader yamon 的源代码
💻 H
📖 第 1 页 / 共 2 页
字号:

/* Max interrupt code */
#define C0_STATUS_IM_MAX		C0_STATUS_IM_HW5

#define C0_STATUS_UM_SHF		S_StatusUM
#define C0_STATUS_UM_MSK		M_StatusUM
#define C0_STATUS_UM_BIT		C0_STATUS_UM_MSK

#define C0_STATUS_ERL_SHF		S_StatusERL
#define C0_STATUS_ERL_MSK		M_StatusERL
#define C0_STATUS_ERL_BIT		C0_STATUS_ERL_MSK

#define C0_STATUS_EXL_SHF		S_StatusEXL
#define C0_STATUS_EXL_MSK		M_StatusEXL
#define C0_STATUS_EXL_BIT		C0_STATUS_EXL_MSK

#define C0_STATUS_IE_SHF		S_StatusIE
#define C0_STATUS_IE_MSK		M_StatusIE
#define C0_STATUS_IE_BIT		C0_STATUS_IE_MSK


/* C0_PRID register encoding */

#define C0_PRID_OPT_SHF			S_PRIdCoOpt
#define C0_PRID_OPT_MSK			M_PRIdCoOpt

#define C0_PRID_COMP_SHF		S_PRIdCoID
#define C0_PRID_COMP_MSK		M_PRIdCoID
#define C0_PRID_COMP_MIPS		K_PRIdCoID_MIPS
#define C0_PRID_COMP_NOT_MIPS32_64	0

#define C0_PRID_PRID_SHF		S_PRIdImp
#define C0_PRID_PRID_MSK		M_PRIdImp
/* JADE */
#define C0_PRID_PRID_4Kc		K_PRIdImp_Jade
#define C0_PRID_PRID_4Kmp		K_PRIdImp_JadeLite  /* 4Km/4Kc */
/* OPAL */
#define C0_PRID_PRID_5Kc		K_PRIdImp_Opal

#define C0_PRID_PRID_R4000  		K_PRIdImp_R4000
#define C0_PRID_PRID_RM52XX  		K_PRIdImp_R5200

#define C0_PRID_REV_SHF			S_PRIdRev
#define C0_PRID_REV_MSK			M_PRIdRev


#define MIPS_4Kc			( (C0_PRID_COMP_MIPS <<   \
					      C0_PRID_COMP_SHF) | \
					  (C0_PRID_PRID_4Kc  <<   \
					      C0_PRID_PRID_SHF)   \
					)

#define MIPS_4Kmp			( (C0_PRID_COMP_MIPS <<   \
					      C0_PRID_COMP_SHF) | \
					  (C0_PRID_PRID_4Kmp  <<  \
					      C0_PRID_PRID_SHF)   \
					)

#define MIPS_5Kc			( (C0_PRID_COMP_MIPS <<   \
					      C0_PRID_COMP_SHF) | \
					  (C0_PRID_PRID_5Kc  <<   \
					      C0_PRID_PRID_SHF)   \
					)

#define QED_RM52XX			( (C0_PRID_COMP_NOT_MIPS32_64 << \
					      C0_PRID_COMP_SHF) |	 \
					  (C0_PRID_PRID_RM52XX  <<	 \
					      C0_PRID_PRID_SHF)		 \
					)

// #define AU1000 0x00030100
//#define AU1000 0x01030200		// Au1500 PRID
//#define AU1000_2_1 0x00030200   /* This does not include the revision code because it will mess up the sys_processor def */
#define AU1XXX 0x00030000

/* C0_ENTRYHI register encoding */

#define C0_ENTRYHI_VPN2_SHF		S_EntryHiVPN2
#define C0_ENTRYHI_VPN2_MSK		M_EntryHiVPN2

#define C0_ENTRYHI_ASID_SHF		S_EntryHiASID
#define C0_ENTRYHI_ASID_MSK		M_EntryHiASID


/* C0_CAUSE register encoding */

#define C0_CAUSE_BD_SHF			S_CauseBD
#define C0_CAUSE_BD_MSK			M_CauseBD
#define C0_CAUSE_BD_BIT			C0_CAUSE_BD_MSK

#define C0_CAUSE_CE_SHF			S_CauseCE
#define C0_CAUSE_CE_MSK			M_CauseCE

#define C0_CAUSE_IV_SHF			S_CauseIV
#define C0_CAUSE_IV_MSK			M_CauseIV
#define C0_CAUSE_IV_BIT			C0_CAUSE_IV_MSK

#define C0_CAUSE_WP_SHF			S_CauseWP
#define C0_CAUSE_WP_MSK			M_CauseWP
#define C0_CAUSE_WP_BIT			C0_CAUSE_WP_MSK

#define C0_CAUSE_IP_SHF			S_CauseIP
#define C0_CAUSE_IP_MSK			M_CauseIP

#define C0_CAUSE_CODE_SHF		S_CauseExcCode
#define C0_CAUSE_CODE_MSK		M_CauseExcCode

#define C0_CAUSE_CODE_INT		EX_INT
#define C0_CAUSE_CODE_MOD		EX_MOD
#define C0_CAUSE_CODE_TLBL		EX_TLBL
#define C0_CAUSE_CODE_TLBS		EX_TLBS
#define C0_CAUSE_CODE_ADEL		EX_ADEL
#define C0_CAUSE_CODE_ADES		EX_ADES
#define C0_CAUSE_CODE_IBE		EX_IBE
#define C0_CAUSE_CODE_DBE		EX_DBE
#define C0_CAUSE_CODE_SYS		EX_SYS
#define C0_CAUSE_CODE_BP		EX_BP
#define C0_CAUSE_CODE_RI		EX_RI
#define C0_CAUSE_CODE_CPU		EX_CPU
#define C0_CAUSE_CODE_OV		EX_OV
#define C0_CAUSE_CODE_TR		EV_TR
#define C0_CAUSE_CODE_FPE		EX_FPE
#define C0_CAUSE_CODE_WATCH		EX_WATCH
#define C0_CAUSE_CODE_MCHECK		EX_MCHECK

/* Max cause code */
#define C0_CAUSE_CODE_MAX		EX_MCHECK


/* C0_PAGEMASK register encoding */
#define C0_PAGEMASK_MASK_SHF		S_PageMaskMask
#define C0_PAGEMASK_MASK_MSK		M_PageMaskMask
#define C0_PAGEMASK_MASK_4K		K_PageMask4K
#define C0_PAGEMASK_MASK_16K		K_PageMask16K
#define C0_PAGEMASK_MASK_64K		K_PageMask64K
#define C0_PAGEMASK_MASK_256K		K_PageMask256K
#define C0_PAGEMASK_MASK_1M		K_PageMask1M
#define C0_PAGEMASK_MASK_4M		K_PageMask4M
#define C0_PAGEMASK_MASK_16M		K_PageMask16M


/* C0_ENTRYLO0 register encoding (equiv. to C0_ENTRYLO1) */
#define C0_ENTRYLO0_PFN_SHF		S_EntryLoPFN
#define C0_ENTRYLO0_PFN_MSK		M_EntryLoPFN

#define C0_ENTRYLO0_C_SHF		S_EntryLoC
#define C0_ENTRYLO0_C_MSK		M_EntryLoC

#define C0_ENTRYLO0_D_SHF		S_EntryLoD
#define C0_ENTRYLO0_D_MSK		M_EntryLoD

#define C0_ENTRYLO0_V_SHF		S_EntryLoV
#define C0_ENTRYLO0_V_MSK		M_EntryLoV

#define C0_ENTRYLO0_G_SHF		S_EntryLoG
#define C0_ENTRYLO0_G_MSK		M_EntryLoG


/* cache operations */

#define CACHE_OP( code, type )			( ((code) << 2) | (type) )

#define ICACHE_INDEX_INVALIDATE			CACHE_OP(0x0, 0)
#define ICACHE_INDEX_LOAD_TAG			CACHE_OP(0x1, 0)
#define ICACHE_INDEX_STORE_TAG			CACHE_OP(0x2, 0)
#define DCACHE_INDEX_WRITEBACK_INVALIDATE	CACHE_OP(0x0, 1)
#define DCACHE_INDEX_LOAD_TAG			CACHE_OP(0x1, 1)
#define DCACHE_INDEX_STORE_TAG			CACHE_OP(0x2, 1)

#define ICACHE_ADDR_HIT_INVALIDATE		CACHE_OP(0x4, 0)
#define ICACHE_ADDR_FILL			CACHE_OP(0x5, 0)
#define ICACHE_ADDR_FETCH_LOCK			CACHE_OP(0x7, 0)
#define DCACHE_ADDR_HIT_INVALIDATE		CACHE_OP(0x4, 1)
#define DCACHE_ADDR_HIT_WRITEBACK_INVALIDATE	CACHE_OP(0x5, 1)
#define DCACHE_ADDR_HIT_WRITEBACK		CACHE_OP(0x6, 1)
#define DCACHE_ADDR_FETCH_LOCK			CACHE_OP(0x7, 1)


/*  Workaround for bug in early revisions of MIPS 4K family of
 *  processors. Only relevant in early engineering samples of test
 *  chips (RTL revision <= 3.0).
 *
 *  The bug is described in :
 *
 *  MIPS32 4K(tm) Processor Core Family RTL Errata Sheet
 *  MIPS Document No: MD00003
 *
 *  The bug is identified as : C16
 */
#define ICACHE_INVALIDATE_WORKAROUND(reg) \
	la     reg, 999f;		  \
	.set	mips3;	\
	cache  ICACHE_ADDR_FILL, 0(reg);  \
	.set	mips0;	\
	sync;				  \
	nop; nop; nop; nop;		  \
999:


#define ICACHE_INDEX_INVALIDATE_OP(index,scratch)        \
	    ICACHE_INVALIDATE_WORKAROUND(scratch);    \
		.set	mips3;	\
	    cache ICACHE_INDEX_INVALIDATE, 0(index);		\
		.set	mips0;

#define ICACHE_ADDR_INVALIDATE_OP(addr,scratch)          \
	    ICACHE_INVALIDATE_WORKAROUND(scratch);    \
		.set	mips3;	\
	    cache ICACHE_ADDR_HIT_INVALIDATE, 0(addr);	\
		.set	mips0;


/* Config1 cache field decoding */
#define CACHE_CALC_SPW(s)	( 64 << (s) )
#define CACHE_CALC_LS(l)	( (l) ? 2 << (l) : 0 )
#define CACHE_CALC_BPW(l,s)	( CACHE_CALC_LS(l) * CACHE_CALC_SPW(s) )
#define CACHE_CALC_ASSOC(a)	( (a) + 1 )


/* Move from/to Coprocessor operations */

#define NOPS	nop; nop; nop

#define MFLO(dst)        \
		mflo dst;\
 	  	NOPS

/*  Workaround for bug in early revisions of MIPS 4K family of
 *  processors.
 *
 *  This concerns the nop instruction before mtc0 in the
 *  MTC0 macro below.
 *
 *  The bug is described in :
 *
 *  MIPS32 4K(tm) Processor Core Family RTL Errata Sheet
 *  MIPS Document No: MD00003
 *
 *  The bug is identified as : C27
 */

#define MTC0(src, dst)       \
		nop;	     \
	        mtc0 src,dst;\
		NOPS

#define MFC0(dst, src)       \
	  	mfc0 dst,src;\
		NOPS

#define MFC0_SEL_OPCODE(dst, src, sel)\
	  	.word (0x40000000 | ((dst)<<16) | ((src)<<11) | (sel));\
		NOPS

#define MTC0_SEL_OPCODE(dst, src, sel)\
	  	.word (0x40800000 | ((dst)<<16) | ((src)<<11) | (sel));\
		NOPS


/* Instruction opcode fields */
#define OPC_SPECIAL   0x0
#define OPC_REGIM     0x1
#define OPC_J         0x2
#define OPC_JAL	      0x3
#define OPC_BEQ	      0x4
#define OPC_BNE	      0x5
#define OPC_BLEZ      0x6
#define OPC_BGTZ      0x7
#define OPC_BEQL      0x14
#define OPC_BNEL      0x15
#define OPC_BLEZL     0x16
#define OPC_BGTZL     0x17

/* Instruction function fields */
#define FUNC_JR	      0x8
#define FUNC_JALR     0x9

/* Instruction rt fields */
#define RT_BLTZ	      0x0
#define RT_BGEZ	      0x1
#define RT_BLTZL      0x2
#define RT_BGEZL      0x3
#define RT_BLTZAL     0x10
#define RT_BGEZAL     0x11
#define RT_BLTZALL    0x12
#define RT_BGEZALL    0x13

/* Access macros for instruction fields */
#define MIPS_OPCODE( instr)	((instr) >> 26)
#define MIPS_FUNCTION(instr)	((instr) & MSK(6))
#define MIPS_RT(instr)		(((instr) >> 16) & MSK(5))
#define MIPS_RS(instr)		(((instr) >> 21) & MSK(5))
#define MIPS_OFFSET(instr)	((instr) & 0xFFFF)
#define MIPS_TARGET(instr)	((instr) & MSK(26))

/* Instructions */
#define OPCODE_DERET		0x4200001f
#define OPCODE_BREAK	  	0x0005000d
#define OPCODE_NOP		0
#define OPCODE_JUMP(addr)	( (OPC_J << 26) | (((addr) >> 2) & 0x3FFFFFF) )

#define DERET			.word OPCODE_DERET

/* 64 bit opcodes */
#define OPCODE_SD( rt, offset, base ) \
  .word	(0x3F << 26) | ((base) << 21) | ((rt) << 16) | (offset)

#define OPCODE_LD( rt, offset, base ) \
  .word	(0x37 << 26) | ((base) << 21) | ((rt) << 16) | (offset)


/* MIPS reset vector */
#define MIPS_RESET_VECTOR       0x1fc00000

#endif /* #ifndef MIPS_H */









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -