abstract-machine(nemu): support context switch
This commit is contained in:
parent
ef51673020
commit
385d448746
22 changed files with 236 additions and 87 deletions
|
@ -76,7 +76,8 @@ target_include_directories(
|
|||
INTERFACE $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/am/include>
|
||||
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/am/src>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||
target_compile_definitions(am_interface INTERFACE ARCH_H=<arch/${ISA}.h>)
|
||||
target_compile_definitions(am_interface INTERFACE ARCH_H=<arch/${ISA}.h>
|
||||
"__ISA__=\"${ISA}\"")
|
||||
file(GLOB_RECURSE AM_HEADERS "${CMAKE_SOURCE_DIR}/am/include/*.h")
|
||||
target_sources(
|
||||
am_interface
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#ifndef ARCH_H__
|
||||
#define ARCH_H__
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __riscv_e
|
||||
#define NR_REGS 16
|
||||
|
@ -9,10 +10,13 @@
|
|||
|
||||
struct Context {
|
||||
// TODO: fix the order of these members to match trap.S
|
||||
uintptr_t mepc, mcause, gpr[NR_REGS], mstatus;
|
||||
uintptr_t gpr[NR_REGS];
|
||||
uintptr_t mcause, mstatus, mepc;
|
||||
void *pdir;
|
||||
};
|
||||
|
||||
enum Cause { CauseEnvironmentCallFromMMode = 11 };
|
||||
|
||||
#ifdef __riscv_e
|
||||
#define GPR1 gpr[15] // a5
|
||||
#else
|
||||
|
|
|
@ -6,7 +6,7 @@ int main(const char *args);
|
|||
|
||||
Area heap = RANGE(&_heap_start, PMEM_END);
|
||||
#ifndef MAINARGS
|
||||
#define MAINARGS "5"
|
||||
#define MAINARGS "i"
|
||||
#endif
|
||||
static const char mainargs[] = MAINARGS;
|
||||
|
||||
|
|
|
@ -1,14 +1,21 @@
|
|||
#include "arch/riscv.h"
|
||||
#include <am.h>
|
||||
#include <riscv/riscv.h>
|
||||
#include <klib.h>
|
||||
#include <riscv/riscv.h>
|
||||
#include <stdint.h>
|
||||
|
||||
static Context* (*user_handler)(Event, Context*) = NULL;
|
||||
static Context *(*user_handler)(Event, Context *) = NULL;
|
||||
|
||||
Context* __am_irq_handle(Context *c) {
|
||||
Context *__am_irq_handle(Context *c) {
|
||||
if (user_handler) {
|
||||
Event ev = {0};
|
||||
switch (c->mcause) {
|
||||
default: ev.event = EVENT_ERROR; break;
|
||||
case CauseEnvironmentCallFromMMode:
|
||||
ev.event = EVENT_YIELD;
|
||||
break;
|
||||
default:
|
||||
ev.event = EVENT_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
c = user_handler(ev, c);
|
||||
|
@ -20,7 +27,7 @@ Context* __am_irq_handle(Context *c) {
|
|||
|
||||
extern void __am_asm_trap(void);
|
||||
|
||||
bool cte_init(Context*(*handler)(Event, Context*)) {
|
||||
bool cte_init(Context *(*handler)(Event, Context *)) {
|
||||
// initialize exception entry
|
||||
asm volatile("csrw mtvec, %0" : : "r"(__am_asm_trap));
|
||||
|
||||
|
@ -31,7 +38,10 @@ bool cte_init(Context*(*handler)(Event, Context*)) {
|
|||
}
|
||||
|
||||
Context *kcontext(Area kstack, void (*entry)(void *), void *arg) {
|
||||
return NULL;
|
||||
Context *c = kstack.end - sizeof(Context);
|
||||
c->mepc = (uintptr_t)entry;
|
||||
c->gpr[10] = (uintptr_t)arg;
|
||||
return c;
|
||||
}
|
||||
|
||||
void yield() {
|
||||
|
@ -42,9 +52,6 @@ void yield() {
|
|||
#endif
|
||||
}
|
||||
|
||||
bool ienabled() {
|
||||
return false;
|
||||
}
|
||||
bool ienabled() { return false; }
|
||||
|
||||
void iset(bool enable) {
|
||||
}
|
||||
void iset(bool enable) {}
|
||||
|
|
|
@ -60,6 +60,8 @@ __am_asm_trap:
|
|||
mv a0, sp
|
||||
jal __am_irq_handle
|
||||
|
||||
mv sp, a0
|
||||
|
||||
LOAD t1, OFFSET_STATUS(sp)
|
||||
LOAD t2, OFFSET_EPC(sp)
|
||||
csrw mstatus, t1
|
||||
|
|
|
@ -15,6 +15,9 @@ stdenv.mkDerivation {
|
|||
(lib.cmakeFeature "ISA" isa)
|
||||
] ++ map (p: (lib.cmakeBool "__PLATFORM_${lib.strings.toUpper p}__" true)) platform;
|
||||
|
||||
cmakeBuildType = "Debug";
|
||||
dontStrip = true;
|
||||
|
||||
nativeBuildInputs = [
|
||||
cmake
|
||||
];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue