9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit d7b6798c500aedd88ef16884f257eca2d8670ea7
parent 805b34c4d0e4f3aac1fe9391bab01e846307dd94
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Mon, 28 Dec 2020 19:43:59 +0100

os9: Add ictx() function

This functoin creates a new execution context.

Change-Id: Iec477c9248d3ad75d59a91018436c2bb50842b3c

Diffstat:
Minclude/bits/amd64/arch/types.h | 3++-
Minclude/os9/os9.h | 1+
Msrc/os9/arch/arm64/arch.h | 1+
Msrc/os9/arch/arm64/crt.s | 7++++---
Msrc/os9/arch/arm64/ctx.c | 21+++++++++++++++++++++
Msrc/os9/arch/arm64/sysreg.lst | 1+
Msrc/os9/hosted/arch.c | 11+++++++++++
Asrc/os9/hosted/ctx.c | 12++++++++++++
8 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/include/bits/amd64/arch/types.h b/include/bits/amd64/arch/types.h @@ -18,5 +18,6 @@ struct ptable { }; struct context { - unsigned long long regs[1]; + void *stack; + void *entry; }; diff --git a/include/os9/os9.h b/include/os9/os9.h @@ -259,6 +259,7 @@ extern noreturn void fault(const char *msg, Context *ctx); extern noreturn void swtch(Context *ctx); extern noreturn void trap(Context *ctx); extern Ptable *initptable(Task *); +extern int ictx(Task *, void *); extern char *getconf(char *); /* dev functions */ diff --git a/src/os9/arch/arm64/arch.h b/src/os9/arch/arm64/arch.h @@ -27,6 +27,7 @@ extern void invicache(void); extern void invalltlb(void); extern void invtlb(uintptr_t); extern void invdcachesetway(void *); +extern void *outsync(void); extern void icache(void); extern void immu(void); diff --git a/src/os9/arch/arm64/crt.s b/src/os9/arch/arm64/crt.s @@ -3,7 +3,7 @@ .INCLUDE "defines.inc" .TEXT - .GLOBL _start + .GLOBL _start,outsync _start: MRS X10,CURRENTEL UBFX X10,X10,#2,#2 @@ -62,7 +62,8 @@ EL1: BL taskmap BL main - ADR X0,OUTSYNC +outsync: + ADR X0,OUTSYNCT B panic .TEXT @@ -74,5 +75,5 @@ hmem: STR XZR,[x9] RET - OUTSYNC: + OUTSYNCT: .ASCIZ "out of sync" diff --git a/src/os9/arch/arm64/ctx.c b/src/os9/arch/arm64/ctx.c @@ -1,7 +1,10 @@ #include <libk.h> #include <os9/os9.h> +#include <string.h> + #include "arch.h" +#include "sysreg.h" static char regnames[][8] = { [X0] = "x0", @@ -102,3 +105,21 @@ panic(const char *msg) { fault(msg, NULL); } + +int +ictx(Task *tp, void *fn) +{ + uint64_t *rp; + + if (!newstack(tp)) + return -1; + + rp = tp->ctx.r; + memset(rp, 0, sizeof(tp->ctx.r)); + rp[X30] = (uint64_t) outsync; + rp[SP] = tp->stack.va; + rp[SPSR] = sysrd(SPSR_EL1); + rp[ELR] = (uint64_t) fn; + + return 0; +} diff --git a/src/os9/arch/arm64/sysreg.lst b/src/os9/arch/arm64/sysreg.lst @@ -7,6 +7,7 @@ CLIDR_EL1 S3_1_C0_C0_1 CCSIDR_EL1 S3_1_C0_C0_0 CSSELR_EL1 S3_2_C0_C0_0 CPACR_EL1 S3_0_C1_C0_2 +SPSR_EL1 S3_0_C4_C0_0 FPCR S3_3_C4_C4_0 FPSR S3_3_C4_C4_1 MAIR_EL1 S3_0_C10_C2_0 diff --git a/src/os9/hosted/arch.c b/src/os9/hosted/arch.c @@ -58,3 +58,14 @@ outm32(uint32_t val, void *addr) { return 0; } + +int +ictx(Task *tp, void *fn) +{ + if (!newstack(tp)) + return -1; + tp->ctx.stack = (void *) tp->stack.va; + tp->ctx.entry = fn; + + return 0; +} diff --git a/src/os9/hosted/ctx.c b/src/os9/hosted/ctx.c @@ -0,0 +1,12 @@ +#include <os9/os9.h> + +int +ictx(Task *tp, void *fn) +{ + if (!newstack(tp)) + return -1; + tp->ctx.stack = (void *) tp->stack.va; + tp->ctx.entry = fn; + + return 0; +}