.macro DEFINECSRGET1 csrname, csrno .global \csrname .align 2 .type \csrname, @function \csrname: csrrs a1, \csrno+0x80, x0 csrrs a0, \csrno, x0 jr ra .size \csrname, .-\csrname .endm .macro DEFINECSRGETCLEAR1 csrname, csrno .global \csrname .align 2 .type \csrname, @function \csrname: csrrw a1, \csrno+0x80, x0 csrrw a0, \csrno, x0 jr ra .size \csrname, .-\csrname .endm .macro DEFINECSRGETCLEAR csrname, csrno .endm .macro DEFINECSRGET csrname, csrno .endm .text .global __start .type __start, @function __start: # Initialize global pointer .option push .option norelax 1:auipc gp, %pcrel_hi(__global_pointer$) addi gp, gp, %pcrel_lo(1b) .option pop # Clear the bss segment la a0, _edata la a2, _end sub a2, a2, a0 li a1, 0 call memset lw a0, 0(sp) # a0 = argc addi a1, sp, __SIZEOF_POINTER__ # a1 = argv li a2, 0 # a2 = envp = NULL call main tail exit .size __start, .-__start DEFINECSRGET cycle, 0xc00 DEFINECSRGETCLEAR cycle_clear, 0xc00 DEFINECSRGET instrcount, 0xc02 DEFINECSRGETCLEAR instrcount_clear, 0xc02 DEFINECSRGET get_counter_addsub, 0xc20 DEFINECSRGETCLEAR get_counter_addsub_clear, 0xc20 DEFINECSRGET get_counter_mul, 0xc21 DEFINECSRGETCLEAR get_counter_mul_clear, 0xc21 DEFINECSRGET get_counter_div, 0xc22 DEFINECSRGETCLEAR get_counter_div_clear, 0xc22 DEFINECSRGET get_counter_ld, 0xc23 DEFINECSRGETCLEAR get_counter_ld_clear, 0xc23 DEFINECSRGET get_counter_st, 0xc24 DEFINECSRGETCLEAR get_counter_st_clear, 0xc24 DEFINECSRGET get_counter_jmp, 0xc25 DEFINECSRGETCLEAR get_counter_jmp_clear, 0xc25 DEFINECSRGET get_counter_j, 0xc26 DEFINECSRGETCLEAR get_counter_j_clear, 0xc26 DEFINECSRGET get_counter_alui, 0xc27 DEFINECSRGETCLEAR get_counter_alui_clear, 0xc27 DEFINECSRGET get_counter_alu, 0xc28 DEFINECSRGETCLEAR get_counter_alu_clear, 0xc28 DEFINECSRGET clear_all_counter, 0xc40 DEFINECSRGET stop_all_counter, 0xc41