add riscv32e-npc
This commit is contained in:
parent
e0ae9b7651
commit
d341fb23a0
9 changed files with 77 additions and 31 deletions
|
@ -10,7 +10,7 @@
|
||||||
# define nemu_trap(code) asm volatile ("int3" : :"a"(code))
|
# define nemu_trap(code) asm volatile ("int3" : :"a"(code))
|
||||||
#elif defined(__ISA_MIPS32__)
|
#elif defined(__ISA_MIPS32__)
|
||||||
# define nemu_trap(code) asm volatile ("move $v0, %0; sdbbp" : :"r"(code))
|
# define nemu_trap(code) asm volatile ("move $v0, %0; sdbbp" : :"r"(code))
|
||||||
#elif defined(__ISA_RISCV32__) || defined(__ISA_RISCV64__)
|
#elif defined(__riscv)
|
||||||
# define nemu_trap(code) asm volatile("mv a0, %0; ebreak" : :"r"(code))
|
# define nemu_trap(code) asm volatile("mv a0, %0; ebreak" : :"r"(code))
|
||||||
#elif defined(__ISA_LOONGARCH32R__)
|
#elif defined(__ISA_LOONGARCH32R__)
|
||||||
# define nemu_trap(code) asm volatile("move $a0, %0; break 0" : :"r"(code))
|
# define nemu_trap(code) asm volatile("move $a0, %0; break 0" : :"r"(code))
|
||||||
|
|
|
@ -35,7 +35,11 @@ Context *kcontext(Area kstack, void (*entry)(void *), void *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void yield() {
|
void yield() {
|
||||||
|
#ifdef __riscv_e
|
||||||
|
asm volatile("li a5, -1; ecall");
|
||||||
|
#else
|
||||||
asm volatile("li a7, -1; ecall");
|
asm volatile("li a7, -1; ecall");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ienabled() {
|
bool ienabled() {
|
||||||
|
|
|
@ -12,20 +12,30 @@
|
||||||
#define XLEN 8
|
#define XLEN 8
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define REGS(f) \
|
#define REGS_LO16(f) \
|
||||||
f( 1) f( 3) f( 4) f( 5) f( 6) f( 7) f( 8) f( 9) \
|
f( 1) f( 3) f( 4) f( 5) f( 6) f( 7) f( 8) f( 9) \
|
||||||
f(10) f(11) f(12) f(13) f(14) f(15) f(16) f(17) f(18) f(19) \
|
f(10) f(11) f(12) f(13) f(14) f(15)
|
||||||
|
#ifndef __riscv_e
|
||||||
|
#define REGS_HI16(f) \
|
||||||
|
f(16) f(17) f(18) f(19) \
|
||||||
f(20) f(21) f(22) f(23) f(24) f(25) f(26) f(27) f(28) f(29) \
|
f(20) f(21) f(22) f(23) f(24) f(25) f(26) f(27) f(28) f(29) \
|
||||||
f(30) f(31)
|
f(30) f(31)
|
||||||
|
#define NR_REGS 32
|
||||||
|
#else
|
||||||
|
#define REGS_HI16(f)
|
||||||
|
#define NR_REGS 16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define REGS(f) REGS_LO16(f) REGS_HI16(f)
|
||||||
|
|
||||||
#define PUSH(n) STORE concat(x, n), (n * XLEN)(sp);
|
#define PUSH(n) STORE concat(x, n), (n * XLEN)(sp);
|
||||||
#define POP(n) LOAD concat(x, n), (n * XLEN)(sp);
|
#define POP(n) LOAD concat(x, n), (n * XLEN)(sp);
|
||||||
|
|
||||||
#define CONTEXT_SIZE ((32 + 3 + 1) * XLEN)
|
#define CONTEXT_SIZE ((NR_REGS + 3 + 1) * XLEN)
|
||||||
#define OFFSET_SP ( 2 * XLEN)
|
#define OFFSET_SP ( 2 * XLEN)
|
||||||
#define OFFSET_CAUSE (32 * XLEN)
|
#define OFFSET_CAUSE ((NR_REGS + 0) * XLEN)
|
||||||
#define OFFSET_STATUS (33 * XLEN)
|
#define OFFSET_STATUS ((NR_REGS + 1) * XLEN)
|
||||||
#define OFFSET_EPC (34 * XLEN)
|
#define OFFSET_EPC ((NR_REGS + 2) * XLEN)
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
.globl __am_asm_trap
|
.globl __am_asm_trap
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <am.h>
|
#include <am.h>
|
||||||
|
#include <riscv/riscv.h>
|
||||||
#include <klib.h>
|
#include <klib.h>
|
||||||
|
|
||||||
static Context* (*user_handler)(Event, Context*) = NULL;
|
static Context* (*user_handler)(Event, Context*) = NULL;
|
||||||
|
@ -34,7 +35,11 @@ Context *kcontext(Area kstack, void (*entry)(void *), void *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void yield() {
|
void yield() {
|
||||||
|
#ifdef __riscv_e
|
||||||
|
asm volatile("li a5, -1; ecall");
|
||||||
|
#else
|
||||||
asm volatile("li a7, -1; ecall");
|
asm volatile("li a7, -1; ecall");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ienabled() {
|
bool ienabled() {
|
||||||
|
|
|
@ -6,7 +6,6 @@ void __am_timer_init();
|
||||||
void __am_timer_rtc(AM_TIMER_RTC_T *);
|
void __am_timer_rtc(AM_TIMER_RTC_T *);
|
||||||
void __am_timer_uptime(AM_TIMER_UPTIME_T *);
|
void __am_timer_uptime(AM_TIMER_UPTIME_T *);
|
||||||
void __am_input_keybrd(AM_INPUT_KEYBRD_T *);
|
void __am_input_keybrd(AM_INPUT_KEYBRD_T *);
|
||||||
void __am_timer_rtc(AM_TIMER_RTC_T *);
|
|
||||||
|
|
||||||
static void __am_timer_config(AM_TIMER_CONFIG_T *cfg) { cfg->present = true; cfg->has_rtc = true; }
|
static void __am_timer_config(AM_TIMER_CONFIG_T *cfg) { cfg->present = true; cfg->has_rtc = true; }
|
||||||
static void __am_input_config(AM_INPUT_CONFIG_T *cfg) { cfg->present = true; }
|
static void __am_input_config(AM_INPUT_CONFIG_T *cfg) { cfg->present = true; }
|
||||||
|
|
|
@ -1,51 +1,66 @@
|
||||||
|
|
||||||
#define concat_temp(x, y) x ## y
|
#define concat_temp(x, y) x ## y
|
||||||
#define concat(x, y) concat_temp(x, y)
|
#define concat(x, y) concat_temp(x, y)
|
||||||
#define MAP(c, f) c(f)
|
#define MAP(c, f) c(f)
|
||||||
|
|
||||||
#define REGS(f) \
|
#if __riscv_xlen == 32
|
||||||
|
#define LOAD lw
|
||||||
|
#define STORE sw
|
||||||
|
#define XLEN 4
|
||||||
|
#else
|
||||||
|
#define LOAD ld
|
||||||
|
#define STORE sd
|
||||||
|
#define XLEN 8
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define REGS_LO16(f) \
|
||||||
f( 1) f( 3) f( 4) f( 5) f( 6) f( 7) f( 8) f( 9) \
|
f( 1) f( 3) f( 4) f( 5) f( 6) f( 7) f( 8) f( 9) \
|
||||||
f(10) f(11) f(12) f(13) f(14) f(15) f(16) f(17) f(18) f(19) \
|
f(10) f(11) f(12) f(13) f(14) f(15)
|
||||||
|
#ifndef __riscv_e
|
||||||
|
#define REGS_HI16(f) \
|
||||||
|
f(16) f(17) f(18) f(19) \
|
||||||
f(20) f(21) f(22) f(23) f(24) f(25) f(26) f(27) f(28) f(29) \
|
f(20) f(21) f(22) f(23) f(24) f(25) f(26) f(27) f(28) f(29) \
|
||||||
f(30) f(31)
|
f(30) f(31)
|
||||||
|
#define NR_REGS 32
|
||||||
|
#else
|
||||||
|
#define REGS_HI16(f)
|
||||||
|
#define NR_REGS 16
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PUSH(n) sd concat(x, n), (n * 8)(sp);
|
#define REGS(f) REGS_LO16(f) REGS_HI16(f)
|
||||||
#define POP(n) ld concat(x, n), (n * 8)(sp);
|
|
||||||
|
|
||||||
#define CONTEXT_SIZE ((32 + 3) * 8)
|
#define PUSH(n) STORE concat(x, n), (n * XLEN)(sp);
|
||||||
#define OFFSET_SP ( 2 * 8)
|
#define POP(n) LOAD concat(x, n), (n * XLEN)(sp);
|
||||||
#define OFFSET_CAUSE (32 * 8)
|
|
||||||
#define OFFSET_STATUS (33 * 8)
|
|
||||||
#define OFFSET_EPC (34 * 8)
|
|
||||||
|
|
||||||
|
#define CONTEXT_SIZE ((NR_REGS + 3 + 1) * XLEN)
|
||||||
|
#define OFFSET_SP ( 2 * XLEN)
|
||||||
|
#define OFFSET_CAUSE ((NR_REGS + 0) * XLEN)
|
||||||
|
#define OFFSET_STATUS ((NR_REGS + 1) * XLEN)
|
||||||
|
#define OFFSET_EPC ((NR_REGS + 2) * XLEN)
|
||||||
|
|
||||||
|
.align 3
|
||||||
.globl __am_asm_trap
|
.globl __am_asm_trap
|
||||||
__am_asm_trap:
|
__am_asm_trap:
|
||||||
addi sp, sp, -CONTEXT_SIZE
|
addi sp, sp, -CONTEXT_SIZE
|
||||||
|
|
||||||
MAP(REGS, PUSH)
|
MAP(REGS, PUSH)
|
||||||
|
|
||||||
mv t0, sp
|
|
||||||
addi t0, t0, CONTEXT_SIZE
|
|
||||||
sd t0, OFFSET_SP(sp)
|
|
||||||
|
|
||||||
csrr t0, mcause
|
csrr t0, mcause
|
||||||
csrr t1, mstatus
|
csrr t1, mstatus
|
||||||
csrr t2, mepc
|
csrr t2, mepc
|
||||||
|
|
||||||
sd t0, OFFSET_CAUSE(sp)
|
STORE t0, OFFSET_CAUSE(sp)
|
||||||
sd t1, OFFSET_STATUS(sp)
|
STORE t1, OFFSET_STATUS(sp)
|
||||||
sd t2, OFFSET_EPC(sp)
|
STORE t2, OFFSET_EPC(sp)
|
||||||
|
|
||||||
mv a0, sp
|
mv a0, sp
|
||||||
jal __am_irq_handle
|
jal __am_irq_handle
|
||||||
|
|
||||||
ld t1, OFFSET_STATUS(sp)
|
LOAD t1, OFFSET_STATUS(sp)
|
||||||
ld t2, OFFSET_EPC(sp)
|
LOAD t2, OFFSET_EPC(sp)
|
||||||
csrw mstatus, t1
|
csrw mstatus, t1
|
||||||
csrw mepc, t2
|
csrw mepc, t2
|
||||||
|
|
||||||
MAP(REGS, POP)
|
MAP(REGS, POP)
|
||||||
|
|
||||||
addi sp, sp, CONTEXT_SIZE
|
addi sp, sp, CONTEXT_SIZE
|
||||||
|
|
||||||
mret
|
mret
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
include $(AM_HOME)/scripts/isa/riscv.mk
|
|
||||||
|
|
||||||
AM_SRCS := riscv/npc/start.S \
|
AM_SRCS := riscv/npc/start.S \
|
||||||
riscv/npc/trm.c \
|
riscv/npc/trm.c \
|
||||||
riscv/npc/ioe.c \
|
riscv/npc/ioe.c \
|
||||||
|
@ -11,7 +9,8 @@ AM_SRCS := riscv/npc/start.S \
|
||||||
platform/dummy/mpe.c
|
platform/dummy/mpe.c
|
||||||
|
|
||||||
CFLAGS += -fdata-sections -ffunction-sections
|
CFLAGS += -fdata-sections -ffunction-sections
|
||||||
LDFLAGS += -T $(AM_HOME)/scripts/linker.ld --defsym=_pmem_start=0x80000000 --defsym=_entry_offset=0x0
|
LDFLAGS += -T $(AM_HOME)/scripts/linker.ld \
|
||||||
|
--defsym=_pmem_start=0x80000000 --defsym=_entry_offset=0x0
|
||||||
LDFLAGS += --gc-sections -e _start
|
LDFLAGS += --gc-sections -e _start
|
||||||
CFLAGS += -DMAINARGS=\"$(mainargs)\"
|
CFLAGS += -DMAINARGS=\"$(mainargs)\"
|
||||||
.PHONY: $(AM_HOME)/am/src/riscv/npc/trm.c
|
.PHONY: $(AM_HOME)/am/src/riscv/npc/trm.c
|
10
scripts/riscv32e-nemu.mk
Normal file
10
scripts/riscv32e-nemu.mk
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
include $(AM_HOME)/scripts/isa/riscv.mk
|
||||||
|
include $(AM_HOME)/scripts/platform/nemu.mk
|
||||||
|
CFLAGS += -DISA_H=\"riscv/riscv.h\"
|
||||||
|
COMMON_CFLAGS += -march=rv32em_zicsr -mabi=ilp32e # overwrite
|
||||||
|
LDFLAGS += -melf32lriscv # overwrite
|
||||||
|
|
||||||
|
AM_SRCS += riscv/nemu/start.S \
|
||||||
|
riscv/nemu/cte.c \
|
||||||
|
riscv/nemu/trap.S \
|
||||||
|
riscv/nemu/vme.c
|
4
scripts/riscv32e-npc.mk
Normal file
4
scripts/riscv32e-npc.mk
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
include $(AM_HOME)/scripts/isa/riscv.mk
|
||||||
|
include $(AM_HOME)/scripts/platform/npc.mk
|
||||||
|
COMMON_CFLAGS += -march=rv32e_zicsr -mabi=ilp32e # overwrite
|
||||||
|
LDFLAGS += -melf32lriscv # overwrite
|
Loading…
Add table
Reference in a new issue