93 lines
2.6 KiB
ArmAsm
93 lines
2.6 KiB
ArmAsm
# Debugging routines
|
|
|
|
.extern tohex
|
|
.extern memcpy
|
|
|
|
.global regdump
|
|
|
|
/* newlib system calls */
|
|
.set SYSWRITE, 64
|
|
|
|
.section .rodata
|
|
regnames:
|
|
.ascii "x0", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5"
|
|
|
|
.section .bss
|
|
buf: .skip 15 # room for 20 byte string
|
|
# x10: ABCDEFGH\n is 14 chars
|
|
.text
|
|
# Print values of all registers (in hex)
|
|
# write syscall uses t0, a0, a1, a2
|
|
regdump:
|
|
# save all registers to preserve their state when entering the function
|
|
# except sp, which will be offset by -64
|
|
addi sp, sp, -64 # allocate stack space to stash all registers
|
|
sw x0, 0(sp)
|
|
sw x1, 4(sp)
|
|
sw x2, 8(sp)
|
|
sw x3, 12(sp)
|
|
sw x4, 16(sp)
|
|
sw x5, 20(sp)
|
|
sw x6, 24(sp)
|
|
sw x7, 28(sp)
|
|
sw x8, 32(sp)
|
|
sw x9, 36(sp)
|
|
sw x10, 40(sp)
|
|
sw x11, 44(sp)
|
|
sw x12, 48(sp)
|
|
sw x13, 52(sp)
|
|
sw x14, 56(sp)
|
|
sw x15, 60(sp)
|
|
|
|
li s0, 0
|
|
li s1, 16
|
|
|
|
regdump_loop:
|
|
beq s0, s1, regdump_done
|
|
la a1, regnames # load address of regnames
|
|
slli a2, s0, 1 # a2 = s0 * 2
|
|
add a1, a1, a2 # a1 = a1 + a2
|
|
|
|
# copy regname to buf
|
|
la a0, buf # load address of buf into a0 as dest
|
|
li a2, 2 # copy 2 bytes
|
|
addi sp, sp, -4 # allocate stack space
|
|
sw ra, 0(sp) # save contents of ra
|
|
jal memcpy
|
|
lw ra, 0(sp) # restore contents of ra
|
|
addi sp, sp, 4 # deallocate stack space
|
|
# append ': '
|
|
li t0, ':'
|
|
sb t0, 0(a0)
|
|
li t0, 0x20
|
|
sb t0, 1(a0)
|
|
addi a0, a0, 2 # bump a0 address over ': ' text
|
|
mv a1, a0 # load address of output buffer to a1
|
|
slli a2, s0, 2 # calculate the offset of the register value relative to sp
|
|
add a2, a2, sp # a2 = sp + (s0 * 4)
|
|
lw a0, 0(a2) # load register value to format into a0
|
|
addi sp, sp, -8 # allocate stack space
|
|
sw a1, 4(sp) # save contents of a1
|
|
sw ra, 0(sp) # save contents of ra
|
|
jal tohex
|
|
lw ra, 0(sp) # restore contents of ra
|
|
lw a1, 4(sp) # restore contents of a1 (buffer)
|
|
addi sp, sp, 8 # deallocate stack space
|
|
li t0, '\n' # append newline
|
|
sb t0, 8(a1)
|
|
|
|
# print the register name and value
|
|
li t0, SYSWRITE # "write" syscall
|
|
li a0, 1 # 1 = standard output (stdout)
|
|
la a1, buf
|
|
li a2, 4+8+1 # length of register name string:
|
|
# rr: 12345678\n
|
|
ecall # invoke syscall to print the string
|
|
|
|
addi s0, s0, 1
|
|
j regdump_loop
|
|
|
|
regdump_done:
|
|
# TODO: Restore s0 & s1
|
|
addi sp, sp, 64 # deallocate stack space
|
|
ret
|