aboutsummaryrefslogtreecommitdiff
path: root/machine/mtrap.c
diff options
context:
space:
mode:
authorHoward Mao <zhehao.mao@gmail.com>2017-05-23 15:44:27 -0700
committerHoward Mao <zhehao.mao@gmail.com>2017-10-04 13:29:16 -0700
commit4c64d29a8b1c5aecc8a08782b7ad39c6d2fb3387 (patch)
tree09af529e13af183d0449811a63b7865be42778cc /machine/mtrap.c
parentfb4e31229fb072297dad9fcdf2c67b053c5d0322 (diff)
downloadriscv-pk-new-sbi-disk.zip
riscv-pk-new-sbi-disk.tar.gz
riscv-pk-new-sbi-disk.tar.bz2
add sbi-disk mcall routinesnew-sbi-disk
Diffstat (limited to 'machine/mtrap.c')
-rw-r--r--machine/mtrap.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/machine/mtrap.c b/machine/mtrap.c
index e5faae3..789f544 100644
--- a/machine/mtrap.c
+++ b/machine/mtrap.c
@@ -98,6 +98,23 @@ static uintptr_t mcall_set_timer(uint64_t when)
return 0;
}
+static uintptr_t mcall_disk_read(uintptr_t addr, uintptr_t offset, size_t size)
+{
+ htif_disk_read(addr, offset, size);
+ return 0;
+}
+
+static uintptr_t mcall_disk_write(uintptr_t addr, uintptr_t offset, size_t size)
+{
+ htif_disk_write(addr, offset, size);
+ return 0;
+}
+
+static uintptr_t mcall_disk_size(void)
+{
+ return htif_disk_size();
+}
+
static void send_ipi_many(uintptr_t* pmask, int event)
{
_Static_assert(MAX_HARTS <= 8 * sizeof(*pmask), "# harts > uintptr_t bits");
@@ -132,7 +149,8 @@ void mcall_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc)
{
write_csr(mepc, mepc + 4);
- uintptr_t n = regs[17], arg0 = regs[10], arg1 = regs[11], retval, ipi_type;
+ uintptr_t n = regs[17], arg0 = regs[10], arg1 = regs[11], arg2 = regs[12];
+ uintptr_t retval, ipi_type;
switch (n)
{
@@ -168,6 +186,15 @@ send_ipi:
retval = mcall_set_timer(arg0);
#endif
break;
+ case SBI_DISK_READ:
+ retval = mcall_disk_read(arg0, arg1, arg2);
+ break;
+ case SBI_DISK_WRITE:
+ retval = mcall_disk_write(arg0, arg1, arg2);
+ break;
+ case SBI_DISK_SIZE:
+ retval = mcall_disk_size();
+ break;
default:
retval = -ENOSYS;
break;