forked from Github_Repos/cvw
added copies of 64 bit tests to 32 bit periph and priv tests
This commit is contained in:
parent
282d06b45f
commit
badc684f07
@ -0,0 +1,496 @@
|
||||
01BEEF00
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000004
|
||||
00000061
|
||||
00000061
|
||||
00000068
|
||||
00000060
|
||||
00000001
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
01BEEF01
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
00080000
|
||||
00080000
|
||||
00080000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00080000
|
||||
00080000
|
||||
FFFFFFFF
|
||||
FFF7FFFF
|
||||
00000000
|
||||
00000000
|
||||
01BEEF02
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
00000001
|
||||
00000001
|
||||
00000001
|
||||
00000000
|
||||
00080000
|
||||
00000000
|
||||
00080001
|
||||
00000001
|
||||
FFFFFFFF
|
||||
FFFFFFFE
|
||||
00000000
|
||||
00000000
|
||||
01BEEF03
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000004
|
||||
00000061
|
||||
00000061
|
||||
00000065
|
||||
00000060
|
||||
00000001
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
02BEEF04
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
0000F0F0
|
||||
3030F0F0
|
||||
0000F0F0
|
||||
00000000
|
||||
00000001
|
||||
00000000
|
||||
0000F0F1
|
||||
0000F0F0
|
||||
FFFFFFFF
|
||||
FFFF0F0F
|
||||
00000000
|
||||
00000000
|
||||
02BEEF05
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
30300000
|
||||
3030F0F0
|
||||
30300000
|
||||
00000000
|
||||
0000F0F0
|
||||
00000000
|
||||
3030F0F0
|
||||
30300000
|
||||
FFFFFFFF
|
||||
CFCFFFFF
|
||||
00000000
|
||||
00000000
|
||||
02BEEF06
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
30000000
|
||||
3030F0F0
|
||||
00000000
|
||||
00000000
|
||||
00300000
|
||||
00000000
|
||||
30300000
|
||||
30000000
|
||||
CFFFFFFF
|
||||
CFFFFFFF
|
||||
00000000
|
||||
00000000
|
||||
02BEEF07
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
0F000000
|
||||
0F0F0F0F
|
||||
0F000000
|
||||
00000000
|
||||
30000000
|
||||
00000000
|
||||
3F000000
|
||||
0F000000
|
||||
FFFFFFFF
|
||||
F0FFFFFF
|
||||
00000000
|
||||
00000000
|
||||
02BEEF08
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
00FFFF00
|
||||
00FFFF00
|
||||
00FFFF00
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00FFFF00
|
||||
00FFFF00
|
||||
FFFFFFFF
|
||||
FF0000FF
|
||||
00000000
|
||||
00000000
|
||||
02BEEF09
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
33FFFF33
|
||||
33FFFF33
|
||||
33000033
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
33FFFF33
|
||||
33FFFF33
|
||||
FF0000FF
|
||||
CC0000CC
|
||||
00000000
|
||||
00000000
|
||||
02BEEF0A
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
33000033
|
||||
33000033
|
||||
00000000
|
||||
00000000
|
||||
00FFFF00
|
||||
00000000
|
||||
33FFFF33
|
||||
33000033
|
||||
CCFFFFCC
|
||||
CCFFFFCC
|
||||
00000000
|
||||
00000000
|
||||
02BEEF0B
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
00CCCC00
|
||||
00CCCC00
|
||||
00CCCC00
|
||||
00000000
|
||||
33000033
|
||||
00000000
|
||||
33CCCC33
|
||||
00CCCC00
|
||||
FFFFFFFF
|
||||
FF3333FF
|
||||
00000000
|
||||
00000000
|
||||
02BEEF0C
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
00CCCC00
|
||||
00CCCC00
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00CCCC00
|
||||
00CCCC00
|
||||
FF3333FF
|
||||
FF3333FF
|
||||
00000000
|
||||
00000000
|
||||
02BEEF0D
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
CC00CCCC
|
||||
CCCCCCCC
|
||||
CC00CCCC
|
||||
00000000
|
||||
00CCCC00
|
||||
00000000
|
||||
CC00CCCC
|
||||
CC00CCCC
|
||||
FFFFFFFF
|
||||
33FF3333
|
||||
00000000
|
||||
00000000
|
||||
02BEEF0E
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
CCCCCCCC
|
||||
CCCCCCCC
|
||||
00CC0000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
CCCCCCCC
|
||||
CCCCCCCC
|
||||
33FF3333
|
||||
33333333
|
||||
00000000
|
||||
00000000
|
||||
02BEEF0F
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
000011FF
|
||||
FF1111FF
|
||||
33333333
|
||||
00000000
|
||||
FFFFEE00
|
||||
00000000
|
||||
FFFFFFFF
|
||||
000011FF
|
||||
FFFFEE00
|
||||
FFFFEE00
|
||||
00000000
|
||||
00000000
|
||||
02BEEF10 # Something here is failing
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
000000FF
|
||||
00000000
|
||||
000000FF
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
000000FF
|
||||
000000FF
|
||||
FFFFFFFF
|
||||
FFFFFF00
|
||||
00000000
|
||||
00000000
|
||||
02BEEF11 # this might be wrong
|
||||
8000000B
|
||||
00000000
|
||||
00000003
|
||||
00000033 # input
|
||||
00000000 # output
|
||||
00000000 # rise ip
|
||||
00000000 # serviced rise ip
|
||||
000000CC # fall ip
|
||||
00000000
|
||||
000000FF # high ip
|
||||
00000033 # why is this 0x33?
|
||||
FFFFFFCC # low ip
|
||||
FFFFFFCC # serviced low ip
|
||||
00000000
|
||||
00000000
|
||||
03BEEF12
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000002
|
||||
00000061
|
||||
00000061
|
||||
0000006C
|
||||
00000060
|
||||
00000001
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
03BEEF13
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000002
|
||||
00000021
|
||||
00000021
|
||||
0000006C
|
||||
00000020
|
||||
00000001
|
||||
00000002
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
03BEEF14
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000004
|
||||
00000061
|
||||
00000061
|
||||
0000006F
|
||||
00000060
|
||||
00000001
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
03BEEF15
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000004
|
||||
00000061
|
||||
00000061
|
||||
00000020
|
||||
00000060
|
||||
00000001
|
||||
00000003
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
03BEEF16
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000004
|
||||
00000061
|
||||
00000061
|
||||
00000074
|
||||
00000060
|
||||
00000001
|
||||
00000020
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
03BEEF17
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000002
|
||||
00000020
|
||||
00000020
|
||||
00000074
|
||||
00000020
|
||||
00000001
|
||||
00000003
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
03BEEF18
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000002
|
||||
00000020
|
||||
00000020
|
||||
00000074
|
||||
00000020
|
||||
00000001
|
||||
00000003
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
03BEEF19
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000004
|
||||
00000061
|
||||
00000061
|
||||
00000065
|
||||
00000060
|
||||
00000001
|
||||
00000003
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
03BEEF1A
|
||||
8000000B
|
||||
00000000
|
||||
0000000A
|
||||
00000006
|
||||
00000063
|
||||
00000061
|
||||
00000047
|
||||
00000060
|
||||
00000001
|
||||
000000FF
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
04BEEF1B
|
||||
80000009
|
||||
00000000
|
||||
0000000A
|
||||
00000004
|
||||
00000061
|
||||
00000061
|
||||
00000065
|
||||
00000060
|
||||
00000001
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
04BEEF1C
|
||||
80000009
|
||||
00000000
|
||||
00000003
|
||||
00080000
|
||||
00080000
|
||||
00080000
|
||||
00000000
|
||||
00000000 # is it this one that's failing?
|
||||
00000000
|
||||
00080000 # failing
|
||||
00080000
|
||||
FFFFFFFF
|
||||
FFF7FFFF
|
||||
00000000
|
||||
00000000
|
||||
04BEEF1D
|
||||
80000009
|
||||
00000000
|
||||
00000003
|
||||
00000001
|
||||
00000001
|
||||
00000001
|
||||
00000000
|
||||
00080000
|
||||
00000000
|
||||
00080001
|
||||
00000001
|
||||
FFFFFFFF
|
||||
FFFFFFFE
|
||||
00000000
|
||||
00000000
|
||||
04BEEF1E # this might also be wrong
|
||||
80000009
|
||||
00000000
|
||||
0000000A
|
||||
00000004
|
||||
00000061
|
||||
00000061
|
||||
0000006e
|
||||
00000060
|
||||
00000001
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
||||
00000000
|
@ -0,0 +1,3 @@
|
||||
0000000b # Test *** Number: Ecall from going from M mode to S mode
|
||||
00000002 # illegal instruction from truining on virtual memory with invalid satp address
|
||||
00000009 # ecall from ending tests in S mode.
|
@ -0,0 +1,920 @@
|
||||
///////////////////////////////////////////
|
||||
// WALLY-PERIPH.S
|
||||
// 64 bit version
|
||||
//
|
||||
// Ben Bracker (bbracker@hmc.edu)
|
||||
//
|
||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
||||
// Adapted from Imperas RISCV-TEST_SUITE
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
||||
// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
||||
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
||||
// is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
||||
// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
///////////////////////////////////////////
|
||||
|
||||
#include "model_test.h"
|
||||
#include "arch_test.h"
|
||||
|
||||
RVTEST_ISA("RV32I")
|
||||
// this test is blocked, it won't build or run. To unblock it remove the check ISA:=regex(BLOCKED);
|
||||
RVTEST_CASE(0,"//check ISA:=regex(.*32.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;def NO_SAIL=True",periph)
|
||||
|
||||
.section .text.init
|
||||
.globl rvtest_entry_point
|
||||
rvtest_entry_point:
|
||||
RVMODEL_BOOT
|
||||
RVTEST_CODE_BEGIN
|
||||
|
||||
# ---------------------------------------------------------------------------------------------
|
||||
j main_code
|
||||
# Thanks to MTVEC[1:0], trap handler addresses need to be aligned to a 4-byte boundary
|
||||
.align 2
|
||||
###################
|
||||
###################
|
||||
trap_handler: #####
|
||||
###################
|
||||
###################
|
||||
# save registers
|
||||
addi sp, sp, 0x28
|
||||
sw t0, 0x00(sp)
|
||||
sw t1, 0x08(sp)
|
||||
sw t2, 0x10(sp)
|
||||
sw t3, 0x18(sp)
|
||||
sw t4, 0x20(sp)
|
||||
|
||||
# ===================================
|
||||
# ===== Signature Output Format =====
|
||||
# ===================================
|
||||
#
|
||||
# Base address = <wally_signature>+0x40*<intr_num>
|
||||
# Use sigout-translator.py for help with this!
|
||||
#
|
||||
# <offset>: <contents>
|
||||
# 0x00: test ID = 0x<group_num>BEEF<intr_num>
|
||||
# 0x04: mcause (low) = 0x0000000B (MEIP) or 0x00000009 (SEIP)
|
||||
# 0x08: mcause (high) = 0x80000000
|
||||
# ----- If GPIO -----
|
||||
# 0x0C: claim ID = 3
|
||||
# 0x10: input_val
|
||||
# 0x14: output_val
|
||||
# 0x18: incoming rise_ip
|
||||
# 0x1C: serviced rise_ip = 0
|
||||
# 0x20: incoming fall_ip
|
||||
# 0x24: serviced fall_ip = 0
|
||||
# 0x28: incoming high_ip
|
||||
# 0x2C: serviced high_ip = 0
|
||||
# 0x30: incoming low_ip
|
||||
# 0x34: serviced low_ip = 0
|
||||
# ----- If UART -----
|
||||
# 0x0C: claim ID = 0xA
|
||||
# 0x10: IIR
|
||||
# 0x14: LSR
|
||||
# 0x18: LSR (after reading LSR)
|
||||
# 0x1C: RBR
|
||||
# 0x20: LSR (after reading RBR too)
|
||||
# 0x24: IIR (after reading everything else)
|
||||
# 0x28: SCR
|
||||
|
||||
# 0x00: test ID = 0x<group_num>BEEF<intr_num>
|
||||
la t0, wally_signature
|
||||
sub t0, s0, t0 # sigout offset
|
||||
srli t0, t0, 6 # intr_num
|
||||
add t0, t0, a1
|
||||
sw t0, 0x00(s0)
|
||||
|
||||
# 0x04: mcause (low) = 0x0000000B (MEIP) or 0x00000009 (SEIP)
|
||||
# 0x08: mcause (high) = 0x80000000
|
||||
csrrc t0, mcause, x0
|
||||
andi t1, t0, 0x7FF
|
||||
sw t0, 0x04(s0)
|
||||
//srli t0,t0,32
|
||||
sw x0, 0x08(s0)
|
||||
# MEIP or SEIP?
|
||||
# MEIP is on context 0
|
||||
li t4, 0x0C200004
|
||||
li t0, 0xB
|
||||
beq t1, t0, meip
|
||||
# SEIP is on context 1
|
||||
li t4, 0x0C201004
|
||||
meip:
|
||||
|
||||
# 0x0C: claim ID
|
||||
# 3: GPIO
|
||||
# A: UART
|
||||
mv t0, t4
|
||||
lw t1, 0(t0)
|
||||
sw t1, 0x0C(s0)
|
||||
li t2, 0xA
|
||||
beq t1, t2, uart_handler
|
||||
li t2, 3
|
||||
bne t1, t2, trap_handler_end
|
||||
|
||||
gpio_handler:
|
||||
# 0x10: input_val
|
||||
li t0, 0x10060000
|
||||
lw t1, 0x00(t0)
|
||||
sw t1, 0x10(s0)
|
||||
# 0x14: output_val
|
||||
lw t1, 0x0C(t0)
|
||||
sw t1, 0x14(s0)
|
||||
# 0x18: incoming rise_ip
|
||||
lw t1, 0x1C(t0)
|
||||
sw t1, 0x18(s0)
|
||||
# 0x1C: serviced rise_ip = 0
|
||||
sw t1, 0x1C(t0)
|
||||
lw t1, 0x1C(t0)
|
||||
sw t1, 0x1C(s0)
|
||||
# 0x20: incoming fall_ip
|
||||
lw t1, 0x24(t0)
|
||||
sw t1, 0x20(s0)
|
||||
# 0x24: serviced fall_ip = 0
|
||||
sw t1, 0x24(t0)
|
||||
lw t1, 0x24(t0)
|
||||
sw t1, 0x24(s0)
|
||||
# 0x28: incoming high_ip
|
||||
lw t1, 0x2C(t0)
|
||||
sw t1, 0x28(s0)
|
||||
# 0x2C: serviced high_ip = 0
|
||||
sw t1, 0x2C(t0)
|
||||
lw t1, 0x2C(t0)
|
||||
sw t1, 0x2C(s0)
|
||||
# 0x30: incoming low_ip
|
||||
lw t1, 0x34(t0)
|
||||
sw t1, 0x30(s0)
|
||||
# 0x34: serviced low_ip = 0
|
||||
sw t1, 0x34(t0)
|
||||
lw t1, 0x34(t0)
|
||||
sw t1, 0x34(s0)
|
||||
# disable high_ie and low_ie so interrupt
|
||||
# is not taken again immediately
|
||||
li t1, 0
|
||||
sw t1, 0x28(t0)
|
||||
sw t1, 0x30(t0)
|
||||
# signal to main code that gpio was serviced
|
||||
ori a0, a0, 0b00001000
|
||||
# signal to plic that gpio was serviced
|
||||
mv t0, t4
|
||||
li t1, 3
|
||||
sw t1, 0(t0)
|
||||
j trap_handler_end
|
||||
|
||||
uart_handler:
|
||||
# 0x10: IIR
|
||||
li t0, 0x10000000
|
||||
lbu t1, 2(t0)
|
||||
sw t1, 0x10(s0)
|
||||
# 0x14: LSR
|
||||
lbu t1, 5(t0)
|
||||
sw t1, 0x14(s0)
|
||||
# 0x18: LSR (after reading LSR)
|
||||
lbu t1, 5(t0)
|
||||
sw t1, 0x18(s0)
|
||||
# 0x1C: RBR
|
||||
lbu t1, 0(t0)
|
||||
sw t1, 0x1C(s0)
|
||||
# 0x20: LSR (after reading RBR)
|
||||
lbu t1, 5(t0)
|
||||
sw t1, 0x20(s0)
|
||||
# 0x24: IIR (after reading everything else)
|
||||
lbu t1, 2(t0)
|
||||
sw t1, 0x24(s0)
|
||||
# 0x28: SCR
|
||||
lbu t1, 7(t0)
|
||||
sw t1, 0x28(s0)
|
||||
# signal to main code that uart was serviced
|
||||
ori a0, a0, 0b00010000
|
||||
# signal to plic that uart was serviced
|
||||
mv t0, t4
|
||||
li t1, 0xA
|
||||
sw t1, 0(t0)
|
||||
|
||||
trap_handler_end:
|
||||
# increment signature pointer
|
||||
addi s0,s0,0x40
|
||||
# restore vars
|
||||
lw t0, 0x00(sp)
|
||||
lw t1, 0x08(sp)
|
||||
lw t2, 0x10(sp)
|
||||
lw t3, 0x18(sp)
|
||||
lw t4, 0x20(sp)
|
||||
addi sp, sp, SEXT_IMM(-0x28)
|
||||
mret
|
||||
|
||||
################
|
||||
################
|
||||
main_code: #####
|
||||
################
|
||||
################
|
||||
|
||||
##########################
|
||||
##### Initialization #####
|
||||
##########################
|
||||
# ========== Global Vars ==========
|
||||
la s0, wally_signature # signature output base adr
|
||||
la sp, stack # stack pointer
|
||||
li a0, 0 # interrupt complete flag
|
||||
# ========== Configure Privileged Unit ==========
|
||||
# load address of trap handler
|
||||
la t0, trap_handler
|
||||
csrrw x0, mtvec, t0
|
||||
# delegate all external interrupts to machine mode
|
||||
li t0, 0xD00
|
||||
csrrc x0, mideleg, t0
|
||||
# set MIE
|
||||
li t0, 0x8
|
||||
csrrs x0, mstatus, t0
|
||||
|
||||
##################################
|
||||
##### Test 1 - Signs of Life #####
|
||||
##################################
|
||||
li a1, 0x01beef00 # group ID
|
||||
# clear MEIE (good to turn off while configuring peripherals)
|
||||
li t0, 0x800
|
||||
csrrc x0, mie, t0
|
||||
# ========== Configure PLIC ==========
|
||||
# priority threshold = 0
|
||||
li t0, 0xC200000
|
||||
li t1, 0
|
||||
sw t1, 0(t0)
|
||||
# source 3 (GPIO) priority = 6
|
||||
li t0, 0xC000000
|
||||
li t1, 6
|
||||
sw t1, 0x0C(t0)
|
||||
# source 0xA (UART) priority = 7
|
||||
li t1, 7
|
||||
sw t1, 0x28(t0)
|
||||
# enable sources 3,0xA
|
||||
li t0, 0x0C002000
|
||||
li t1, 0b10000001000
|
||||
sw t1, 0(t0)
|
||||
# ========== Configure UART ==========
|
||||
# MCR: Loop = 1
|
||||
li t0, 0x10000000
|
||||
li t1, 0b10000
|
||||
sb t1, 4(t0)
|
||||
# LCR: Use 8 data bits plus odd parity bit
|
||||
li t1, 0b00001011
|
||||
sb t1, 3(t0)
|
||||
# IER: Enable Received Data Available Interrupt
|
||||
li t1, 0x01
|
||||
sb t1, 1(t0)
|
||||
# ========== Configure GPIO ==========
|
||||
# raise all input_en
|
||||
li t0, 0x10060000
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x04(t0)
|
||||
# raise all output_en
|
||||
sw t1, 0x08(t0)
|
||||
# raise all rise_en
|
||||
sw t1, 0x18(t0)
|
||||
# ========== Execute Test ==========
|
||||
# set MEIE
|
||||
li t0, 0x800
|
||||
csrrs x0, mie, t0
|
||||
Intr01BEEF00:
|
||||
# UART TX 'h'
|
||||
li t0, 0x10000000
|
||||
li t1, 'h'
|
||||
sb t1, 0(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
Intr01BEEF01:
|
||||
# GPIO raise pin 19
|
||||
li t0, 0x10060000
|
||||
li t1, 0x00080000
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# Now let's go bonkers and trigger both!
|
||||
Intr01BEEF02:
|
||||
# TX 'e'
|
||||
li t0, 0x10000000
|
||||
li t1, 'e'
|
||||
sb t1, 0(t0)
|
||||
Intr01BEEF03:
|
||||
# GPIO lower pin 19 raise pin 0
|
||||
li t0, 0x10060000
|
||||
li t1, 0x00000001
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00011000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
|
||||
##################################
|
||||
##### Test 2 - GPIO Testing #####
|
||||
##################################
|
||||
li a1, 0x02beef00 # group ID
|
||||
# clear MEIE
|
||||
li t0, 0x800
|
||||
csrrc x0, mie, t0
|
||||
# ========== Configure PLIC ==========
|
||||
# priority threshold = 0
|
||||
li t0, 0xC200000
|
||||
li t1, 0
|
||||
sw t1, 0(t0)
|
||||
# source 3 (GPIO) priority = 1
|
||||
li t0, 0xC000000
|
||||
li t1, 1
|
||||
sw t1, 0x0C(t0)
|
||||
# enable source 3
|
||||
li t0, 0x0C002000
|
||||
li t1, 0b1000
|
||||
sw t1, 0(t0)
|
||||
# ========== Input Enables ==========
|
||||
# Note that this inherits
|
||||
# a bit of state from the previous test.
|
||||
# Namely output_val = 0x00000001
|
||||
#
|
||||
# enable some inputs
|
||||
li t0, 0x10060000
|
||||
li t1, 0x0000FFFF
|
||||
sw t1, 0x04(t0)
|
||||
# enable all outputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x08(t0)
|
||||
# enable all rising edge interrupts
|
||||
sw t1, 0x18(t0)
|
||||
# set MEIE
|
||||
li t1, 0x800
|
||||
csrrs x0, mie, t1
|
||||
# raise some input-disabled pins
|
||||
# interrupt should not happen
|
||||
li t1, 0xF0F00001
|
||||
sw t1, 0x0C(t0)
|
||||
Intr02BEEF04:
|
||||
# change some input-enabled pins
|
||||
# interrupt should happen
|
||||
li t1, 0x3030F0F0
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
Intr02BEEF05:
|
||||
# enable some different inputs
|
||||
# this itself will cause some rise interrupts
|
||||
li t1, 0xFFFF0000
|
||||
sw t1, 0x04(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# ========== Output Enables ==========
|
||||
# enable all fall interrupts
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x20(t0)
|
||||
Intr02BEEF06:
|
||||
# disable some outputs
|
||||
# should affect input value but not output val register itself
|
||||
# this itself will cause some fall interrupts
|
||||
li t1, 0xFF0000FF
|
||||
sw t1, 0x08(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# change pins whose inputs and/or outputs are disabled
|
||||
# should not cause any rise or fall interrupts
|
||||
li t1, 0x300F0F0F
|
||||
sw t1, 0x0C(t0)
|
||||
Intr02BEEF07:
|
||||
# change pins whose inputs and outputs are enabled
|
||||
li t1, 0x0F0F0F0F
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# ========== Clear GPIO State ==========
|
||||
# (I've gotten a little annoyed with tests depending
|
||||
# upon the results of previous tests).
|
||||
# disable all interrupts
|
||||
sw x0, 0x18(t0)
|
||||
sw x0, 0x20(t0)
|
||||
sw x0, 0x28(t0)
|
||||
sw x0, 0x30(t0)
|
||||
# enable all inputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x04(t0)
|
||||
# enable all outputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x08(t0)
|
||||
# set initial output state
|
||||
sw x0, 0x0C(t0)
|
||||
# clear all pending interrupts
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x1C(t0)
|
||||
sw t1, 0x24(t0)
|
||||
sw t1, 0x2C(t0)
|
||||
sw t1, 0x34(t0)
|
||||
# ========== Rise Interrupt Enables ==========
|
||||
# enable some rising edge interrupts
|
||||
li t1, 0x0000FFFF
|
||||
sw t1, 0x18(t0)
|
||||
Intr02BEEF08:
|
||||
# raise some pins
|
||||
li t1, 0x00FFFF00
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
Intr02BEEF09:
|
||||
# raise pins whose rise IEs are disabled
|
||||
# should not cause an interrupt
|
||||
li t1, 0x33FFFF00
|
||||
sw t1, 0x0C(t0)
|
||||
# raise pins whose rise IEs are enabled
|
||||
li t1, 0x33FFFF33
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# =========== Fall Interrupts ===========
|
||||
# (admittedly these are already used elsewhere)
|
||||
# disable all rising edge interrupts
|
||||
li t1, 0
|
||||
sw t1, 0x18(t0)
|
||||
# enable some falling edge interrupts
|
||||
li t1, 0x0000FFFF
|
||||
sw t1, 0x20(t0)
|
||||
Intr02BEEF0A:
|
||||
# lower some pins
|
||||
li t1, 0x33000033
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# lower pins whose fall IEs are disabled
|
||||
# and raise a bunch of other pins
|
||||
# should not cause an interrupt
|
||||
li t1, 0x00CCCC33
|
||||
sw t1, 0x0C(t0)
|
||||
Intr02BEEF0B:
|
||||
# lower pins whose fall IEs are enabled
|
||||
li t1, 0x00CCCC00
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# =========== High Interrupts ===========
|
||||
# disable all falling edge interrupts
|
||||
li t1, 0
|
||||
sw t1, 0x20(t0)
|
||||
# enable some high_ie's for low pins
|
||||
# should not cause an interrupt
|
||||
li t1, 0xFF0000FF
|
||||
sw t1, 0x28(t0)
|
||||
Intr02BEEF0C:
|
||||
# enable some high_ie's for high pins
|
||||
li t1, 0x0000FFFF
|
||||
sw t1, 0x28(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# lower all pins
|
||||
li t1, 0
|
||||
sw t1, 0x0C(t0)
|
||||
# lower any existing high_ip's
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x2C(t0)
|
||||
# re-enable some high_ie's
|
||||
li t1, 0xFFFF0000
|
||||
sw t1, 0x28(t0)
|
||||
# raise some pins whose high_ie's are disabled
|
||||
li t1, 0x0000CCCC
|
||||
sw t1, 0x0C(t0)
|
||||
# disable some inputs
|
||||
li t1, 0xFF00FFFF
|
||||
sw t1, 0x04(t0)
|
||||
# raise some pins whose inputs are disabled
|
||||
li t1, 0x00CCCCCC
|
||||
sw t1, 0x0C(t0)
|
||||
Intr02BEEF0D:
|
||||
# raise some pins whose high_ie's and inputs are enabled
|
||||
li t1, 0xCCCCCCCC
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# =========== Low Interrupts ===========
|
||||
# disable all high interrupts
|
||||
li t1, 0
|
||||
sw t1, 0x28(t0)
|
||||
# enable all inputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x04(t0)
|
||||
# enable some low_ie's for high pins
|
||||
# should not cause an interrupt
|
||||
li t1, 0xCC0000CC
|
||||
sw t1, 0x30(t0)
|
||||
Intr02BEEF0E:
|
||||
# enable some low_ie's for low pins
|
||||
li t1, 0xCCCCFFFF
|
||||
sw t1, 0x30(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# raise all pins
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x0C(t0)
|
||||
# lower any existing low_ip's
|
||||
# actually takes a little time for vals
|
||||
# to propagate through synchronizer
|
||||
# so this extra load is a nop effectively
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x34(t0)
|
||||
# re-enable some low_ie's
|
||||
li t1, 0xFF0000FF
|
||||
sw t1, 0x30(t0)
|
||||
# lower some pins whose low_ie's are disabled
|
||||
li t1, 0xFF1111FF
|
||||
sw t1, 0x0C(t0)
|
||||
Intr02BEEF0F:
|
||||
# disable some inputs of pins whose low_ie's are enabled
|
||||
li t1, 0x0000FFFF
|
||||
sw t1, 0x04(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# ========== Clear GPIO State ==========
|
||||
# disable all interrupts
|
||||
sw x0, 0x18(t0)
|
||||
sw x0, 0x20(t0)
|
||||
sw x0, 0x28(t0)
|
||||
sw x0, 0x30(t0)
|
||||
# enable all inputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x04(t0)
|
||||
# enable all outputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x08(t0)
|
||||
# set initial output state
|
||||
sw x0, 0x0C(t0)
|
||||
# clear all pending interrupts
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x1C(t0)
|
||||
sw t1, 0x24(t0)
|
||||
sw t1, 0x2C(t0)
|
||||
sw t1, 0x34(t0)
|
||||
# ========== Output XOR Test ==========
|
||||
# enable some inputs
|
||||
li t1, 0x0000FFFF
|
||||
sw t1, 0x04(t0)
|
||||
# enable some outputs
|
||||
li t1, 0xFF0000FF
|
||||
sw t1, 0x08(t0)
|
||||
# enable all rising and falling edge interrupts
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x18(t0)
|
||||
sw t1, 0x20(t0)
|
||||
Intr02BEEF10:
|
||||
# XOR all outputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x40(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
Intr02BEEF11:
|
||||
# XOR some outputs
|
||||
li t1, 0x33333333
|
||||
sw t1, 0x40(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# ========== Clear GPIO State ==========
|
||||
# disable all interrupts
|
||||
sw x0, 0x18(t0)
|
||||
sw x0, 0x20(t0)
|
||||
sw x0, 0x28(t0)
|
||||
sw x0, 0x30(t0)
|
||||
# enable all inputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x04(t0)
|
||||
# enable all outputs
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x08(t0)
|
||||
# set initial output state
|
||||
sw x0, 0x0C(t0)
|
||||
# clear XOR
|
||||
li t1, 0x00000000
|
||||
sw t1, 0x40(t0)
|
||||
# clear all pending interrupts
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x1C(t0)
|
||||
sw t1, 0x24(t0)
|
||||
sw t1, 0x2C(t0)
|
||||
sw t1, 0x34(t0)
|
||||
|
||||
##################################
|
||||
##### Test 3 - UART Testing #####
|
||||
##################################
|
||||
li a1, 0x03beef00 # group ID
|
||||
# clear MEIE
|
||||
li t0, 0x800
|
||||
csrrc x0, mie, t0
|
||||
# ========== Configure PLIC ==========
|
||||
# priority threshold = 0
|
||||
li t0, 0xC200000
|
||||
li t1, 0
|
||||
sw t1, 0(t0)
|
||||
# source 0xA (UART) priority = 1
|
||||
li t0, 0xC000000
|
||||
li t1, 1
|
||||
sw t1, 0x28(t0)
|
||||
# enable source 0xA
|
||||
li t0, 0x0C002000
|
||||
li t1, 0b10000000000
|
||||
sw t1, 0(t0)
|
||||
# ========== Transmitter Holding Register Empty Interrupt (THRE) ==========
|
||||
# MCR: Loop = 1
|
||||
li t0, 0x10000000
|
||||
li t1, 0b00010000
|
||||
sb t1, 4(t0)
|
||||
# LCR: Use 8 data bits plus odd parity bit
|
||||
li t1, 0b00001011
|
||||
sb t1, 3(t0)
|
||||
# IER: Disable all interrupts for now
|
||||
li t1, 0x0
|
||||
sb t1, 1(t0)
|
||||
# set MEIE
|
||||
li t1, 0x800
|
||||
csrrs x0, mie, t1
|
||||
# THR: TX 'l'
|
||||
li t1, 'l'
|
||||
sb t1, 0(t0)
|
||||
# wait directly on UART for completion
|
||||
li t1, 0b01100001
|
||||
1: lb t2, 5(t0)
|
||||
bne t1, t2, 1b
|
||||
Intr03BEEF12:
|
||||
# IER: enable THR empty intr (ETBEI)
|
||||
li t1, 0b00000010
|
||||
sb t1, 1(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# IER: disable THR empty intr (ETBEI)
|
||||
sb x0, 1(t0)
|
||||
# THR: TX 'l'
|
||||
li t1, 'l'
|
||||
sb t1, 0(t0)
|
||||
# THR: TX 'o'
|
||||
li t1, 'o'
|
||||
sb t1, 0(t0)
|
||||
Intr03BEEF13:
|
||||
# IER: enable THR empty intr (ETBEI)
|
||||
li t1, 0b00000010
|
||||
sb t1, 1(t0)
|
||||
# This will take a few cycles before UART finishes TX'ing
|
||||
# If we see SCR modifications in output, it means UART probably
|
||||
# did wait until empty THR before triggering the interrupt.
|
||||
sb t1, 7(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# ========== Received Data Available Intrrupt (ERBFI) & Loop Mode ==========
|
||||
# Clear SCR
|
||||
sb x0, 7(t0)
|
||||
Intr03BEEF14:
|
||||
# IER: enable RBR ready intr ERBFI
|
||||
li t1, 0x1
|
||||
sb t1, 1(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
Intr03BEEF15:
|
||||
# THR: TX ' '
|
||||
li t1, 0x20
|
||||
sb t1, 0(t0)
|
||||
# This will take a few cycles before UART finishes RX'ing
|
||||
# If we see SCR modifications in output, it means UART probably
|
||||
# did wait until received data available before triggering the interrupt.
|
||||
li t1, 3
|
||||
sb t1, 7(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
Intr03BEEF16:
|
||||
# THR: TX 't'
|
||||
li t1, 't'
|
||||
sb t1, 0(t0)
|
||||
# Same shenanigans as before, only now we also confirm
|
||||
# that you can read the RBR before new data is available
|
||||
# without messing up the receive interrupt.
|
||||
lb t1, 0(t0)
|
||||
sb t1, 7(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# MCR: Loop = 0
|
||||
li t1, 0b00000000
|
||||
sb t1, 4(t0)
|
||||
# Clear SCR
|
||||
sb x0, 7(t0)
|
||||
# THR: TX 'h'
|
||||
# should TX but not not trigger interrupt
|
||||
li t1, 'h'
|
||||
sb t1, 0(t0)
|
||||
# wait directly on UART for completion
|
||||
li t1, 0b01100000
|
||||
1: lb t2, 5(t0)
|
||||
bne t1, t2, 1b
|
||||
# Can use THRE test from before to verify we are transmitting
|
||||
# THR: TX 'e'
|
||||
li t1, 'e'
|
||||
sb t1, 0(t0)
|
||||
# THR: TX 'r'
|
||||
li t1, 'r'
|
||||
sb t1, 0(t0)
|
||||
Intr03BEEF17:
|
||||
# IER: enable THR empty intr (ETBEI) and RBR ready intr (ERBFI)
|
||||
li t1, 0b00000011
|
||||
sb t1, 1(t0)
|
||||
sb t1, 7(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# manually wait until transmitter finishes before enabling loop mode
|
||||
li t1, 0b01100000
|
||||
1: lb t2, 5(t0)
|
||||
bne t1, t2, 1b
|
||||
# MCR: Loop = 1
|
||||
li t1, 0b00010000
|
||||
sb t1, 4(t0)
|
||||
Intr03BEEF18:
|
||||
Intr03BEEF19:
|
||||
# THR: TX 'e'
|
||||
li t1, 'e'
|
||||
sb t1, 0(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# wait to finish again
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# ========== Receiver Line Status Intr (ELSI) & Overrun Error (OE) ==========
|
||||
# IER: Enable Receiver Line Status Intr (ELSI)
|
||||
li t1, 0b00000100
|
||||
sb t1, 1(t0)
|
||||
li t1, 0xFF
|
||||
sb t1, 7(t0)
|
||||
# We can't cause all kinds of interesting errors, but at least we can
|
||||
# cause an overrun error by transmitting twice without reading.
|
||||
Intr03BEEF1A:
|
||||
# THR: TX '\n'
|
||||
li t1, 0xD
|
||||
sb t1, 0(t0)
|
||||
# THR: TX 'G'
|
||||
li t1, 'G'
|
||||
sb t1, 0(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
|
||||
####################################################
|
||||
##### Test 4 - Signs of Life on PLIC Context 1 #####
|
||||
####################################################
|
||||
li a1, 0x04beef00 # group ID
|
||||
# clear MEIE (good to turn off while configuring peripherals)
|
||||
li t0, 0x800
|
||||
csrrc x0, mie, t0
|
||||
# ========== Configure PLIC ==========
|
||||
# priority threshold = 0
|
||||
li t0, 0xC200000
|
||||
li t1, 0
|
||||
sw t1, 0(t0)
|
||||
# source 3 (GPIO) priority = 6
|
||||
li t0, 0xC000000
|
||||
li t1, 6
|
||||
sw t1, 0x0C(t0)
|
||||
# source 0xA (UART) priority = 7
|
||||
li t1, 7
|
||||
sw t1, 0x28(t0)
|
||||
# disable sources 3,0xA on context 0
|
||||
li t0, 0x0C002000
|
||||
li t1, 0
|
||||
sw t1, 0(t0)
|
||||
# enable sources 3,0xA on context 1
|
||||
li t0, 0x0C002080
|
||||
li t1, 0b10000001000
|
||||
sw t1, 0(t0)
|
||||
# ========== Configure UART ==========
|
||||
# MCR: Loop = 1
|
||||
li t0, 0x10000000
|
||||
li t1, 0b10000
|
||||
sb t1, 4(t0)
|
||||
# LCR: Use 8 data bits plus odd parity bit
|
||||
li t1, 0b00001011
|
||||
sb t1, 3(t0)
|
||||
# IER: Enable Received Data Available Interrupt
|
||||
li t1, 0x01
|
||||
sb t1, 1(t0)
|
||||
# ========== Configure GPIO ==========
|
||||
# raise all input_en
|
||||
li t0, 0x10060000
|
||||
li t1, 0xFFFFFFFF
|
||||
sw t1, 0x04(t0)
|
||||
# raise all output_en
|
||||
sw t1, 0x08(t0)
|
||||
# raise all rise_en
|
||||
sw t1, 0x18(t0)
|
||||
# ========== Execute Test ==========
|
||||
# set MEIE and SEIE
|
||||
li t0, 0xA00
|
||||
csrrs x0, mie, t0
|
||||
Intr04BEEF1B:
|
||||
# UART TX 'e'
|
||||
li t0, 0x10000000
|
||||
li t1, 'e'
|
||||
sb t1, 0(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00010000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
Intr04BEEF1C:
|
||||
# GPIO raise pin 19
|
||||
li t0, 0x10060000
|
||||
li t1, 0x00080000
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00001000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# Now let's go bonkers and trigger both!
|
||||
Intr04BEEF1D:
|
||||
# TX 'n'
|
||||
li t0, 0x10000000
|
||||
li t1, 'n'
|
||||
sb t1, 0(t0)
|
||||
Intr04BEEF1E:
|
||||
# GPIO lower pin 19 raise pin 0
|
||||
li t0, 0x10060000
|
||||
li t1, 0x00000001
|
||||
sw t1, 0x0C(t0)
|
||||
# wait to finish
|
||||
li t1, 0b00011000
|
||||
1: bne t1,a0,1b
|
||||
li a0, 0
|
||||
# ---------------------------------------------------------------------------------------------
|
||||
|
||||
//terminate_test:
|
||||
// li a0, 2 // Trap handler behavior (go to machine mode)
|
||||
// ecall // writes mcause to the output.
|
||||
// csrw mtvec, x4 // restore original trap handler to halt program
|
||||
|
||||
RVTEST_CODE_END
|
||||
RVMODEL_HALT
|
||||
|
||||
RVTEST_DATA_BEGIN
|
||||
# stack memory (size 16 words)
|
||||
.align 3
|
||||
stack:
|
||||
.fill 16, 8, 0xdeadbeef
|
||||
#ifdef rvtest_mtrap_routine
|
||||
mtrap_sigptr:
|
||||
.fill 64*(XLEN/32),4,0xdeadbeef
|
||||
#endif
|
||||
|
||||
#ifdef rvtest_gpr_save
|
||||
gpr_save:
|
||||
.fill 32*(XLEN/32),4,0xdeadbeef
|
||||
#endif
|
||||
RVTEST_DATA_END
|
||||
|
||||
RVMODEL_DATA_BEGIN
|
||||
# signature output
|
||||
wally_signature:
|
||||
.fill 0x200, 8, 0x00000000
|
||||
RVMODEL_DATA_END
|
@ -0,0 +1,51 @@
|
||||
///////////////////////////////////////////
|
||||
//
|
||||
// WALLY-MMU
|
||||
//
|
||||
// Author: Kip Macsai-Goren <kmacsaigoren@hmc.edu>
|
||||
//
|
||||
// Created 2022-11-18
|
||||
//
|
||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
||||
// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
||||
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
||||
// is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
||||
// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
///////////////////////////////////////////
|
||||
|
||||
#include "WALLY-TEST-LIB-32.h"
|
||||
RVTEST_ISA("RV32I")
|
||||
RVTEST_CASE(0,"//check ISA:=regex(.*32.*);check ISA:=regex(.*I.*); def Drvtest_mtrap_routine=True; def TEST_CASE_1=True;",satp-invalid)
|
||||
|
||||
INIT_TESTS
|
||||
|
||||
TRAP_HANDLER m
|
||||
|
||||
la t4, pre_trap
|
||||
csrw mtvec, t4 // set the new trap handler to do the pre behavior first.
|
||||
|
||||
GOTO_S_MODE // go to S mode to attempt to turn on virtual memory
|
||||
|
||||
la ra, post_satp // load the address after the failing adress into ra so it doesn't get confused
|
||||
GOTO_SV32 0x0, 0x0 // attempt to turn on virtual memory with satp pointing to an invlaid address. Should cause invalid instruction exception
|
||||
|
||||
post_satp:
|
||||
j test_end
|
||||
|
||||
pre_trap:
|
||||
csrwi satp, 0x0 // zero out the satp, turning off virtual memory with incorrect address, then jumping to the normal trap handler.
|
||||
j trap_handler_m
|
||||
|
||||
test_end:
|
||||
|
||||
END_TESTS
|
||||
|
||||
TEST_STACK_AND_DATA
|
Loading…
Reference in New Issue
Block a user