9os

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

commit 6b03f25de75f1bf33737529975ba0af447051f1a
parent eeb2141290ca7e4c8e814c6aeef2da0f205b864c
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sat,  8 Aug 2020 05:55:30 +0200

kernel: Rework panic implementation

Panic was written based in the exception() function. This
new implementation uses a totally different approach making
simpler the code but duplicating the context saving function.

Change-Id: Iec9cfe509692a112c98c43747a21c36d3a097f9b

Diffstat:
Minclude/9os/9os.h | 4++--
Msrc/kernel/Makefile | 1+
Asrc/kernel/panic.c | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/kernel/svc.c | 118+------------------------------------------------------------------------------
4 files changed, 106 insertions(+), 119 deletions(-)

diff --git a/include/9os/9os.h b/include/9os/9os.h @@ -61,7 +61,7 @@ enum regidx { NR_REGS }; -typedef struct rmucmd Rmucmd; +typedef struct trapframe Context; struct trapframe { unsigned long long r[NR_REGS]; @@ -110,5 +110,5 @@ extern int trylock(mutex_t *m); extern unsigned in_debug; extern jmp_buf dbgrecover; -/* svc.c */ +/* panic.c */ extern const char *const regnames[]; diff --git a/src/kernel/Makefile b/src/kernel/Makefile @@ -3,6 +3,7 @@ PROJECTDIR=../.. include $(PROJECTDIR)/scripts/rules.mk OBJS =\ + panic.o\ svc.o\ ecstr.o\ dlang.o\ diff --git a/src/kernel/panic.c b/src/kernel/panic.c @@ -0,0 +1,102 @@ +#include <libk.h> +#include <9os/9os.h> +#include <9os/kernel.h> + +const char *const regnames[] = { + [X0] = "x0", + [X1] = "x1", + [X2] = "x2", + [X3] = "x3", + [X4] = "x4", + [X5] = "x5", + [X6] = "x6", + [X7] = "x7", + [X8] = "x8", + [X9] = "x9", + [X10] = "x10", + [X11] = "x11", + [X12] = "x12", + [X13] = "x13", + [X14] = "x14", + [X15] = "x15", + [X16] = "x16", + [X17] = "x17", + [X18] = "x18", + [X19] = "x19", + [X20] = "x20", + [X21] = "x21", + [X22] = "x22", + [X23] = "x23", + [X24] = "x24", + [X25] = "x25", + [X26] = "x26", + [X27] = "x27", + [X28] = "x28", + [X29] = "x29", + [ELR] = "elr", + [X30] = "x30", + [SPSR] = "spsr", + [ESR] = "esr", + [SP] = "sp", + [FAR] = "far", + [SCR] = "scr", + [UNUSED] = "unused", + NULL +}; + +void +dumpregs(struct trapframe *fp, int fd) +{ + int i; + + for (i = 0; i < NR_REGS; i++) + kprint(fd, "%s=0x%llx%c", regnames[i], fp->r[i], + (i > 0 && i % 3 == 0) ? '\n' : ' '); + if (i % 4 != 3) + kputc(fd, '\n'); +} + +static void +backtrace(struct trapframe *fp) +{ + 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, "%p\n", bp[1]); +} + +static void +dumpstack(struct trapframe *fp) +{ + long long *sp, i; + + kprint(kerr, "stack dump:\n"); + sp = (long long *)fp->r[SP]; + for (i = 1; i <= 16; i++) + kprint(kerr, "%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' '); +} + +void +panic(const char *msg) +{ + static int inhome; + Context ctx; + + if (in_debug) { + kprint(kerr, "panic: %s\n", msg); + longjmp(dbgrecover, 1); + } + + if (!inhome) { + inhome = 1; + kprint(kerr, "panic: %s\n", msg); + getcontext(&ctx); + dumpregs(&ctx, kerr); + backtrace(&ctx); + dumpstack(&ctx); + } + + halt(); +} diff --git a/src/kernel/svc.c b/src/kernel/svc.c @@ -7,104 +7,6 @@ #include "ec.h" -static unsigned in_panic; -static char *errstr; - -const char *const regnames[] = { - [X0] = "x0", - [X1] = "x1", - [X2] = "x2", - [X3] = "x3", - [X4] = "x4", - [X5] = "x5", - [X6] = "x6", - [X7] = "x7", - [X8] = "x8", - [X9] = "x9", - [X10] = "x10", - [X11] = "x11", - [X12] = "x12", - [X13] = "x13", - [X14] = "x14", - [X15] = "x15", - [X16] = "x16", - [X17] = "x17", - [X18] = "x18", - [X19] = "x19", - [X20] = "x20", - [X21] = "x21", - [X22] = "x22", - [X23] = "x23", - [X24] = "x24", - [X25] = "x25", - [X26] = "x26", - [X27] = "x27", - [X28] = "x28", - [X29] = "x29", - [ELR] = "elr", - [X30] = "x30", - [SPSR] = "spsr", - [ESR] = "esr", - [SP] = "sp", - [FAR] = "far", - [SCR] = "scr", - [UNUSED] = "unused", - NULL -}; - -void -dumpregs(struct trapframe *fp, int fd) -{ - int i; - - for (i = 0; i < NR_REGS; i++) - kprint(fd, "%s=0x%llx%c", regnames[i], fp->r[i], - (i > 0 && i % 3 == 0) ? '\n' : ' '); - if (i % 4 != 3) - kputc(fd, '\n'); -} - -static void -backtrace(struct trapframe *fp) -{ - 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, "%p\n", bp[1]); -} - -static void -dumpstack(struct trapframe *fp) -{ - long long *sp, i; - - kprint(kerr, "stack dump:\n"); - sp = (long long *)fp->r[SP]; - for (i = 1; i <= 16; i++) - kprint(kerr, "%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' '); -} - -static void -panicfmt(const char *msg, struct trapframe *fp) -{ - /* - * check against 1 to be more robust - * against memory corruptions - */ - if (in_panic == 1) { - for (;;) - ; - } - - in_panic = 1; - kprint(kerr, "panic: %s\n", msg); - - dumpregs(fp, kerr); - backtrace(fp); - dumpstack(fp); -} void halt(void) @@ -115,18 +17,6 @@ halt(void) } void -panic(const char *msg) -{ - if (in_debug) { - kprint(kerr, "panic: %s\n", msg); - longjmp(dbgrecover, 1); - } - - errstr = msg; - dopanic(); -} - -void swtch(struct trapframe *fp) { if (in_debug) @@ -141,18 +31,12 @@ trap(struct trapframe *fp) const char *msg; int numsvc; - if (errstr) { - panicfmt(errstr, fp); - halt(); - } dbg(kerr, "exception handler\n"); - ec = (fp->r[ESR] >> 26) & 0x3f; if (ec != SVC) { msg = (ec < NR_EC_VALS) ? ecstr[ec] : "unknown reason"; - panicfmt(msg, fp); - halt(); + panic(msg); } numsvc = fp->r[ESR] & 0xff;