aboutsummaryrefslogtreecommitdiff
path: root/pk/mtrap.c
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-05-09 16:17:11 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-05-09 16:41:10 -0700
commit1a8572a47db3151323ec390c430da37d831fc962 (patch)
tree0e84071d505a875c874460a7d036ff9aa4b8931a /pk/mtrap.c
parentac7853a1bc5fcbee820a4f1472aa59eaf074e4e9 (diff)
downloadpk-1a8572a47db3151323ec390c430da37d831fc962.zip
pk-1a8572a47db3151323ec390c430da37d831fc962.tar.gz
pk-1a8572a47db3151323ec390c430da37d831fc962.tar.bz2
Upgrade to privileged architecture 1.7
Diffstat (limited to 'pk/mtrap.c')
-rw-r--r--pk/mtrap.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/pk/mtrap.c b/pk/mtrap.c
index 1cb432f..3406c44 100644
--- a/pk/mtrap.c
+++ b/pk/mtrap.c
@@ -63,7 +63,7 @@ void __attribute__((noreturn)) bad_trap()
uintptr_t htif_interrupt(uintptr_t mcause, uintptr_t* regs)
{
- uintptr_t fromhost = swap_csr(fromhost, 0);
+ uintptr_t fromhost = swap_csr(mfromhost, 0);
if (!fromhost)
return 0;
@@ -98,7 +98,7 @@ uintptr_t htif_interrupt(uintptr_t mcause, uintptr_t* regs)
MAILBOX()->device_response_queue_tail = m;
// signal software interrupt
- set_csr(mstatus, MSTATUS_SSIP);
+ set_csr(mip, MIP_SSIP);
return 0;
}
@@ -111,15 +111,15 @@ uintptr_t htif_interrupt(uintptr_t mcause, uintptr_t* regs)
static uintptr_t mcall_console_putchar(uint8_t ch)
{
- while (swap_csr(tohost, TOHOST_CMD(1, 1, ch)) != 0);
+ while (swap_csr(mtohost, TOHOST_CMD(1, 1, ch)) != 0);
while (1) {
- uintptr_t fromhost = read_csr(fromhost);
+ uintptr_t fromhost = read_csr(mfromhost);
if (FROMHOST_DEV(fromhost) != 1 || FROMHOST_CMD(fromhost) != 1) {
if (fromhost)
htif_interrupt(0, 0);
continue;
}
- write_csr(fromhost, 0);
+ write_csr(mfromhost, 0);
break;
}
return 0;
@@ -132,9 +132,6 @@ static uintptr_t mcall_console_putchar(uint8_t ch)
static uintptr_t mcall_dev_req(sbi_device_message *m)
{
//printm("req %d %p\n", MAILBOX()->device_request_queue_size, m);
-#ifndef __riscv64
- return -ENOSYS; // TODO: RV32 HTIF?
-#else
if (!supervisor_paddr_valid(m, sizeof(*m))
&& EXTRACT_FIELD(read_csr(mstatus), MSTATUS_PRV1) != PRV_M)
return -EFAULT;
@@ -142,7 +139,7 @@ static uintptr_t mcall_dev_req(sbi_device_message *m)
if ((m->dev > 0xFFU) | (m->cmd > 0xFFU) | (m->data > 0x0000FFFFFFFFFFFFU))
return -EINVAL;
- while (swap_csr(tohost, TOHOST_CMD(m->dev, m->cmd, m->data)) != 0)
+ while (swap_csr(mtohost, TOHOST_CMD(m->dev, m->cmd, m->data)) != 0)
;
m->sbi_private_data = (uintptr_t)MAILBOX()->device_request_queue_head;
@@ -150,7 +147,6 @@ static uintptr_t mcall_dev_req(sbi_device_message *m)
MAILBOX()->device_request_queue_size++;
return 0;
-#endif
}
static uintptr_t mcall_dev_resp()
@@ -168,11 +164,16 @@ static uintptr_t mcall_dev_resp()
return (uintptr_t)m;
}
-uintptr_t mcall_trap(uintptr_t mcause, uintptr_t* regs)
+static uintptr_t mcall_send_ipi(uintptr_t recipient)
{
- if (EXTRACT_FIELD(read_csr(mstatus), MSTATUS_PRV1) < PRV_S)
+ if (recipient >= num_harts)
return -1;
+ write_csr(send_ipi, recipient);
+ return 0;
+}
+uintptr_t mcall_trap(uintptr_t mcause, uintptr_t* regs)
+{
uintptr_t n = regs[10], arg0 = regs[11], retval;
switch (n)
{
@@ -188,6 +189,9 @@ uintptr_t mcall_trap(uintptr_t mcause, uintptr_t* regs)
case MCALL_RECEIVE_DEVICE_RESPONSE:
retval = mcall_dev_resp();
break;
+ case MCALL_SEND_IPI:
+ retval = mcall_send_ipi(arg0);
+ break;
default:
retval = -ENOSYS;
break;
@@ -222,12 +226,6 @@ static uintptr_t machine_page_fault(uintptr_t mcause, uintptr_t* regs, uintptr_t
static uintptr_t machine_illegal_instruction(uintptr_t mcause, uintptr_t* regs, uintptr_t mepc)
{
- extern void test_fpu_presence();
- if (mepc == (uintptr_t)&test_fpu_presence) {
- regs[10] = 0;
- write_csr(mepc, mepc + 4);
- return 0;
- }
bad_trap();
}
@@ -245,7 +243,7 @@ uintptr_t trap_from_machine_mode(uintptr_t dummy, uintptr_t* regs)
return machine_page_fault(mcause, regs, mepc);
case CAUSE_ILLEGAL_INSTRUCTION:
return machine_illegal_instruction(mcause, regs, mepc);
- case CAUSE_ECALL:
+ case CAUSE_MACHINE_ECALL:
return mcall_trap(mcause, regs);
default:
bad_trap();