riscv-utils/lib/printregs.s

208 lines
4.8 KiB
ArmAsm

.global printregs
.extern u64hex
.option rvc
.option norelax # don't depend on gp being set correctly
.data
regmsg:
.ascii " x1/ra=0x................ x5/t0=0x................ x8/s0=0x................\n"
.ascii " x2/sp=0x................ x6/t1=0x................ x9/s1=0x................\n"
.ascii " x3/gp=0x................ x7/t2=0x................\n"
.ascii " x4/tp=0x................ x18/s2=0x................\n"
.ascii " x14/a4=0x................ x19/s3=0x................\n"
.ascii "x10/a0=0x................ x15/a5=0x................ x20/s4=0x................\n"
.ascii "x11/a1=0x................ x16/a6=0x................ x21/s5=0x................\n"
.ascii "x12/a2=0x................ x17/a7=0x................\n"
.ascii "x13/a3=0x................ x28/t3=0x................\n"
.ascii " x25/ s9=0x................ x29/t4=0x................\n"
.ascii "x22/s6=0x................ x26/s10=0x................ x30/t5=0x................\n"
.ascii "x23/s7=0x................ x27/s11=0x................ x31/t6=0x................\n"
.ascii "x24/s8=0x................\n"
.equ regmsg_size, (.) - regmsg
# x1 ra x5 t0 x8 s0/fp
# x2 sp x6 t1 x9 s1
# x3 gp x7 t2
# x4 tp x18 s2
# x14 a4 x19 s3
# x10 a0 x15 a5 x20 s4
# x11 a1 x16 a6 x21 s5
# x12 a2 x17 a7
# x13 a3 x28 t3
# x25 s9 x29 t4
# x22 s6 x26 s10 x30 t5
# x23 s7 x27 s11 x31 t6
# x24 s8
#
# x1 ra
# x2 sp x5 t0
# x3 gp x6 t1 x8 s0/fp
# x4 tp x7 t2 x9 s1
#
# x10 a0 x14 a4 x18 s2
# x11 a1 x15 a5 x19 s3
# x12 a2 x16 a6 x20 s4
# x13 a3 x17 a7
# x28 t3
# x21 s5 x25 s9 x29 t4
# x22 s6 x26 s10 x30 t5
# x23 s7 x27 s11 x31 t6
# x24 s8
.text
printregs:
# this routine is meant for debugging,
# so we treat all registers as callee-save
# TODO: consider saving to globals instead of the stack
# huh. it seems impossible to do anything useful
# with atomics without using registers
#
# li t0, 1 # Initialize swap value.
# 0:lw t1, (a0) # Check if lock is held.
# bnez t1, again # Retry if held.
# amoswap.w.aq t1, t0, (a0) # Attempt to acquire lock.
# bnez t1, 0b # Retry if held.
# save regs to stack
sd sp, -8(sp)
addi sp, sp, -8*7
sd a0, 0(sp)
sd a1, 8(sp)
sd t1, 16(sp)
sd t2, 24(sp)
sd t5, 32(sp)
sd ra, 40(sp)
# copy string to stack?
# write registers to string
la a0, regmsg+9
ld a1, 40(sp) # x1 / ra
call u64hex
addi a0, a0, 16+11
mv a1, x5 # t0
call u64hex
addi a0, a0, 16+11
mv a1, x8 # s0
call u64hex
addi a0, a0, 16+10
ld a1, 48(sp) # x2/sp
call u64hex
addi a0, a0, 16+11
ld a1, 16(sp) # x6/t1
call u64hex
addi a0, a0, 16+11
mv a1, x9 # s1
call u64hex
addi a0, a0, 16+10
mv a1, x3 # gp
call u64hex
addi a0, a0, 16+11
ld a1, 24(sp) # x7/t2
call u64hex
addi a0, a0, 16+10
mv a1, x4 # tp
call u64hex
addi a0, a0, 16+11 + 16+11
mv a1, x18 # s2
call u64hex
addi a0, a0, 16+10 + 16+11
mv a1, x14 # a4
call u64hex
addi a0, a0, 16+11
mv a1, x19 # s3
call u64hex
addi a0, a0, 16+10
ld a1, 0(sp) # x10/a0
call u64hex
addi a0, a0, 16+11
mv a1, x15 # a5
call u64hex
addi a0, a0, 16+11
mv a1, x20 # s4
call u64hex
addi a0, a0, 16+10
ld a1, 8(sp) # a1
call u64hex
addi a0, a0, 16+11
mv a1, x16 # a6
call u64hex
addi a0, a0, 16+11
mv a1, x21 # s5
call u64hex
addi a0, a0, 16+10
mv a1, x12 # a2
call u64hex
addi a0, a0, 16+11
mv a1, x17 # a7
call u64hex
addi a0, a0, 16+10
mv a1, x13 # a3
call u64hex
addi a0, a0, 16+11 + 16+11
mv a1, x28 # t3
call u64hex
addi a0, a0, 16+10 + 16+11
mv a1, x25 # s9
call u64hex
addi a0, a0, 16+11
mv a1, x29 # t4
call u64hex
addi a0, a0, 16+10
mv a1, x22 # s6
call u64hex
addi a0, a0, 16+11
mv a1, x26 # s10
call u64hex
addi a0, a0, 16+11
ld a1, 32(sp) # x30 / t5
call u64hex
addi a0, a0, 16+10
mv a1, x23 # s7
call u64hex
addi a0, a0, 16+11
mv a1, x27 # s11
call u64hex
addi a0, a0, 16+11
mv a1, x31 # t6
call u64hex
addi a0, a0, 16+10
mv a1, x24 # s8
call u64hex
# print string
li a7, 64 # sys_write
li a0, 1 # stdout
la a1, regmsg
li a2, regmsg_size
ecall
# restore saved registers
ld a0, 0(sp)
ld a1, 8(sp)
ld t1, 16(sp)
ld t2, 24(sp)
ld t5, 32(sp)
ld ra, 40(sp)
ld sp, 48(sp)
ret