NJU-ProjectN/abstract-machine ics2023 initialized
NJU-ProjectN/abstract-machine 3348db971fd860be5cb28e21c18f9d0e65d0c96a Merge pull request #8 from Jasonyanyusong/master
This commit is contained in:
parent
2824efad33
commit
8e4feb4010
129 changed files with 9017 additions and 0 deletions
50
abstract-machine/am/src/riscv/nemu/cte.c
Normal file
50
abstract-machine/am/src/riscv/nemu/cte.c
Normal file
|
@ -0,0 +1,50 @@
|
|||
#include <am.h>
|
||||
#include <riscv/riscv.h>
|
||||
#include <klib.h>
|
||||
|
||||
static Context* (*user_handler)(Event, Context*) = NULL;
|
||||
|
||||
Context* __am_irq_handle(Context *c) {
|
||||
if (user_handler) {
|
||||
Event ev = {0};
|
||||
switch (c->mcause) {
|
||||
default: ev.event = EVENT_ERROR; break;
|
||||
}
|
||||
|
||||
c = user_handler(ev, c);
|
||||
assert(c != NULL);
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
extern void __am_asm_trap(void);
|
||||
|
||||
bool cte_init(Context*(*handler)(Event, Context*)) {
|
||||
// initialize exception entry
|
||||
asm volatile("csrw mtvec, %0" : : "r"(__am_asm_trap));
|
||||
|
||||
// register event handler
|
||||
user_handler = handler;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Context *kcontext(Area kstack, void (*entry)(void *), void *arg) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void yield() {
|
||||
#ifdef __riscv_e
|
||||
asm volatile("li a5, -1; ecall");
|
||||
#else
|
||||
asm volatile("li a7, -1; ecall");
|
||||
#endif
|
||||
}
|
||||
|
||||
bool ienabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void iset(bool enable) {
|
||||
}
|
8
abstract-machine/am/src/riscv/nemu/start.S
Normal file
8
abstract-machine/am/src/riscv/nemu/start.S
Normal file
|
@ -0,0 +1,8 @@
|
|||
.section entry, "ax"
|
||||
.globl _start
|
||||
.type _start, @function
|
||||
|
||||
_start:
|
||||
mv s0, zero
|
||||
la sp, _stack_pointer
|
||||
jal _trm_init
|
71
abstract-machine/am/src/riscv/nemu/trap.S
Normal file
71
abstract-machine/am/src/riscv/nemu/trap.S
Normal file
|
@ -0,0 +1,71 @@
|
|||
#define concat_temp(x, y) x ## y
|
||||
#define concat(x, y) concat_temp(x, y)
|
||||
#define MAP(c, f) c(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(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(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 POP(n) LOAD concat(x, n), (n * XLEN)(sp);
|
||||
|
||||
#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
|
||||
__am_asm_trap:
|
||||
addi sp, sp, -CONTEXT_SIZE
|
||||
|
||||
MAP(REGS, PUSH)
|
||||
|
||||
csrr t0, mcause
|
||||
csrr t1, mstatus
|
||||
csrr t2, mepc
|
||||
|
||||
STORE t0, OFFSET_CAUSE(sp)
|
||||
STORE t1, OFFSET_STATUS(sp)
|
||||
STORE t2, OFFSET_EPC(sp)
|
||||
|
||||
# set mstatus.MPRV to pass difftest
|
||||
li a0, (1 << 17)
|
||||
or t1, t1, a0
|
||||
csrw mstatus, t1
|
||||
|
||||
mv a0, sp
|
||||
jal __am_irq_handle
|
||||
|
||||
LOAD t1, OFFSET_STATUS(sp)
|
||||
LOAD t2, OFFSET_EPC(sp)
|
||||
csrw mstatus, t1
|
||||
csrw mepc, t2
|
||||
|
||||
MAP(REGS, POP)
|
||||
|
||||
addi sp, sp, CONTEXT_SIZE
|
||||
mret
|
74
abstract-machine/am/src/riscv/nemu/vme.c
Normal file
74
abstract-machine/am/src/riscv/nemu/vme.c
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include <am.h>
|
||||
#include <nemu.h>
|
||||
#include <klib.h>
|
||||
|
||||
static AddrSpace kas = {};
|
||||
static void* (*pgalloc_usr)(int) = NULL;
|
||||
static void (*pgfree_usr)(void*) = NULL;
|
||||
static int vme_enable = 0;
|
||||
|
||||
static Area segments[] = { // Kernel memory mappings
|
||||
NEMU_PADDR_SPACE
|
||||
};
|
||||
|
||||
#define USER_SPACE RANGE(0x40000000, 0x80000000)
|
||||
|
||||
static inline void set_satp(void *pdir) {
|
||||
uintptr_t mode = 1ul << (__riscv_xlen - 1);
|
||||
asm volatile("csrw satp, %0" : : "r"(mode | ((uintptr_t)pdir >> 12)));
|
||||
}
|
||||
|
||||
static inline uintptr_t get_satp() {
|
||||
uintptr_t satp;
|
||||
asm volatile("csrr %0, satp" : "=r"(satp));
|
||||
return satp << 12;
|
||||
}
|
||||
|
||||
bool vme_init(void* (*pgalloc_f)(int), void (*pgfree_f)(void*)) {
|
||||
pgalloc_usr = pgalloc_f;
|
||||
pgfree_usr = pgfree_f;
|
||||
|
||||
kas.ptr = pgalloc_f(PGSIZE);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < LENGTH(segments); i ++) {
|
||||
void *va = segments[i].start;
|
||||
for (; va < segments[i].end; va += PGSIZE) {
|
||||
map(&kas, va, va, 0);
|
||||
}
|
||||
}
|
||||
|
||||
set_satp(kas.ptr);
|
||||
vme_enable = 1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void protect(AddrSpace *as) {
|
||||
PTE *updir = (PTE*)(pgalloc_usr(PGSIZE));
|
||||
as->ptr = updir;
|
||||
as->area = USER_SPACE;
|
||||
as->pgsize = PGSIZE;
|
||||
// map kernel space
|
||||
memcpy(updir, kas.ptr, PGSIZE);
|
||||
}
|
||||
|
||||
void unprotect(AddrSpace *as) {
|
||||
}
|
||||
|
||||
void __am_get_cur_as(Context *c) {
|
||||
c->pdir = (vme_enable ? (void *)get_satp() : NULL);
|
||||
}
|
||||
|
||||
void __am_switch(Context *c) {
|
||||
if (vme_enable && c->pdir != NULL) {
|
||||
set_satp(c->pdir);
|
||||
}
|
||||
}
|
||||
|
||||
void map(AddrSpace *as, void *va, void *pa, int prot) {
|
||||
}
|
||||
|
||||
Context *ucontext(AddrSpace *as, Area kstack, void *entry) {
|
||||
return NULL;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue