summaryrefslogtreecommitdiff
path: root/assembly
diff options
context:
space:
mode:
authorcheapie <cheapiephp@gmail.com>2026-11-08 07:38:17 -0600
committercheapie <cheapiephp@gmail.com>2026-11-08 07:38:17 -0600
commitf8cc0d73afe12cc1c8dd1600a28ff4634decf617 (patch)
tree035cc4c5b466c98fb2940c48af79389d43ab4994 /assembly
parent71729845170cdb4380f1ae42708638fdaee997cb (diff)
downloadrvcontroller-f8cc0d73afe12cc1c8dd1600a28ff4634decf617.tar
rvcontroller-f8cc0d73afe12cc1c8dd1600a28ff4634decf617.tar.gz
rvcontroller-f8cc0d73afe12cc1c8dd1600a28ff4634decf617.tar.bz2
rvcontroller-f8cc0d73afe12cc1c8dd1600a28ff4634decf617.tar.xz
rvcontroller-f8cc0d73afe12cc1c8dd1600a28ff4634decf617.zip
Add Smrnmi
Diffstat (limited to 'assembly')
-rw-r--r--assembly/crosswalk/crosswalk.S1
-rw-r--r--assembly/multitask/multitask.S1
-rw-r--r--assembly/rrxing2/rrxing2.S19
3 files changed, 20 insertions, 1 deletions
diff --git a/assembly/crosswalk/crosswalk.S b/assembly/crosswalk/crosswalk.S
index 86a0813..4baeaa8 100644
--- a/assembly/crosswalk/crosswalk.S
+++ b/assembly/crosswalk/crosswalk.S
@@ -1,3 +1,4 @@
+csrsi mnstatus,8 # Set NMIE so that interrupts can work (not actually setting up a real NMI handler)
la t0,handler
csrw mtvec,t0 # Set up trap handler
li t0,0x400
diff --git a/assembly/multitask/multitask.S b/assembly/multitask/multitask.S
index e46dd81..29df46c 100644
--- a/assembly/multitask/multitask.S
+++ b/assembly/multitask/multitask.S
@@ -1,3 +1,4 @@
+csrsi mnstatus,8 # Set NMIE so that interrupts can work (not actually setting up a real NMI handler)
la t0,handler
csrw mtvec,t0 # Set trap handler address and mode (0/direct)
li t0,0x400
diff --git a/assembly/rrxing2/rrxing2.S b/assembly/rrxing2/rrxing2.S
index c94edc0..bb2c4dc 100644
--- a/assembly/rrxing2/rrxing2.S
+++ b/assembly/rrxing2/rrxing2.S
@@ -8,6 +8,9 @@ j _start
.include "util.S"
_start:
+la t0,nmihandler
+csrw 0xbc0,t0 # Set up RNMI handler
+csrsi mnstatus,8 # Turn on NMIE
li t0,0x400
csrs mseccfg,t0 # Turn on MLPE (enable Zicfilp)
li sp,0x10000 # Set up stack pointer
@@ -187,6 +190,19 @@ ecall # Tell the user
li a7,10
ecall # Then halt
+.align 2
+nmihandler:
+li a7,4
+la a0,uinmi
+ecall # Display NMI message
+
+csrr a0,mncause # Read what the cause was
+li a7,1
+ecall # Tell the user
+
+li a7,10
+ecall # Then halt
+
states: .word destate0,destate1,destate2,destate3,destate4,destate5,destate6,0,0,0,0,0,0,0,0,0
.word ukstate0,ukstate1,ukstate2,ukstate3,ukstate4,ukstate5,ukstate6,ukstate7,0,0,0,0,0,0,0,0
.word usstate0,usstate1,usstate2,usstate3,usstate4,0,0,0,0,0,0,0,0,0,0,0
@@ -364,7 +380,8 @@ activetime: .byte 15
extensiontime: .byte 25
traincounter: .word 0
-uiunimplementedtrap: .asciz "Unimplemented trap!\nmcause: "
+uiunimplementedtrap: .asciz "\nUnimplemented trap!\nmcause: "
+uinmi: .asciz "\nUnexpected NMI!\nmncause: "
channelbuf: .skip 16
msgbuf: .skip 16
lightchannel: .asciz "light"