From 2001632142a11d9a940eee7e3bfbe7c0186fe6ce Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Mon, 2 May 2016 14:30:48 -0700 Subject: Don't use tohost/fromhost registers; communicate with host via memory --- machine/mentry.S | 14 +++----------- machine/mtrap.c | 31 ++++++++++++++++++------------- 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 #include +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) -- cgit v1.1