universalisos/guests/riscv-sampling/guest_p0.s

75 lines
1.9 KiB
ArmAsm

/* Partition 0 guest (SOURCE role): greeting -> APEX -> sampling create+write -> next timepart.
* Address placeholders 0x11111111/0x22222222/... are patched at build time.
* Every patched load is followed by slli/srli zero-extend: partition RAM lives
* at 0x90000000 (bit31 set), so the lui/addiw pair alone would sign-extend to
* 0xFFFFFFFF9xxxxxxx; the zero-extend yields the canonical PA. */
.equ H_CONSOLE_PUTS, 2
.equ H_NEXT_TIMEPART, 9
.equ H_PART_GET_STATUS, 10
.equ H_PART_SET_MODE, 11
.equ H_ERROR_RAISE, 12
.equ H_ERROR_GET_STATUS, 13
.equ H_SAMPLING_CREATE, 15
.equ H_SAMPLING_WRITE, 16
.equ A_GREETING, 0x11111111
.equ A_STATUS, 0x22222222
.equ A_APEXMSG, 0x33333333
.equ A_SAMPMSG, 0x44444444
.equ A_DONE, 0x55555555
.macro LDADDR reg, sym
li \reg, \sym
slli \reg, \reg, 32
srli \reg, \reg, 32
.endm
_start:
/* greeting */
li a7, H_CONSOLE_PUTS
LDADDR a0, A_GREETING
li a1, 64
ecall
/* SET_PARTITION_MODE(NORMAL) */
li a7, H_PART_SET_MODE
li a0, 3
ecall
/* RAISE_APPLICATION_ERROR(1) */
li a7, H_ERROR_RAISE
li a0, 1
ecall
/* GET_PARTITION_STATUS(buf) */
li a7, H_PART_GET_STATUS
LDADDR a0, A_STATUS
ecall
/* GET_ERROR_STATUS(buf) */
li a7, H_ERROR_GET_STATUS
LDADDR a0, A_STATUS
ecall
/* "[apex] OK" */
li a7, H_CONSOLE_PUTS
LDADDR a0, A_APEXMSG
li a1, 64
ecall
/* SAMPLING_CREATE(max=32, refresh=1000000us, SOURCE) */
li a7, H_SAMPLING_CREATE
li a0, 32
li a1, 1000000
li a2, 0
ecall
mv s1, a0 /* source port id */
/* SAMPLING_WRITE(port, msg, 12) */
li a7, H_SAMPLING_WRITE
mv a0, s1
LDADDR a1, A_SAMPMSG
li a2, 12
ecall
/* "[sampling] wrote" */
li a7, H_CONSOLE_PUTS
LDADDR a0, A_DONE
li a1, 64
ecall
/* NEXT_TIMEPART */
li a7, H_NEXT_TIMEPART
ecall
1: j 1b