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