208 lines
4.8 KiB
ArmAsm
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
|