9os

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

commit 81a1ca3c74a4ef0b153419e188686f410f4926f3
parent f29e5bde03827ebd9b8217206b91609820e26a36
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date:   Wed,  7 Nov 2018 11:00:50 +0000

[debuglang] Pass trapframe to debug()

This way, we can invoke the debuglang when we get a panic and pass
the real trapframe.

Change-Id: Ia9f331fe200f7868189dd1c45cc6804835f05b55
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>

Diffstat:
March/amd64/ram.c | 4+++-
March/amd64/rom.c | 4+++-
Minclude/rcode.h | 2+-
Msrc/debuglang/debuglang.c | 61+++++++++++++++++++++++++++++--------------------------------
4 files changed, 36 insertions(+), 35 deletions(-)

diff --git a/arch/amd64/ram.c b/arch/amd64/ram.c @@ -3,6 +3,8 @@ int main(int argc, char *argv[]) { - debug(); + struct trapframe frame = { 0 }; + + debug(&frame); return 0; } diff --git a/arch/amd64/rom.c b/arch/amd64/rom.c @@ -3,6 +3,8 @@ int main(int argc, char *argv[]) { - debug(); + struct trapframe frame = { 0 }; + + debug(&frame); return 0; } diff --git a/include/rcode.h b/include/rcode.h @@ -156,7 +156,7 @@ extern _Noreturn void panic(const char *msg); extern void printk(const char * restrict fmt, ...) PRINTKFMT; extern void rmc(Rmucmd *cmd); extern _Noreturn void swtch(struct trapframe *fp); -extern void debug(void); +extern void debug(struct trapframe *fp); /* architectural functions */ extern _Noreturn void halt(void); diff --git a/src/debuglang/debuglang.c b/src/debuglang/debuglang.c @@ -15,7 +15,7 @@ struct cmd { char *name; - int (*eval)(char **argv, int argc, struct trapframe *tf); + int (*eval)(char **argv, int argc, struct trapframe *fp); char *helpmsg; }; @@ -53,7 +53,7 @@ ready(void) } static void -print_tf(struct trapframe *tfp) +print_tf(struct trapframe *fp) { printf(PREFIX "x0=0x%llx\tx1=0x%llx\tx2=0x%llx\tx3=0x%llx\n" PREFIX "x4=0x%llx\tx5=0x%llx\tx6=0x%llx\tx7=0x%llx\n" @@ -65,15 +65,15 @@ print_tf(struct trapframe *tfp) PREFIX "x28=0x%llx\tx29=0x%llx\tx30=0x%llx\telr=%p\n" PREFIX "spsr=0x%llx\tesr=0x%llx\tfar=0x%llx\n" PREFIX "sp=0x%p\n", - tfp->x0, tfp->x1, tfp->x2, tfp->x3, - tfp->x4, tfp->x5, tfp->x6, tfp->x7, - tfp->x8, tfp->x9, tfp->x10, tfp->x11, - tfp->x12, tfp->x13, tfp->x14, tfp->x15, - tfp->x16, tfp->x17, tfp->x18, tfp->x19, - tfp->x20, tfp->x21, tfp->x22, tfp->x23, - tfp->x24, tfp->x25, tfp->x26, tfp->x27, - tfp->x28, tfp->x29, tfp->x30, tfp->elr, - tfp->spsr, tfp->esr, tfp->far, tfp->sp); + fp->x0, fp->x1, fp->x2, fp->x3, + fp->x4, fp->x5, fp->x6, fp->x7, + fp->x8, fp->x9, fp->x10, fp->x11, + fp->x12, fp->x13, fp->x14, fp->x15, + fp->x16, fp->x17, fp->x18, fp->x19, + fp->x20, fp->x21, fp->x22, fp->x23, + fp->x24, fp->x25, fp->x26, fp->x27, + fp->x28, fp->x29, fp->x30, fp->elr, + fp->spsr, fp->esr, fp->far, fp->sp); } /* Read a value in a given base between 2 and 16 0 means default base; @@ -95,7 +95,7 @@ base_read(char *str, int base) /* Get reg struct for named reg */ static unsigned long long * -get_named_reg(char *name, struct trapframe *tfp) +get_named_reg(char *name, struct trapframe *fp) { char *regptr; const struct named_reg *rp; @@ -103,7 +103,7 @@ get_named_reg(char *name, struct trapframe *tfp) regptr = NULL; for (rp = named_regs; rp->name; ++rp) { if (strcmp(name, rp->name) == 0) { - regptr = (char *) tfp; + regptr = (char *) fp; regptr += rp->offset; } } @@ -135,13 +135,13 @@ get_cmd(char *name) } static int -do_set(char **argv, int argc, struct trapframe *tfp) +do_set(char **argv, int argc, struct trapframe *fp) { unsigned long long *reg = NULL; unsigned long long setval = 0; unsigned int base; - reg = get_named_reg(argv[1], tfp); + reg = get_named_reg(argv[1], fp); if (reg == NULL) error("Register '%s' not found\n", argv[1]); @@ -162,12 +162,12 @@ do_set(char **argv, int argc, struct trapframe *tfp) } static int -do_get(char **argv, int argc, struct trapframe *tfp) +do_get(char **argv, int argc, struct trapframe *fp) { unsigned long long *reg = NULL; char *fmt; - reg = get_named_reg(argv[1], tfp); + reg = get_named_reg(argv[1], fp); if (reg == NULL) error("Register '%s' not found\n", argv[1]); @@ -196,21 +196,21 @@ do_get(char **argv, int argc, struct trapframe *tfp) } static int -do_dump(char **argv, int argc, struct trapframe *tfp) +do_dump(char **argv, int argc, struct trapframe *fp) { - print_tf(tfp); + print_tf(fp); return 0; } static int -do_trap(char **argv, int argc, struct trapframe *tfp) +do_trap(char **argv, int argc, struct trapframe *fp) { - trap(tfp); + trap(fp); return 0; } static int -do_rmc(char **argv, int argc, struct trapframe *tfp) +do_rmc(char **argv, int argc, struct trapframe *fp) { unsigned char class; unsigned char func; @@ -237,15 +237,15 @@ do_rmc(char **argv, int argc, struct trapframe *tfp) error("Invalid number of parameters for rmc\n"); } dbg("class: %d,func:%d\n", class, func); - tfp->esr = (unsigned long long) RMC << 26; - tfp->esr |= class; - tfp->esr |= (func << 8); - trap(tfp); + fp->esr = (unsigned long long) RMC << 26; + fp->esr |= class; + fp->esr |= (func << 8); + trap(fp); return 0; } static int -do_help(char **argv, int argc, struct trapframe *tfp) +do_help(char **argv, int argc, struct trapframe *fp) { const struct cmd *cmd; @@ -302,18 +302,15 @@ run(struct trapframe *tf) } void -debug(void) +debug(struct trapframe *fp) { - struct trapframe tf; - setvbuf(stdin, NULL, _IOLBF, 0); setvbuf(stdout, NULL, _IOLBF, 0); printf("begin debug language interface\n"); - memset(&tf, 0, sizeof(struct trapframe)); setjmp(recover); - for (ready(); run(&tf); ready()) + for (ready(); run(fp); ready()) ; if (ferror(stdout))