aboutsummaryrefslogtreecommitdiff
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
parent06dfae8a04c1fb51416472e6e29ec3e926b6cf9b (diff)
downloadpk-2001632142a11d9a940eee7e3bfbe7c0186fe6ce.zip
pk-2001632142a11d9a940eee7e3bfbe7c0186fe6ce.tar.gz
pk-2001632142a11d9a940eee7e3bfbe7c0186fe6ce.tar.bz2
Don't use tohost/fromhost registers; communicate with host via memory
-rw-r--r--machine/mentry.S14
-rw-r--r--machine/mtrap.c31
2 files changed, 21 insertions, 24 deletions
diff --git a/machine/mentry.S b/machine/mentry.S
index bbc1c2a..4895227 100644
--- a/machine/mentry.S
+++ b/machine/mentry.S
@@ -18,11 +18,9 @@ trap_table:
.word mcall_trap
.word bad_trap
.word bad_trap
-#define HTIF_INTERRUPT_VECTOR 12
- .word htif_interrupt
-#define SOFTWARE_INTERRUPT_VECTOR 13
+#define SOFTWARE_INTERRUPT_VECTOR 12
.word software_interrupt
-#define TRAP_FROM_MACHINE_MODE_VECTOR 14
+#define TRAP_FROM_MACHINE_MODE_VECTOR 13
.word __trap_from_machine_mode
.option norvc
@@ -67,16 +65,10 @@ trap_vector:
1:
# Is it an IPI?
li a0, IRQ_M_SOFT * 2
- bne a0, a1, 1f
+ bne a0, a1, .Lunhandleable_trap
li a1, SOFTWARE_INTERRUPT_VECTOR
j .Lhandle_trap_in_machine_mode
-1:
- # By process of elimination, it must be an HTIF interrupt.
- li a0, IRQ_HOST * 2
- bne a0, a1, .Lunhandleable_trap
- li a1, HTIF_INTERRUPT_VECTOR
-
.Lhandle_trap_in_machine_mode:
# Preserve the registers. Compute the address of the trap handler.
STORE ra, 1*REGBYTES(sp)
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)