MIPS/resources/soft/func/start.S
2022-08-18 18:45:57 +08:00

508 lines
10 KiB
ArmAsm

#include <asm.h>
#include <regdef.h>
#include <cpu_cde.h>
#include <utils.h>
#define TEST_NUM 156
##s0, number
##s1, number adress
##s2, exception use
##s3, score
##s4, exception pc
.set noreorder
.globl _start
.globl start
.globl __main
_start:
start:
li t0, 0xffffffff
addiu t0, zero, 0xffff
b locate
nop
##avoid "j locate" not taken
lui t0, 0x8000
addiu t1, t1, 1
or t2, t0, zero
addu t3, t5, t6
lw t4, 0(t0)
nop
##avoid cpu run error
.org 0x0ec
lui t0, 0x8000
addiu t1, t1, 1
or t2, t0, zero
addu t3, t5, t6
lw t4, 0(t0)
.org 0x100
test_finish:
addiu t0, t0, 1
li t1, 0xff
LI (t2, UART_ADDR)
sw t1, 0x0(t2)
b test_finish
nop
##avoid cpu run error
lui t0, 0x8000
addiu t1, t1, 1
or t2, t0, zero
addu t3, t5, t6
lw t4, 0(t0)
/*
* exception handle
*/
.org 0x380
1:
mfhi k0
mflo k1
li k0, 0x800d0000
lw k1, 0x0(k0)
li k0, 0x01 # syscall
beq k1, k0, syscall_ex
nop
li k0, 0x02 # break
beq k1, k0, break_ex
nop
li k0, 0x03 # overflow
beq k1, k0, overflow_ex
nop
li k0, 0x04 # adel(load)
beq k1, k0, adel_load_ex
nop
li k0, 0x05 # ades
beq k1, k0, ades_ex
nop
li k0, 0x06 # adel(inst fetch)
beq k1, k0, adel_if_ex
nop
li k0, 0x07 # reserved inst
beq k1, k0, reserved_inst_ex
nop
li k0, 0x08 # int
beq k1, k0, int_ex
nop
li k0, 0x09 # trap
beq k1, k0, trap_ex
nop
b test_finish # Not recognized
nop
syscall_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
nop
mfc0 k0, c0_cause
andi k0, k0, 0x7c # 6..2
li k1, 0x20 # 010_0000
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02
li k1, 0x02
bne k0, k1, ex_finish
nop
lui s2, 0x1
b ex_finish
nop
break_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
nop
mfc0 k0, c0_cause
andi k0, k0, 0x7c # 6..2
li k1, 0x24 # 010_0100
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02 # exl
li k1, 0x02 # exl = 1
bne k0, k1, ex_finish
nop
lui s2, 0x2
b ex_finish
nop
overflow_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
mfc0 k0, c0_cause
andi k0, k0, 0x7c # 6..2 exc code
li k1, 0x30 # 011_0000
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02 # exl
li k1, 0x02 # exl = 1
bne k0, k1, ex_finish
nop
lui s2, 0x3
b ex_finish
nop
adel_load_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
nop
mfc0 k0, c0_cause
andi k0, k0, 0x7c # 6..2 exc code
li k1, 0x10 # 001_0000
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02 # exl
li k1, 0x02 # exl = 1
bne k0, k1, ex_finish
nop
lui s2, 0x4
b ex_finish
nop
ades_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
nop
mfc0 k0, c0_cause
andi k0, k0, 0x7c # 6..2 exc code
li k1, 0x14 # 001_0100
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02 # exl
li k1, 0x02 # exl = 1
bne k0, k1, ex_finish
nop
lui s2, 0x5
b ex_finish
nop
adel_if_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
nop
mtc0 s5, c0_epc
mfc0 k0, c0_cause
andi k0, k0, 0x7c # 6..2 exc code
li k1, 0x10 # 001_0000
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02 # exl
li k1, 0x02 # exl = 1
bne k0, k1, ex_finish
nop
lui s2, 0x6
b ex_finish
nop
reserved_inst_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
nop
mfc0 k0, c0_cause
andi k0, k0, 0x7c # 6..2 exc code
li k1, 0x28 # 010_1000
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02 # exl
li k1, 0x02 # exl = 1
bne k0, k1, ex_finish
nop
lui s2, 0x7
b ex_finish
nop
int_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
nop
addiu k0, k0, 8
mtc0 k0, c0_epc //epc+8
disable_trace_cmp_s
mfc0 k0, c0_cause //don't compare cause.bd
enable_trace_cmp_s
andi k0, k0, 0x7c # 6..2 exc code
li k1, 0x00 # 000_0000
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02 # exl
li k1, 0x02 # exl = 1
bne k0, k1, ex_finish
nop
li k0, 0xffffffff
li k1, 0x00000000
mtc0 k0, c0_compare //clear compare
mtc0 k1, c0_cause
lui s2, 0x8
b ex_ret
nop
trap_ex:
addu s2, zero, zero
mfc0 k0, c0_epc
bne k0, s4, ex_finish
nop
mfc0 k0, c0_cause
andi k0, k0, 0x7c # 6..2
li k1, 0x34 # Trap EXCCODE << 2
bne k0, k1, ex_finish
nop
mfc0 k0, c0_status
andi k0, k0, 0x02 # EXL
li k1, 0x02
bne k0, k1, ex_finish
nop
lui s2, 0x9
b ex_finish
nop
ex_finish:
mfc0 k0,c0_cause
lui k1,0x8000
and k0,k0,k1
mfc0 k1,c0_epc
addiu k1,k1,0x4
beq k0,zero, 1f
nop
addiu k1,k1,0x4
1:
mtc0 k1,c0_epc
nop
bne s2, zero, ex_ret
nop
lui s2, 0xffff
ex_ret:
.set mips32
eret
.set mips1
nop
locate:
.set noreorder
LI (a0, LED_RG1_ADDR)
LI (a1, LED_RG0_ADDR)
LI (s1, NUM_ADDR)
LI (t1, 0x0002)
LI (t2, 0x0001)
lui s3, 0
sw t1, 0(a0)
sw t2, 0(a1)
sw s3, 0(s1)
lui s0, 0 ## initial run number
inst_test:
TEST_UNIT_CACHE(n104_linux)
TEST_UNIT_CACHE(n1_lui_test) # 1 2
TEST_UNIT_CACHE(n2_addu_test)
TEST_UNIT_CACHE(n3_addiu_test)
TEST_UNIT(n4_beq_test) # 7
TEST_UNIT(n5_bne_test)
TEST_UNIT_CACHE(n6_lw_test) # 9 10
TEST_UNIT_CACHE(n7_or_test)
TEST_UNIT_CACHE(n8_slt_test)
TEST_UNIT_CACHE(n9_slti_test)
TEST_UNIT_CACHE(n10_sltiu_test)
TEST_UNIT_CACHE(n11_sll_test)
TEST_UNIT_CACHE(n12_sw_test)
TEST_UNIT(n13_j_test) # 23
TEST_UNIT(n14_jal_test)
TEST_UNIT(n15_jr_test)
TEST_UNIT(n16_beq_ds_test)
TEST_UNIT(n17_bne_ds_test)
TEST_UNIT(n18_j_ds_test)
TEST_UNIT(n19_jal_ds_test)
TEST_UNIT(n20_jr_ds_test)
TEST_UNIT_CACHE(n21_add_test) # 31 32
TEST_UNIT_CACHE(n22_addi_test)
TEST_UNIT_CACHE(n23_sub_test)
TEST_UNIT_CACHE(n24_subu_test)
TEST_UNIT_CACHE(n25_sltu_test)
TEST_UNIT_CACHE(n26_and_test)
TEST_UNIT_CACHE(n27_andi_test)
TEST_UNIT_CACHE(n28_nor_test)
TEST_UNIT_CACHE(n29_ori_test)
TEST_UNIT_CACHE(n30_xor_test)
TEST_UNIT_CACHE(n31_xori_test)
TEST_UNIT_CACHE(n32_sllv_test)
TEST_UNIT_CACHE(n33_sra_test)
TEST_UNIT_CACHE(n34_srav_test)
TEST_UNIT_CACHE(n35_srl_test)
TEST_UNIT_CACHE(n36_srlv_test)
TEST_UNIT(n37_bgez_test) # 63
TEST_UNIT(n38_bgtz_test)
TEST_UNIT(n39_blez_test)
TEST_UNIT(n40_bltz_test)
TEST_UNIT(n41_bltzal_test)
TEST_UNIT(n42_bgezal_test)
TEST_UNIT(n43_jalr_test)
TEST_UNIT_CACHE(n44_div_test) # 70 71
TEST_UNIT_CACHE(n45_divu_test)
TEST_UNIT_CACHE(n46_mult_test)
TEST_UNIT_CACHE(n47_multu_test)
TEST_UNIT_CACHE(n48_mfhi_test)
TEST_UNIT_CACHE(n49_mflo_test)
TEST_UNIT_CACHE(n50_mthi_test)
TEST_UNIT_CACHE(n51_mtlo_test)
TEST_UNIT(n52_bgez_ds_test) # 86
TEST_UNIT(n53_bgtz_ds_test)
TEST_UNIT(n54_blez_ds_test)
TEST_UNIT(n55_bltz_ds_test)
TEST_UNIT(n56_bltzal_ds_test)
TEST_UNIT(n57_bgezal_ds_test)
TEST_UNIT(n58_jalr_ds_test)
TEST_UNIT_CACHE(n59_lb_test) # 93 94
TEST_UNIT_CACHE(n60_lbu_test)
TEST_UNIT_CACHE(n61_lh_test)
TEST_UNIT_CACHE(n62_lhu_test)
TEST_UNIT_CACHE(n63_sb_test)
TEST_UNIT_CACHE(n64_sh_test)
TEST_UNIT(n65_syscall_ex_test) # 105
TEST_UNIT(n66_break_ex_test)
TEST_UNIT(n67_add_ov_ex_test)
TEST_UNIT(n68_addi_ov_ex_test)
TEST_UNIT(n69_sub_ov_ex_test)
TEST_UNIT(n70_lw_adel_ex_test)
TEST_UNIT(n71_lh_adel_ex_test)
TEST_UNIT(n72_lhu_adel_ex_test)
TEST_UNIT(n73_sw_ades_ex_test)
TEST_UNIT(n74_sh_ades_ex_test)
TEST_UNIT(n75_ft_adel_ex_test)
TEST_UNIT(n76_ri_ex_test)
TEST_UNIT(n77_soft_int_ex_test)
TEST_UNIT(n78_beq_ds_ex_test)
TEST_UNIT(n79_bne_ds_ex_test)
TEST_UNIT(n80_bgez_ds_ex_test)
TEST_UNIT(n81_bgtz_ds_ex_test)
TEST_UNIT(n82_blez_ds_ex_test)
TEST_UNIT(n83_bltz_ds_ex_test)
TEST_UNIT(n84_bltzal_ds_ex_test)
TEST_UNIT(n85_bgezal_ds_ex_test)
TEST_UNIT(n86_j_ds_ex_test)
TEST_UNIT(n87_jal_ds_ex_test)
TEST_UNIT(n88_jr_ds_ex_test)
TEST_UNIT(n89_jalr_ds_ex_test)
TEST_UNIT_CACHE(n90_lwl_test) # 130 131
TEST_UNIT_CACHE(n91_lwr_test)
TEST_UNIT_CACHE(n92_swl_test)
TEST_UNIT_CACHE(n93_swr_test)
TEST_UNIT_CACHE(n94_perf_sync_nop_test)
TEST_UNIT_CACHE(n95_madd_test)
TEST_UNIT_CACHE(n96_maddu_test)
TEST_UNIT_CACHE(n97_msub_msubu_test)
TEST_UNIT_CACHE(n100_movz_movn_test) # 148 149
TEST_UNIT(n101_trap_test) # 150
TEST_UNIT_CACHE(n102_memory_test) # 151 152
TEST_UNIT_ONLY_CACHE(n103_memory1_test) # 153
TEST_UNIT(n98_cache_dcache_test) # 146
TEST_UNIT_ONLY_CACHE(n99_cache_icache_test)
###check io access
LI (a0, IO_SIMU_ADDR)
LI (t0, 0x1234)
sw t0, 0(a0)
lw t1, 0(a0) //t1=0x12340000
sll t0, t0, 16
bne t0, t1, io_err
nop
LI (t0, 0x56780000)
sw t0, 0(a0)
srl t0, t0, 16
lw t1, 0(a0) //t1=0x5678
bne t0, t1, io_err
nop
b test_end
nop
io_err:
addiu s0, s0, 1
sw s0, 0(s1)
test_end:
LI (s0, TEST_NUM)
beq s0, s3, 1f
nop
LI (a0, LED_ADDR)
LI (a1, LED_RG1_ADDR)
LI (a2, LED_RG0_ADDR)
LI (t1, 0x0002)
sw zero, 0(a0)
sw t1, 0(a1)
sw t1, 0(a2)
b 2f
nop
1:
LI (t1, 0x0001)
LI (a0, LED_RG1_ADDR)
LI (a1, LED_RG0_ADDR)
sw t1, 0(a0)
sw t1, 0(a1)
2:
jal test_finish
nop
wait_1s:
LI (t0,SW_INTER_ADDR)
LI (t1, 0xaaaa)
#initial t3
lw t2, 0x0(t0) #switch_interleave: {switch[7],1'b0, switch[6],1'b0...switch[0],1'b0}
xor t2, t2, t1
sll t3, t2, 9 #t3 = switch interleave << 9
addiu t3, t3, 1
sub1:
addiu t3, t3, -1
#select min{t3, switch_interleave}
lw t2, 0x0(t0) #switch_interleave: {switch[7],1'b0, switch[6],1'b0...switch[0],1'b0}
xor t2, t2, t1
sll t2, t2, 9 #switch interleave << 9
sltu t4, t3, t2
bnez t4, 1f
nop
addu t3, t2, 0
1:
bne t3,zero, sub1
nop
jr ra
nop