Browse Source

Use hcall instead of mcall for sbi calls

pull/9/head
Andrew Waterman 11 years ago
parent
commit
438823e130
  1. 17
      pk/encoding.h
  2. 6
      pk/frontend.c
  3. 15
      pk/hcall.h
  4. 15
      pk/mcall.h
  5. 4
      pk/mentry.S
  6. 26
      pk/mtrap.c
  7. 24
      pk/sbi_entry.S
  8. 4
      pk/sbi_impl.c

17
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)

6
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();

15
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

15
pk/mcall.h

@ -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

4
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

26
pk/mtrap.c

@ -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;

24
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

4
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)
{

Loading…
Cancel
Save