diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-03-12 23:06:07 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-03-12 23:06:52 -0700 |
commit | 438823e1308b219aa7daf11cf86e3028e9b8667d (patch) | |
tree | 8f1a6b40e8d4fa7f421f869f20d7d4ee126b096b /pk | |
parent | 6517fe26a2a0c89c3112f4a383c601572c71d64a (diff) | |
download | pk-438823e1308b219aa7daf11cf86e3028e9b8667d.zip pk-438823e1308b219aa7daf11cf86e3028e9b8667d.tar.gz pk-438823e1308b219aa7daf11cf86e3028e9b8667d.tar.bz2 |
Use hcall instead of mcall for sbi calls
Diffstat (limited to 'pk')
-rw-r--r-- | pk/encoding.h | 17 | ||||
-rw-r--r-- | pk/frontend.c | 6 | ||||
-rw-r--r-- | pk/hcall.h | 15 | ||||
-rw-r--r-- | pk/mcall.h | 15 | ||||
-rw-r--r-- | pk/mentry.S | 4 | ||||
-rw-r--r-- | pk/mtrap.c | 26 | ||||
-rw-r--r-- | pk/sbi_entry.S | 24 | ||||
-rw-r--r-- | pk/sbi_impl.c | 4 |
8 files changed, 58 insertions, 53 deletions
diff --git a/pk/encoding.h b/pk/encoding.h index 4b929d3..354e67d 100644 --- a/pk/encoding.h +++ b/pk/encoding.h @@ -72,6 +72,8 @@ #define PTE_SR 0x040 // Supervisor Read permission #define PTE_SW 0x080 // Supervisor Write permission #define PTE_SX 0x100 // Supervisor eXecute permission +#define PTE_R 0x200 // Referenced +#define PTE_D 0x400 // Dirty #define PTE_PERM (PTE_SR | PTE_SW | PTE_SX | PTE_UR | PTE_UW | PTE_UX) #ifdef __riscv @@ -148,10 +150,12 @@ #define MASK_AMOMAX_D 0xf800707f #define MATCH_BLTU 0x6063 #define MASK_BLTU 0x707f +#define MATCH_FCLASS_S 0xe0001053 +#define MASK_FCLASS_S 0xfff0707f #define MATCH_FSGNJN_D 0x22001053 #define MASK_FSGNJN_D 0xfe00707f -#define MATCH_FMIN_S 0x28000053 -#define MASK_FMIN_S 0xfe00707f +#define MATCH_HCALL 0x10000073 +#define MASK_HCALL 0xffffffff #define MATCH_MRET 0x30200073 #define MASK_MRET 0xffffffff #define MATCH_CSRRW 0x1073 @@ -240,8 +244,8 @@ #define MASK_BLT 0x707f #define MATCH_SCALL 0x73 #define MASK_SCALL 0xffffffff -#define MATCH_FCLASS_S 0xe0001053 -#define MASK_FCLASS_S 0xfff0707f +#define MATCH_FMIN_S 0x28000053 +#define MASK_FMIN_S 0xfe00707f #define MATCH_SFENCE_VM 0x10400073 #define MASK_SFENCE_VM 0xfff07fff #define MATCH_SC_W 0x1800202f @@ -528,8 +532,9 @@ DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) +DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) -DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) +DECLARE_INSN(hcall, MATCH_HCALL, MASK_HCALL) DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) @@ -574,7 +579,7 @@ DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) DECLARE_INSN(scall, MATCH_SCALL, MASK_SCALL) -DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) +DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) DECLARE_INSN(sfence_vm, MATCH_SFENCE_VM, MASK_SFENCE_VM) DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) DECLARE_INSN(rem, MATCH_REM, MASK_REM) diff --git a/pk/frontend.c b/pk/frontend.c index 0929d54..e9a23ad 100644 --- a/pk/frontend.c +++ b/pk/frontend.c @@ -4,7 +4,7 @@ #include "atomic.h" #include "frontend.h" #include "sbi.h" -#include "mcall.h" +#include "hcall.h" #include <stdint.h> uint64_t tohost_sync(unsigned dev, unsigned cmd, uint64_t payload) @@ -13,8 +13,8 @@ uint64_t tohost_sync(unsigned dev, unsigned cmd, uint64_t payload) __sync_synchronize(); sbi_device_message m = {dev, cmd, payload}, *p; - do_mcall(MCALL_SEND_DEVICE_REQUEST, &m); - while ((p = (void*)do_mcall(MCALL_RECEIVE_DEVICE_RESPONSE)) == 0); + do_hcall(HCALL_SEND_DEVICE_REQUEST, &m); + while ((p = (void*)do_hcall(HCALL_RECEIVE_DEVICE_RESPONSE)) == 0); kassert(p == &m); __sync_synchronize(); diff --git a/pk/hcall.h b/pk/hcall.h new file mode 100644 index 0000000..7e89f2b --- /dev/null +++ b/pk/hcall.h @@ -0,0 +1,15 @@ +#ifndef _PK_HCALL_H +#define _PK_HCALL_H + +#define HCALL_HART_ID 0 +#define HCALL_CONSOLE_PUTCHAR 1 +#define HCALL_SEND_DEVICE_REQUEST 2 +#define HCALL_RECEIVE_DEVICE_RESPONSE 3 + +#ifndef __ASSEMBLER__ + +extern uintptr_t do_hcall(uintptr_t which, ...); + +#endif + +#endif diff --git a/pk/mcall.h b/pk/mcall.h deleted file mode 100644 index 9992891..0000000 --- a/pk/mcall.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _PK_MCALL_H -#define _PK_MCALL_H - -#define MCALL_HART_ID 0 -#define MCALL_CONSOLE_PUTCHAR 1 -#define MCALL_SEND_DEVICE_REQUEST 2 -#define MCALL_RECEIVE_DEVICE_RESPONSE 3 - -#ifndef __ASSEMBLER__ - -extern uintptr_t do_mcall(uintptr_t which, ...); - -#endif - -#endif diff --git a/pk/mentry.S b/pk/mentry.S index 4e64b7e..23680b6 100644 --- a/pk/mentry.S +++ b/pk/mentry.S @@ -78,7 +78,7 @@ mentry: STORE a1,11*REGBYTES(sp) csrr a0, mcause - li a1, CAUSE_MCALL + li a1, CAUSE_HCALL beq a0, a1, .Lhandle_trap_in_machine_mode li a1, CAUSE_FAULT_LOAD beq a0, a1, .Lhandle_trap_in_machine_mode @@ -236,8 +236,8 @@ trap_table: .word illegal_insn_trap .word bad_trap .word bad_trap + .word hcall_trap .word bad_trap - .word mcall_trap .word bad_trap .word misaligned_load_trap .word machine_page_fault @@ -1,6 +1,6 @@ #include "mtrap.h" #include "frontend.h" -#include "mcall.h" +#include "hcall.h" #include "vm.h" #include <errno.h> @@ -109,7 +109,7 @@ uintptr_t htif_interrupt(uintptr_t mcause, uintptr_t* regs) panic("htif: no record"); } -static uintptr_t mcall_console_putchar(uint8_t ch) +static uintptr_t hcall_console_putchar(uint8_t ch) { while (swap_csr(tohost, TOHOST_CMD(1, 1, ch)) != 0); while (1) { @@ -127,9 +127,9 @@ static uintptr_t mcall_console_putchar(uint8_t ch) #define printm(str, ...) ({ \ char buf[1024], *p = buf; sprintk(buf, str, __VA_ARGS__); \ - while (*p) mcall_console_putchar(*p++); }) + while (*p) hcall_console_putchar(*p++); }) -static uintptr_t mcall_dev_req(sbi_device_message *m) +static uintptr_t hcall_dev_req(sbi_device_message *m) { //printm("req %d %p\n", MAILBOX()->device_request_queue_size, m); #ifndef __riscv64 @@ -153,7 +153,7 @@ static uintptr_t mcall_dev_req(sbi_device_message *m) #endif } -static uintptr_t mcall_dev_resp() +static uintptr_t hcall_dev_resp() { htif_interrupt(0, 0); @@ -168,7 +168,7 @@ static uintptr_t mcall_dev_resp() return (uintptr_t)m; } -uintptr_t mcall_trap(uintptr_t mcause, uintptr_t* regs) +uintptr_t hcall_trap(uintptr_t mcause, uintptr_t* regs) { if (EXTRACT_FIELD(read_csr(mstatus), MSTATUS_PRV1) < PRV_S) return -1; @@ -176,17 +176,17 @@ uintptr_t mcall_trap(uintptr_t mcause, uintptr_t* regs) uintptr_t n = regs[10], arg0 = regs[11], retval; switch (n) { - case MCALL_HART_ID: + case HCALL_HART_ID: retval = 0; // TODO break; - case MCALL_CONSOLE_PUTCHAR: - retval = mcall_console_putchar(arg0); + case HCALL_CONSOLE_PUTCHAR: + retval = hcall_console_putchar(arg0); break; - case MCALL_SEND_DEVICE_REQUEST: - retval = mcall_dev_req((sbi_device_message*)arg0); + case HCALL_SEND_DEVICE_REQUEST: + retval = hcall_dev_req((sbi_device_message*)arg0); break; - case MCALL_RECEIVE_DEVICE_RESPONSE: - retval = mcall_dev_resp(); + case HCALL_RECEIVE_DEVICE_RESPONSE: + retval = hcall_dev_resp(); break; default: retval = -ENOSYS; diff --git a/pk/sbi_entry.S b/pk/sbi_entry.S index 33e998a..7715243 100644 --- a/pk/sbi_entry.S +++ b/pk/sbi_entry.S @@ -1,5 +1,5 @@ #include "encoding.h" -#include "mcall.h" +#include "hcall.h" .section .sbi,"ax",@progbits .align RISCV_PGSHIFT @@ -12,8 +12,8 @@ sbi_base: # hart_id .align 4 - li a0, MCALL_HART_ID - mcall + li a0, HCALL_HART_ID + hcall ret # num_harts @@ -28,22 +28,22 @@ sbi_base: # console_putchar .align 4 mv a1, a0 - li a0, MCALL_CONSOLE_PUTCHAR - mcall + li a0, HCALL_CONSOLE_PUTCHAR + hcall ret # send_device_request .align 4 mv a1, a0 - li a0, MCALL_SEND_DEVICE_REQUEST - mcall + li a0, HCALL_SEND_DEVICE_REQUEST + hcall ret # receive_device_response .align 4 mv a1, a0 - li a0, MCALL_RECEIVE_DEVICE_RESPONSE - mcall + li a0, HCALL_RECEIVE_DEVICE_RESPONSE + hcall ret # send ipi @@ -53,9 +53,9 @@ sbi_base: # end of SBI trampolines - .globl do_mcall -do_mcall: - mcall + .globl do_hcall +do_hcall: + hcall ret .align RISCV_PGSHIFT diff --git a/pk/sbi_impl.c b/pk/sbi_impl.c index 03a56bc..d39a7ea 100644 --- a/pk/sbi_impl.c +++ b/pk/sbi_impl.c @@ -2,14 +2,14 @@ #include "vm.h" #include "frontend.h" #include "sbi.h" -#include "mcall.h" +#include "hcall.h" #include <errno.h> #define sbi_printk(str, ...) ({ \ char buf[1024]; /* XXX */ \ sprintk(buf, str, __VA_ARGS__); \ for (size_t i = 0; buf[i]; i++) \ - do_mcall(MCALL_CONSOLE_PUTCHAR, buf[i]); }) + do_hcall(HCALL_CONSOLE_PUTCHAR, buf[i]); }) uintptr_t __sbi_query_memory(uintptr_t id, memory_block_info *p) { |