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

📄 vector.s

📁 Boot code for ADM5120 with serial console for Edimax router.
💻 S
字号:
/*****************************************************************************;;    Project : ADM5120;    Creator : Dan Everett;    File    : vector.S;    Abstract: ;;*****************************************************************************/#include <mips.h>#include <mips4kc.h>#include <asm.h>#include <adm5120.h>#include <test_def.h>#define VEC_STACK_FRAME			4*4#define FRAME_AT_REG			0#define FRAME_V0_REG			1*4#define FRAME_V1_REG			2*4#define FRAME_A0_REG			3*4#define FRAME_A1_REG			4*4#define FRAME_A2_REG			5*4#define FRAME_A3_REG			6*4#define FRAME_T0_REG			7*4#define FRAME_T1_REG			8*4#define FRAME_T2_REG			9*4#define FRAME_T3_REG			10*4#define FRAME_T4_REG			11*4#define FRAME_T5_REG			12*4#define FRAME_T6_REG			13*4#define FRAME_T7_REG			14*4#define FRAME_T8_REG			15*4#define FRAME_T9_REG			16*4#define FRAME_GP_REG			17*4#define FRAME_RA_REG			18*4#define FRAME_HI_REG			19*4#define FRAME_LO_REG			20*4#define FRAME_SR_REG			21*4#define FRAME_CAUSE_REG			22*4#define FRAME_EPC_REG			23*4#define FRAME_SIZE				(FRAME_EPC_REG + 12).text/* *  TLB refill exception handler *  This will be installed at 0x80000000 */VECTOR(TLBrefill_except, unknown).set noreorder.set noat	/* This exception is not handled. */1:	b		1b	nop.set at.set reorderVECTOR_END(TLBrefill_except)/* *  General exception handler *  This will be installed at 0x80000180 */VECTOR(general_except, unknown).set noreorder.set noat	/* This exception is not handled. */1://	b		1b//	nop	/* This is really heavy-handed but should work... */	j		reboot_router	nop.set at.set reorderVECTOR_END(general_except)/* *  Interrupt exception handler.  *  This will be installed at 0x80000200 */VECTOR(int_except, unknown).set noreorder.set noat	subu	sp, sp, FRAME_SIZE			//#1	// Create a stack frame	sw		AT, FRAME_AT_REG(sp)		//#2	sw		v0, FRAME_V0_REG(sp)		//#3	sw		v1, FRAME_V1_REG(sp)		//#4	mflo	v0							//#5	// Get Hi	mfhi	v1							//#6	// Get Lo 	sw		a0, FRAME_A0_REG(sp)		//#7	sw		a1, FRAME_A1_REG(sp)		//#8	sw		a2, FRAME_A2_REG(sp)		//#9	sw		a3, FRAME_A3_REG(sp)		//#10	mfc0	a0, CP0_STATUS_REG			//#11	// 1st arg	sw		t0, FRAME_T0_REG(sp)		//#12	sw		t1, FRAME_T1_REG(sp)		//#13	sw		t2, FRAME_T2_REG(sp)		//#14	sw		t3, FRAME_T3_REG(sp)		//#15	mfc0	a1, CP0_CAUSE_REG			//#16	// 2nd arg	sw		t4, FRAME_T4_REG(sp)		//#17	sw		t5, FRAME_T5_REG(sp)		//#18	sw		t6, FRAME_T6_REG(sp)		//#19	sw		t7, FRAME_T7_REG(sp)		//#20	mfc0	a2, CP0_EPC_REG				//#21	sw		t8, FRAME_T8_REG(sp)		//#22	sw		t9, FRAME_T9_REG(sp)		//#23	sw		gp, FRAME_GP_REG(sp)		//#24	sw		ra, FRAME_RA_REG(sp)		//#25	sw		v0, FRAME_LO_REG(sp)		//#26	sw		v1, FRAME_HI_REG(sp)		//#27	sw		a0, FRAME_SR_REG(sp)				sw		a2, FRAME_EPC_REG(sp)		//#28	mtc0	zero, CP0_STATUS_REG		// Clear interrupt, EXL	la		ra, _C_LABEL(except_ret)	// return address	/*	Call C interrupt handler  */	j		_C_LABEL(int_hdl)	subu	sp, sp, VEC_STACK_FRAME		// Branch delay slot.set at.set reorderVECTOR_END(int_except)VECTOR(dbg_except, unknown)	/* This exception is not handled. */1:	b		1b	nop									// Branch delay slotVECTOR_END(dbg_except)LEAF(except_ret)	.set noreorder	.set noat	addu	sp, sp, VEC_STACK_FRAME	/* Restore status */	lw		a0, FRAME_SR_REG(sp)	lw		a1, FRAME_EPC_REG(sp)	lw		v0, FRAME_LO_REG(sp)	lw		v1, FRAME_HI_REG(sp)	mtc0	a0, CP0_STATUS_REG	mtlo	v0	mthi	v1	mtc0	a1, CP0_EPC_REG		lw		AT, FRAME_AT_REG(sp)	lw		v0, FRAME_V0_REG(sp)	lw		v1, FRAME_V1_REG(sp)	lw		a0, FRAME_A0_REG(sp)	lw		a1, FRAME_A1_REG(sp)	lw		a2, FRAME_A2_REG(sp)	lw		a3, FRAME_A3_REG(sp)	lw		t0, FRAME_T0_REG(sp)	lw		t1, FRAME_T1_REG(sp)	lw		t2, FRAME_T2_REG(sp)	lw		t3, FRAME_T3_REG(sp)	lw		t4, FRAME_T4_REG(sp)	lw		t5, FRAME_T5_REG(sp)	lw		t6, FRAME_T6_REG(sp)	lw		t7, FRAME_T7_REG(sp)	lw		t8, FRAME_T8_REG(sp)	lw		t9, FRAME_T9_REG(sp)	lw		gp, FRAME_GP_REG(sp)	lw		ra, FRAME_RA_REG(sp)		/* Restore sp */	addu	sp, sp, FRAME_SIZE	eret	nop	.set at	.set reorderEND(except_ret)LEAF(_splrestore).set noreorder	mfc0	v0, CP0_STATUS_REG	and		a0, a0, CP0_STATUS_IM_MASK	li		v1, ~CP0_STATUS_IM_MASK	and		v1, v1, v0	or		v1, v1, a0	mtc0	v1, CP0_STATUS_REG	and		v0, v0, CP0_STATUS_IM_MASK	j		ra	nop.set reorderEND(_splrestore)LEAF(_splset)	mfc0	v0, CP0_STATUS_REG	and		a0, a0, (CP0_STATUS_IM_MASK | CP0_STATUS_IE_BIT)	li		v1, ~(CP0_STATUS_IM_MASK | CP0_STATUS_IE_BIT)	and		v1, v1, v0	or		v1, v1, a0	mtc0	v1, CP0_STATUS_REG	and		v0, v0, (CP0_STATUS_IM_MASK | CP0_STATUS_IE_BIT)	j		ra	nopEND(_splset)LEAF(_splget)	mfc0	v0, CP0_STATUS_REG	and		v0, v0, (CP0_STATUS_IM_MASK | CP0_STATUS_IE_BIT)	j		ra	nopEND(_splget)LEAF(mips_cp0_status_read)	mfc0	v0, CP0_STATUS_REG	j		ra	nopEND(mips_cp0_status_read)LEAF(mips_cp0_status_write)	mtc0	a0, CP0_STATUS_REG	nop	nop	j		ra	nopEND(mips_cp0_status_write)LEAF(mips_cp0_config1_read)	mfc0	v0, CP0_CONFIG1_REG, CP0_CONFIG1_SEL	j		ra	nopEND(mips_cp0_config1_read)LEAF(mips_int_lock).set noreorder	mfc0	v0, CP0_STATUS_REG	li		v1, ~CP0_STATUS_IE_BIT	and		v1, v1, v0	mtc0	v1, CP0_STATUS_REG	j		ra	and		v0, v0, CP0_STATUS_IE_BIT.set reorderEND(mips_int_lock)LEAF(mips_int_unlock)	mfc0	v0, CP0_STATUS_REG	and		a0, a0, CP0_STATUS_IE_BIT	// correct since a0 is an argument	or		v0, v0, a0	mtc0	v0, CP0_STATUS_REG	j		ra	nopEND(mips_int_unlock)

⌨️ 快捷键说明

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