// pmpcbo.S
// David_Harris@hmc.edu 1/21/24
// Cover PMP checks of cache management instructions

#include "WALLY-init-lib.h"
main:

     # set up PMP so user and supervisor mode can access partial address space
    li t0, 0x080F;
#    li t0, 0x0808;
    csrw pmpcfg0, t0  # configure PMP0 to TOR RWX and PMP1 to TOR no access
    li t0, 0x2003FFFF
    li t1, 0xFFFFFFFF
    csrw pmpaddr0, t0   # configure PMP0 top of range to 0x800FFFFF to allow all 32-bit addresses
    csrw pmpaddr1, t1   # configure PMP1 top of range to 0xFFFFFFFF to prohibit accesses above

    # enable cbo instructions
    li t0, 0xF0
    csrw menvcfg, t0
    csrw senvcfg, t0

    # switch to supervisor mode
    li a0, 1
    ecall

    # cbo instructions to PMP-forbidded address
    li a0, 0x81000000   # forbidden address
    cbo.zero (a0)
    cbo.inval (a0)

    j done