9os

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

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:
Minclude/9os/9os.h | 78+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Minclude/9os/kernel.h | 4++--
Msrc/kernel/arch/hosted/arch.c | 10+++++-----
Msrc/kernel/arch/hosted/hosted.h | 2+-
Msrc/kernel/arch/hosted/kernel.c | 8++++----
Msrc/kernel/dlang.c | 4++--
Msrc/kernel/panic.c | 14+++++++-------
Msrc/kernel/svc.c | 14+++++++-------
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