302 lines
8.6 KiB
C
302 lines
8.6 KiB
C
|
#ifndef _TOOLS_ASM_H_
|
||
|
#define _TOOLS_ASM_H_
|
||
|
|
||
|
#include "start.h"
|
||
|
|
||
|
#define PRINT_STR(string) \
|
||
|
la a0, 1f ; \
|
||
|
.section .rodata ; \
|
||
|
1: .asciz string ; \
|
||
|
.text ; \
|
||
|
bl outputstring
|
||
|
|
||
|
#define PRINT_WORD(rs) \
|
||
|
or a0, $r0, rs ; \
|
||
|
bl outputaddr
|
||
|
|
||
|
#define REG_READ_W(addr, rd) \
|
||
|
la t0, addr ; \
|
||
|
ld.w rd, t0, 0
|
||
|
#define REG_READ_H(addr, rd) \
|
||
|
la t0, addr ; \
|
||
|
ld.h rd, t0, 0
|
||
|
#define REG_READ_B(addr, rd) \
|
||
|
la t0, addr ; \
|
||
|
ld.b rd, t0, 0
|
||
|
|
||
|
#define REG_WRITE_W(addr, rs) \
|
||
|
la t0, addr ; \
|
||
|
st.w rs, t0, 0
|
||
|
#define REG_WRITE_H(addr, rs) \
|
||
|
la t0, addr ; \
|
||
|
st.h rs, t0, 0
|
||
|
#define REG_WRITE_B(addr, rs) \
|
||
|
la t0, addr ; \
|
||
|
st.b rs, t0, 0
|
||
|
/* write imm */
|
||
|
#define REG_WRITE_Wi(addr, imm) \
|
||
|
la t0, addr ; \
|
||
|
li.w AT, imm ; \
|
||
|
st.w AT, t0, 0
|
||
|
#define REG_WRITE_Hi(addr, imm) \
|
||
|
la t0, addr ; \
|
||
|
li.w AT, imm ; \
|
||
|
st.h AT, t0, 0
|
||
|
#define REG_WRITE_Bi(addr, imm) \
|
||
|
la t0, addr ; \
|
||
|
li.w AT, imm ; \
|
||
|
st.b AT, t0, 0
|
||
|
|
||
|
#define PUSH_W(rs) \
|
||
|
addi.w sp, sp, -4 ; \
|
||
|
st.w rs, sp, 0
|
||
|
|
||
|
#define PUSH_2W(a, b) \
|
||
|
addi.w sp, sp, -8 ; \
|
||
|
st.w a, (sp), 0x0 ; \
|
||
|
st.w b, (sp), 0x4
|
||
|
|
||
|
#define PUSH_3W(a, b, c) \
|
||
|
addiu sp, sp, -12 ; \
|
||
|
st.w a, sp, 0x0 ; \
|
||
|
st.w b, sp, 0x4 ; \
|
||
|
st.w c, sp, 0x8
|
||
|
|
||
|
#define POP_W(rd) \
|
||
|
ld.w rd, sp, 0 ; \
|
||
|
addi.w sp, sp, 4
|
||
|
|
||
|
#define POP_2W(a, b) \
|
||
|
ld.w a, sp, 0x0 ; \
|
||
|
ld.w b, sp, 0x4 ; \
|
||
|
addi.w sp, sp, 8
|
||
|
|
||
|
#define POP_3W(a, b, c) \
|
||
|
ld.w a, sp, 0x0 ; \
|
||
|
ld.w b, sp, 0x4 ; \
|
||
|
ld.w c, sp, 0x8 ; \
|
||
|
addi.w sp, sp, 12
|
||
|
|
||
|
|
||
|
#define RET() \
|
||
|
lw ra, sp, 0x0 ; \
|
||
|
addi.w sp, sp, 4 ; \
|
||
|
jr ra
|
||
|
|
||
|
|
||
|
#define WRITE_CMREG32(reg, BASE, OFFSET, reg_temp) \
|
||
|
li.w reg_temp, BASE+OFFSET; \
|
||
|
st.w reg, reg_temp, 0
|
||
|
#define WRITE_CMREG8(reg, BASE, OFFSET, reg_temp) \
|
||
|
li.w reg_temp, BASE+OFFSET; \
|
||
|
st.b reg, reg_temp, 0
|
||
|
#define READ_CMREG32(reg, BASE, OFFSET, reg_temp) \
|
||
|
li.w reg_temp, BASE+OFFSET; \
|
||
|
ld.w reg, reg_temp, 0
|
||
|
#define READ_CMREG8(reg, BASE, OFFSET, reg_temp) \
|
||
|
li.w reg_temp, BASE+OFFSET; \
|
||
|
ld.b reg, reg_temp, 0
|
||
|
|
||
|
|
||
|
#define SAVE_REGS_ALL(BASE) \
|
||
|
csrwr tp, CSR_KScratch1; \
|
||
|
li.w tp, BASE;\
|
||
|
st.w t0, tp, -0x4 ;\
|
||
|
st.w t1, tp, -0x8 ;\
|
||
|
st.w t2, tp, -0xc ;\
|
||
|
st.w t3, tp, -0x10;\
|
||
|
st.w t4, tp, -0x14;\
|
||
|
st.w t5, tp, -0x18;\
|
||
|
st.w t6, tp, -0x1c;\
|
||
|
st.w t7, tp, -0x20;\
|
||
|
st.w t8, tp, -0x24;\
|
||
|
st.w s0, tp, -0x28;\
|
||
|
st.w s1, tp, -0x2c;\
|
||
|
st.w s2, tp, -0x30;\
|
||
|
st.w s3, tp, -0x34;\
|
||
|
st.w s4, tp, -0x38;\
|
||
|
st.w s5, tp, -0x3c;\
|
||
|
st.w s6, tp, -0x40;\
|
||
|
st.w s7, tp, -0x44;\
|
||
|
st.w s8, tp, -0x48;\
|
||
|
st.w a0, tp, -0x4c;\
|
||
|
st.w a1, tp, -0x50;\
|
||
|
st.w a2, tp, -0x54;\
|
||
|
st.w a3, tp, -0x58;\
|
||
|
st.w a4, tp, -0x5c;\
|
||
|
st.w a5, tp, -0x60;\
|
||
|
st.w a6, tp, -0x64;\
|
||
|
st.w a7, tp, -0x68;\
|
||
|
st.w ra, tp, -0x6c;\
|
||
|
st.w sp, tp, -0x70;\
|
||
|
st.w gp, tp, -0x74;\
|
||
|
st.w fp, tp, -0x78;\
|
||
|
addi.w t0, tp, 0 ;\
|
||
|
csrrd tp, CSR_KScratch1; \
|
||
|
st.w tp, t0, -0x7c;
|
||
|
|
||
|
|
||
|
#define RESTORE_REGS_ALL(BASE) \
|
||
|
li.w tp, BASE;\
|
||
|
ld.w t0, tp, -0x4 ;\
|
||
|
ld.w t1, tp, -0x8 ;\
|
||
|
ld.w t2, tp, -0xc ;\
|
||
|
ld.w t3, tp, -0x10;\
|
||
|
ld.w t4, tp, -0x14;\
|
||
|
ld.w t5, tp, -0x18;\
|
||
|
ld.w t6, tp, -0x1c;\
|
||
|
ld.w t7, tp, -0x20;\
|
||
|
ld.w t8, tp, -0x24;\
|
||
|
ld.w s0, tp, -0x28;\
|
||
|
ld.w s1, tp, -0x2c;\
|
||
|
ld.w s2, tp, -0x30;\
|
||
|
ld.w s3, tp, -0x34;\
|
||
|
ld.w s4, tp, -0x38;\
|
||
|
ld.w s5, tp, -0x3c;\
|
||
|
ld.w s6, tp, -0x40;\
|
||
|
ld.w s7, tp, -0x44;\
|
||
|
ld.w s8, tp, -0x48;\
|
||
|
ld.w a0, tp, -0x4c;\
|
||
|
ld.w a1, tp, -0x50;\
|
||
|
ld.w a2, tp, -0x54;\
|
||
|
ld.w a3, tp, -0x58;\
|
||
|
ld.w a4, tp, -0x5c;\
|
||
|
ld.w a5, tp, -0x60;\
|
||
|
ld.w a6, tp, -0x64;\
|
||
|
ld.w a7, tp, -0x68;\
|
||
|
ld.w ra, tp, -0x6c;\
|
||
|
ld.w sp, tp, -0x70;\
|
||
|
ld.w gp, tp, -0x74;\
|
||
|
ld.w fp, tp, -0x78;\
|
||
|
ld.w tp, tp, -0x7c;
|
||
|
|
||
|
//in future, SAVE/RESTORE_REGS_FAST can no care s0~s8
|
||
|
#define SAVE_REGS_FAST(BASE) \
|
||
|
csrwr tp, CSR_KScratch1; \
|
||
|
li.w tp, BASE;\
|
||
|
st.w t0, tp, -0x4 ;\
|
||
|
st.w t1, tp, -0x8 ;\
|
||
|
st.w t2, tp, -0xc ;\
|
||
|
st.w t3, tp, -0x10;\
|
||
|
st.w t4, tp, -0x14;\
|
||
|
st.w t5, tp, -0x18;\
|
||
|
st.w t6, tp, -0x1c;\
|
||
|
st.w t7, tp, -0x20;\
|
||
|
st.w t8, tp, -0x24;\
|
||
|
/*st.w s0, tp, -0x28;*/\
|
||
|
/*st.w s1, tp, -0x2c;*/\
|
||
|
/*st.w s2, tp, -0x30;*/\
|
||
|
/*st.w s3, tp, -0x34;*/\
|
||
|
/*st.w s4, tp, -0x38;*/\
|
||
|
/*st.w s5, tp, -0x3c;*/\
|
||
|
/*st.w s6, tp, -0x40;*/\
|
||
|
/*st.w s7, tp, -0x44;*/\
|
||
|
/*st.w s8, tp, -0x48;*/\
|
||
|
st.w a0, tp, -0x4c;\
|
||
|
st.w a1, tp, -0x50;\
|
||
|
st.w a2, tp, -0x54;\
|
||
|
st.w a3, tp, -0x58;\
|
||
|
st.w a4, tp, -0x5c;\
|
||
|
st.w a5, tp, -0x60;\
|
||
|
st.w a6, tp, -0x64;\
|
||
|
st.w a7, tp, -0x68;\
|
||
|
st.w ra, tp, -0x6c;\
|
||
|
st.w sp, tp, -0x70;\
|
||
|
/*st.w gp, tp, -0x74;*/\
|
||
|
/*st.w fp, tp, -0x78;*/\
|
||
|
|
||
|
|
||
|
#define RESTORE_REGS_FAST(BASE) \
|
||
|
li.w tp, BASE;\
|
||
|
ld.w t0, tp, -0x4 ;\
|
||
|
ld.w t1, tp, -0x8 ;\
|
||
|
ld.w t2, tp, -0xc ;\
|
||
|
ld.w t3, tp, -0x10;\
|
||
|
ld.w t4, tp, -0x14;\
|
||
|
ld.w t5, tp, -0x18;\
|
||
|
ld.w t6, tp, -0x1c;\
|
||
|
ld.w t7, tp, -0x20;\
|
||
|
ld.w t8, tp, -0x24;\
|
||
|
/*ld.w s0, tp, -0x28;*/\
|
||
|
/*ld.w s1, tp, -0x2c;*/\
|
||
|
/*ld.w s2, tp, -0x30;*/\
|
||
|
/*ld.w s3, tp, -0x34;*/\
|
||
|
/*ld.w s4, tp, -0x38;*/\
|
||
|
/*ld.w s5, tp, -0x3c;*/\
|
||
|
/*ld.w s6, tp, -0x40;*/\
|
||
|
/*ld.w s7, tp, -0x44;*/\
|
||
|
/*ld.w s8, tp, -0x48;*/\
|
||
|
ld.w a0, tp, -0x4c;\
|
||
|
ld.w a1, tp, -0x50;\
|
||
|
ld.w a2, tp, -0x54;\
|
||
|
ld.w a3, tp, -0x58;\
|
||
|
ld.w a4, tp, -0x5c;\
|
||
|
ld.w a5, tp, -0x60;\
|
||
|
ld.w a6, tp, -0x64;\
|
||
|
ld.w a7, tp, -0x68;\
|
||
|
ld.w ra, tp, -0x6c;\
|
||
|
ld.w sp, tp, -0x70;\
|
||
|
/*ld.w gp, tp, -0x74;*/\
|
||
|
/*ld.w fp, tp, -0x78;*/\
|
||
|
csrrd tp, CSR_KScratch1;
|
||
|
|
||
|
|
||
|
#define SET_SEG(seg, plv3, phy, cca) \
|
||
|
Save_two_regs(t0,t1); \
|
||
|
li.w t0 , ((plv3&1)<<3|(phy&7))<<(seg*4);\
|
||
|
li.w t1 , 0xf<<(seg*4); \
|
||
|
csrxchg t0 , t1 , CSR_SEGPA;\
|
||
|
li.w t0 , (cca&0xf)<<(seg*4);\
|
||
|
li.w t1 , 0xf<<(seg*4); \
|
||
|
csrxchg t0 , t1 , CSR_SEGCA;\
|
||
|
Restore_two_regs(t0,t1)
|
||
|
|
||
|
#define SET_MPU(num, base, calg, plv3, plv0, mask) \
|
||
|
Save_one_reg(t0); \
|
||
|
li.w t0 , (((base)&0xfffff000)|(calg&0xf)<<4|(plv3&1)<<3|(plv0&1));\
|
||
|
csrwr t0 , CSR_MPU0_BASE|num<<2; \
|
||
|
li.w t0 , ((mask)&0xfffff000);\
|
||
|
csrwr t0 , CSR_MPU0_MASK|num<<2; \
|
||
|
Restore_one_reg(t0)
|
||
|
|
||
|
//return a0: 0, no; 1: implement.
|
||
|
#define CHECK_MPU_IMPL(num) \
|
||
|
li.w a0, -1; \
|
||
|
csrwr a0, CSR_MPU0_BASE|num<<2; \
|
||
|
csrrd a0, CSR_MPU0_BASE|num<<2; \
|
||
|
//Save & Restore
|
||
|
#define Save_one_reg(reg0) \
|
||
|
addi.w sp , sp, -4;\
|
||
|
st.w reg0, sp, 0
|
||
|
|
||
|
#define Restore_one_reg(reg0) \
|
||
|
ld.w reg0, sp, 0 ;\
|
||
|
addi.w sp , sp, 4
|
||
|
|
||
|
#define Save_two_regs(reg0,reg1) \
|
||
|
addi.w sp , sp,-8;\
|
||
|
st.w reg0, sp, 0;\
|
||
|
st.w reg1, sp, 4
|
||
|
|
||
|
#define Restore_two_regs(reg0,reg1) \
|
||
|
ld.w reg0, sp, 0;\
|
||
|
ld.w reg1, sp, 4;\
|
||
|
addi.w sp , sp, 8
|
||
|
|
||
|
|
||
|
#define Save_four_regs(reg0,reg1,reg2,reg3) \
|
||
|
addi.w sp , sp,-16;\
|
||
|
st.w reg0, sp, 0;\
|
||
|
st.w reg1, sp, 4;\
|
||
|
st.w reg2, sp, 8;\
|
||
|
st.w reg3, sp, 12
|
||
|
|
||
|
#define Restore_four_regs(reg0,reg1,reg2,reg3) \
|
||
|
ld.w reg0, sp, 0;\
|
||
|
ld.w reg1, sp, 4;\
|
||
|
ld.w reg2, sp, 8;\
|
||
|
ld.w reg3, sp, 12;\
|
||
|
addi.w sp , sp, 16
|
||
|
|
||
|
#endif /* _TOOLS_ASM_H_ */
|