universalisos/guests/riscv-sampling/guest_p1.s

83 lines
2 KiB
ArmAsm

/* Partition 1 guest (DESTINATION role): greeting -> APEX -> sampling create+read -> report VALID/INVALID -> next timepart.
* See guest_p0.s for the placeholder/zero-extend convention. */
.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_READ, 17
.equ A_GREETING, 0x11111111
.equ A_STATUS, 0x22222222
.equ A_APEXMSG, 0x33333333
.equ A_RDBUF, 0x44444444
.equ A_RDSTAT, 0x55555555
.equ A_VALID, 0x66666666
.equ A_INVALID, 0x77777777
.macro LDADDR reg, sym
li \reg, \sym
slli \reg, \reg, 32
srli \reg, \reg, 32
.endm
_start:
li a7, H_CONSOLE_PUTS
LDADDR a0, A_GREETING
li a1, 64
ecall
li a7, H_PART_SET_MODE
li a0, 3
ecall
li a7, H_ERROR_RAISE
li a0, 1
ecall
li a7, H_PART_GET_STATUS
LDADDR a0, A_STATUS
ecall
li a7, H_ERROR_GET_STATUS
LDADDR a0, A_STATUS
ecall
li a7, H_CONSOLE_PUTS
LDADDR a0, A_APEXMSG
li a1, 64
ecall
/* SAMPLING_CREATE(max=32, refresh=1000000us, DESTINATION, source_id=0) */
li a7, H_SAMPLING_CREATE
li a0, 32
li a1, 1000000
li a2, 1
li a3, 0
ecall
mv s1, a0
/* SAMPLING_READ(port, buf, 32, status) */
li a7, H_SAMPLING_READ
mv a0, s1
LDADDR a1, A_RDBUF
li a2, 32
LDADDR a3, A_RDSTAT
ecall
/* t0 = status PA; branch on the valid flag */
LDADDR t0, A_RDSTAT
lw t1, 4(t0) /* valid flag */
bnez t1, 1f /* valid -> print VALID */
/* INVALID path */
li a7, H_CONSOLE_PUTS
LDADDR a0, A_INVALID
li a1, 64
ecall
j 2f
1: /* VALID path */
li a7, H_CONSOLE_PUTS
LDADDR a0, A_VALID
li a1, 64
ecall
2: /* P-3 HM demo: deliberately fault so the health monitor idles this
* partition (PARTITION_STOP). P0 must keep running afterwards. */
.word 0xffffffff
/* NEXT_TIMEPART */
li a7, H_NEXT_TIMEPART
ecall
3: j 3b