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:
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;
+}