aboutsummaryrefslogtreecommitdiff
path: root/machine/mtrap.c
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2016-05-02 14:30:48 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2016-05-02 14:30:48 -0700
commit2001632142a11d9a940eee7e3bfbe7c0186fe6ce (patch)
treec4128fd12cc967332cfb956d5a291923ef078036 /machine/mtrap.c
parent06dfae8a04c1fb51416472e6e29ec3e926b6cf9b (diff)
downloadriscv-pk-2001632142a11d9a940eee7e3bfbe7c0186fe6ce.zip
riscv-pk-2001632142a11d9a940eee7e3bfbe7c0186fe6ce.tar.gz
riscv-pk-2001632142a11d9a940eee7e3bfbe7c0186fe6ce.tar.bz2
Don't use tohost/fromhost registers; communicate with host via memory
Diffstat (limited to 'machine/mtrap.c')
-rw-r--r--machine/mtrap.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/machine/mtrap.c b/machine/mtrap.c
index 4087a67..15ecf8f 100644
--- a/machine/mtrap.c
+++ b/machine/mtrap.c
@@ -7,6 +7,9 @@
#include <stdarg.h>
#include <stdio.h>
+volatile uint64_t tohost __attribute__((aligned(64)));
+volatile uint64_t fromhost __attribute__((aligned(64)));
+
void __attribute__((noreturn)) bad_trap()
{
die("machine mode: unhandlable trap %d @ %p", read_csr(mcause), read_csr(mepc));
@@ -19,31 +22,33 @@ static uintptr_t mcall_hart_id()
static void request_htif_keyboard_interrupt()
{
- uintptr_t old_tohost = swap_csr(mtohost, TOHOST_CMD(1, 0, 0));
- assert(old_tohost == 0);
+ assert(tohost == 0);
+ tohost = TOHOST_CMD(1, 0, 0);
}
-void htif_interrupt()
+static void htif_interrupt()
{
- uintptr_t fromhost = swap_csr(mfromhost, 0);
// we should only be interrupted by keypresses
- if (!(FROMHOST_DEV(fromhost) == 1 && FROMHOST_CMD(fromhost) == 0))
+ uint64_t fh = fromhost;
+ if (!(FROMHOST_DEV(fh) == 1 && FROMHOST_CMD(fh) == 0))
die("unexpected htif interrupt");
- HLS()->console_ibuf = 1 + (uint8_t)FROMHOST_DATA(fromhost);
+ HLS()->console_ibuf = 1 + (uint8_t)FROMHOST_DATA(fh);
+ fromhost = 0;
set_csr(mip, MIP_SSIP);
}
static void do_tohost_fromhost(uintptr_t dev, uintptr_t cmd, uintptr_t data)
{
- while (swap_csr(mtohost, TOHOST_CMD(dev, cmd, data)) != 0)
- if (read_csr(mfromhost))
+ while (tohost)
+ if (fromhost)
htif_interrupt();
+ tohost = TOHOST_CMD(dev, cmd, data);
while (1) {
- uintptr_t fromhost = read_csr(mfromhost);
- if (fromhost) {
- if (FROMHOST_DEV(fromhost) == dev && FROMHOST_CMD(fromhost) == cmd) {
- write_csr(mfromhost, 0);
+ uint64_t fh = fromhost;
+ if (fh) {
+ if (FROMHOST_DEV(fh) == dev && FROMHOST_CMD(fh) == cmd) {
+ fromhost = 0;
break;
}
htif_interrupt();
@@ -66,7 +71,7 @@ static uintptr_t mcall_htif_syscall(uintptr_t magic_mem)
void poweroff()
{
while (1)
- write_csr(mtohost, 1);
+ tohost = 1;
}
void putstring(const char* s)