commit f1f5ff5c6a7c02a15d189188a9ecece5d1d5899c
parent 50ccbf08218f54596f63da520cb7b7a5394bf4d2
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Sun, 9 Aug 2020 10:52:47 +0200
kernel: Remove trapframe data structure
Change-Id: I4e99b35cdc82367358d2bd87504f635cde7f9766
Diffstat:
8 files changed, 91 insertions(+), 43 deletions(-)
diff --git a/include/9os/9os.h b/include/9os/9os.h
@@ -19,6 +19,10 @@
#define IENABLE 1
#define IDISABLE 0
+typedef struct context Context;
+typedef struct proc Proc;
+typedef struct task Task;
+
enum regidx {
X0,
X1,
@@ -61,40 +65,84 @@ enum regidx {
NR_REGS
};
-typedef struct trapframe Context;
+enum tstates {
+ DORMANT,
+ READY,
+ RUNNING,
+ WAITING,
+ FAULTED,
+};
-struct trapframe {
+struct context {
unsigned long long r[NR_REGS];
};
-struct rmctab {
- struct rmcclass {
- unsigned char off;
- unsigned char cnt;
- } class[256];
- void *handler[];
+struct proc {
+ int pid;
+ char *name;
+ /* memory requirements */
+ long period;
+ long duration;
+ /* communication ports */
+ /* healt monitor table */
+ long affinity;
+
+ void *entry;
+ long flags;
+ int locklvl;
+ int mode;
+ int start;
+
+#define NR_TASKS 10
+ Task *tasks[NR_TASKS];
+ Task *errhdl;
+};
+
+struct task {
+ int tid;
+
+ char *name;
+ void *entry;
+ size_t stack;
+ int prio;
+ int baseprio;
+ int retainprio;
+ int wait;
+
+ long period;
+ long capacity;
+ int faultmode;
+
+ long deadline;
+ int state;
+ long affinity;
+
+ Context ctx;
};
-struct rmucmd {
- unsigned class, func;
- struct trapframe *fp;
+struct window {
+ int wid;
+ long offset;
+ long duration;
+ Proc *proc;
};
extern noreturn void halt(void);
extern noreturn void panic(const char *msg);
-extern noreturn void swtch(struct trapframe *fp);
-extern noreturn void trap(struct trapframe *fp);
+extern noreturn void swtch(Context *ctx);
+extern noreturn void trap(Context *ctx);
extern noreturn void badcmd(int error);
extern void svc(int numsvc);
extern int debug(void);
extern void idev(void);
-extern void dumpregs(struct trapframe *fp, int fd);
+extern void dumpregs(Context *ctx, int fd);
/* architectural functions */
+extern Context *getcontext(Context *ctx);
extern void *alloc(size_t size);
extern noreturn void dohalt(void);
extern noreturn void dopanic(void);
-extern noreturn void doswtch(struct trapframe *fp);
+extern noreturn void doswtch(Context *ctx);
extern void intr(int mode);
extern uint8_t inm8(void *addr);
extern uint16_t inm16(void *addr);
diff --git a/include/9os/kernel.h b/include/9os/kernel.h
@@ -1,6 +1,6 @@
#include <stddef.h>
-struct trapframe;
+struct context;
-extern struct trapframe *framep;
+extern struct context *framep;
extern const char *const regnames[];
diff --git a/src/kernel/arch/hosted/arch.c b/src/kernel/arch/hosted/arch.c
@@ -10,7 +10,7 @@ jmp_buf recover;
noreturn void abort(void);
noreturn void longjmp(jmp_buf env, int val);
-struct trapframe *(*getframe)(void);
+Context *(*getframe)(void);
int halted;
void
@@ -21,7 +21,7 @@ dohalt(void)
}
void
-doswtch(struct trapframe *fp)
+doswtch(Context *ctx)
{
longjmp(recover, 1);
}
@@ -29,10 +29,10 @@ doswtch(struct trapframe *fp)
void
dopanic(void)
{
- struct trapframe *fp;
+ Context *ctx;
- fp = (getframe) ? (*getframe)() : NULL;
- trap(fp);
+ ctx = (getframe) ? (*getframe)() : NULL;
+ trap(ctx);
abort();
}
diff --git a/src/kernel/arch/hosted/hosted.h b/src/kernel/arch/hosted/hosted.h
@@ -1,3 +1,3 @@
extern jmp_buf recover;
extern int halted;
-extern struct trapframe *(*getframe)(void);
+extern Context *(*getframe)(void);
diff --git a/src/kernel/arch/hosted/kernel.c b/src/kernel/arch/hosted/kernel.c
@@ -8,12 +8,12 @@
#include "hosted.h"
-static struct trapframe *frame(void);
+static Context *frame(void);
-struct trapframe trapframe, *framep;
-struct trapframe *(*getframe)(void) = frame;
+Context trapframe, *framep;
+Context *(*getframe)(void) = frame;
-static struct trapframe *
+static Context *
frame(void)
{
return framep;
diff --git a/src/kernel/dlang.c b/src/kernel/dlang.c
@@ -73,13 +73,13 @@ estrtoull(char *str, int base)
/* Get reg struct for named reg */
static unsigned long long *
-get_named_reg(char *name, struct trapframe *fp)
+get_named_reg(char *name, Context *ctx)
{
int i;
for (i = 0; i < NR_REGS; i++)
if (strcmp(name, regnames[i]) == 0)
- return &fp->r[i];
+ return &ctx->r[i];
return NULL;
}
diff --git a/src/kernel/panic.c b/src/kernel/panic.c
@@ -45,35 +45,35 @@ const char *const regnames[] = {
};
void
-dumpregs(struct trapframe *fp, int fd)
+dumpregs(Context *ctx, int fd)
{
int i;
for (i = 0; i < NR_REGS; i++)
- kprint(fd, "%s=0x%llx%c", regnames[i], fp->r[i],
+ kprint(fd, "%s=0x%llx%c", regnames[i], ctx->r[i],
(i > 0 && i % 3 == 0) ? '\n' : ' ');
if (i % 4 != 3)
kputc(fd, '\n');
}
static void
-backtrace(struct trapframe *fp)
+backtrace(Context *ctx)
{
void **bp;
kprint(kerr, "backtrace:\n");
- kprint(kerr, "%0llx\n", fp->r[X30]);
- for (bp = (void **) fp->r[X29]; *bp; bp = (void **) *bp)
+ kprint(kerr, "%0llx\n", ctx->r[X30]);
+ for (bp = (void **) ctx->r[X29]; *bp; bp = (void **) *bp)
kprint(kerr, "%p\n", bp[1]);
}
static void
-dumpstack(struct trapframe *fp)
+dumpstack(Context *ctx)
{
long long *sp, i;
kprint(kerr, "stack dump:\n");
- sp = (long long *)fp->r[SP];
+ sp = (long long *) ctx->r[SP];
for (i = 1; i <= 16; i++)
kprint(kerr, "%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' ');
}
diff --git a/src/kernel/svc.c b/src/kernel/svc.c
@@ -17,33 +17,33 @@ halt(void)
}
void
-swtch(struct trapframe *fp)
+swtch(Context *ctx)
{
if (in_debug)
longjmp(dbgrecover, 1);
- doswtch(fp);
+ doswtch(ctx);
}
void
-trap(struct trapframe *fp)
+trap(Context *ctx)
{
enum ecvals ec;
const char *msg;
int numsvc;
dbg(kerr, "exception handler\n");
- ec = (fp->r[ESR] >> 26) & 0x3f;
+ ec = (ctx->r[ESR] >> 26) & 0x3f;
if (ec != SVC) {
msg = (ec < NR_EC_VALS) ? ecstr[ec] : "unknown reason";
panic(msg);
}
- numsvc = fp->r[ESR] & 0xff;
- framep = fp;
+ numsvc = ctx->r[ESR] & 0xff;
+ framep = ctx;
svc(numsvc);
- swtch(fp);
+ swtch(ctx);
}
void