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