.section .text.init .globl _start .type _start, @function _start: la sp, __stack_top # Zero .bss la t0, __bss_start la t1, __bss_end 1: bgeu t0, t1, 2f sw zero, 0(t0) addi t0, t0, 4 j 1b 2: call main 3: j 3b .size _start, .-_start .section .text .globl trap_entry .type trap_entry, @function trap_entry: # Save full integer context (except x0/x2) because an interrupt can # preempt code with live values in any register, not just caller-saved. addi sp, sp, -128 sw ra, 124(sp) sw gp, 120(sp) sw tp, 116(sp) sw t0, 112(sp) sw t1, 108(sp) sw t2, 104(sp) sw s0, 100(sp) sw s1, 96(sp) sw a0, 92(sp) sw a1, 88(sp) sw a2, 84(sp) sw a3, 80(sp) sw a4, 76(sp) sw a5, 72(sp) sw a6, 68(sp) sw a7, 64(sp) sw s2, 60(sp) sw s3, 56(sp) sw s4, 52(sp) sw s5, 48(sp) sw s6, 44(sp) sw s7, 40(sp) sw s8, 36(sp) sw s9, 32(sp) sw s10, 28(sp) sw s11, 24(sp) sw t3, 20(sp) sw t4, 16(sp) sw t5, 12(sp) sw t6, 8(sp) csrr t0, mcause li t1, 0x80000007 # machine timer interrupt (RV32) bne t0, t1, 1f call timer_isr # C function that ACKs/clears the timer so i_timer_irq goes low 1: lw t6, 8(sp) lw t5, 12(sp) lw t4, 16(sp) lw t3, 20(sp) lw s11, 24(sp) lw s10, 28(sp) lw s9, 32(sp) lw s8, 36(sp) lw s7, 40(sp) lw s6, 44(sp) lw s5, 48(sp) lw s4, 52(sp) lw s3, 56(sp) lw s2, 60(sp) lw a7, 64(sp) lw a6, 68(sp) lw a5, 72(sp) lw a4, 76(sp) lw a3, 80(sp) lw a2, 84(sp) lw a1, 88(sp) lw a0, 92(sp) lw s1, 96(sp) lw s0, 100(sp) lw t2, 104(sp) lw t1, 108(sp) lw t0, 112(sp) lw tp, 116(sp) lw gp, 120(sp) lw ra, 124(sp) addi sp, sp, 128 mret