From fccdf292df18cb136a9c7081a790ad436010c989 Mon Sep 17 00:00:00 2001 From: Zihao Yu Date: Mon, 10 Feb 2020 15:10:44 +0800 Subject: [PATCH] *-nemu,cte: support _kcontext() with arg --- am/src/mips32/nemu/cte.c | 1 + am/src/riscv32/nemu/cte.c | 1 + am/src/x86/nemu/cte.c | 6 +++++- am/src/x86/nemu/trap.S | 5 +++++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/am/src/mips32/nemu/cte.c b/am/src/mips32/nemu/cte.c index 31e24419..ae433380 100644 --- a/am/src/mips32/nemu/cte.c +++ b/am/src/mips32/nemu/cte.c @@ -61,6 +61,7 @@ int _cte_init(_Context*(*handler)(_Event, _Context*)) { _Context *_kcontext(_Area kstack, void (*entry)(void *), void *arg) { _Context *c = (_Context*)kstack.end - 1; c->epc = (uintptr_t)entry; + c->GPR2 = (uintptr_t)arg; // a0 return c; } diff --git a/am/src/riscv32/nemu/cte.c b/am/src/riscv32/nemu/cte.c index 6eaa18bd..0a04e515 100644 --- a/am/src/riscv32/nemu/cte.c +++ b/am/src/riscv32/nemu/cte.c @@ -49,6 +49,7 @@ _Context *_kcontext(_Area kstack, void (*entry)(void *), void *arg) { _Context *c = (_Context*)kstack.end - 1; c->epc = (uintptr_t)entry; + c->GPR2 = (uintptr_t)arg; c->status = 0x000c0100; return c; } diff --git a/am/src/x86/nemu/cte.c b/am/src/x86/nemu/cte.c index 1ae228c5..62a46491 100644 --- a/am/src/x86/nemu/cte.c +++ b/am/src/x86/nemu/cte.c @@ -63,11 +63,15 @@ int _cte_init(_Context*(*handler)(_Event, _Context*)) { return 0; } +void __am_kcontext_start(); + _Context* _kcontext(_Area kstack, void (*entry)(void *), void *arg) { _Context *c = (_Context *)kstack.end - 1; c->cs = 0x8; - c->eip = (uintptr_t)entry; + c->eip = (uintptr_t)__am_kcontext_start; c->eflags = 0x2 | FL_IF; + c->GPR1 = (uintptr_t)arg; + c->GPR2 = (uintptr_t)entry; return c; } diff --git a/am/src/x86/nemu/trap.S b/am/src/x86/nemu/trap.S index e5197d15..207dfbc7 100644 --- a/am/src/x86/nemu/trap.S +++ b/am/src/x86/nemu/trap.S @@ -4,6 +4,11 @@ .globl __am_irq0; __am_irq0: pushl $0; pushl $32; jmp __am_asm_trap .globl __am_vecnull; __am_vecnull: pushl $0; pushl $-1; jmp __am_asm_trap +.globl __am_kcontext_start +__am_kcontext_start: + pushl %eax + call *%ebx + __am_asm_trap: pushal