commit 915e696751bc000c24c0106ceb8b1b3262695aef
parent bc35d72f75ab87a9fb96cd88d8c37c602ec04d8c
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Tue, 6 Nov 2018 12:57:41 +0000
Merge "[debuglang] Add help command in the debug language"
Diffstat:
2 files changed, 72 insertions(+), 35 deletions(-)
diff --git a/scripts/gendebuglang.sh b/scripts/gendebuglang.sh
@@ -9,29 +9,6 @@ echo "
#define WARN(...) do{fprintf(stderr,\"WARN:\"); fprintf(stderr,__VA_ARGS__);}while(0)
#define ERROR(...) do{fprintf(stderr,\"ERROR:\"); fprintf(stderr,__VA_ARGS__);}while(0)
-extern int do_set( char** parts, int num_parts, struct trapframe* tf);
-extern int do_read( char** parts, int num_parts, struct trapframe* tf);
-extern int do_dump( char** parts, int num_parts, struct trapframe* tf);
-extern int do_trap( char** parts, int num_parts, struct trapframe* tf);
-extern int do_rmc( char** parts, int num_parts, struct trapframe* tf);
-
-enum command_type {SET_CMD,READ_CMD,DUMP_CMD,TRAP_CMD,RMC_CMD};
-
-struct command {
- char* name;
- enum command_type command_type;
- int (*eval)();
-};
-
-const struct command commands[]={
- {\"set\", SET_CMD, do_set},
- {\"read\", READ_CMD, do_read},
- {\"dump\", DUMP_CMD, do_dump},
- {\"trap\", TRAP_CMD, do_trap},
- {\"rmc\", RMC_CMD, do_rmc}
-};
-#define NUM_COMMANDS (sizeof(commands)/sizeof(struct command))
-
struct named_reg {
char* name;
size_t offset;
diff --git a/src/debuglang/debuglang.c b/src/debuglang/debuglang.c
@@ -14,6 +14,55 @@
extern jmp_buf recover;
+static int do_set(char **argv, int argc, struct trapframe *tf);
+static int do_get(char **argv, int argc, struct trapframe *tf);
+static int do_dump(char **argv, int argc, struct trapframe *tf);
+static int do_trap(char **argv, int argc, struct trapframe *tf);
+static int do_rmc(char **argv, int argc, struct trapframe *tf);
+static int do_help(char **argv, int argc, struct trapframe *tf);
+
+struct command {
+ char *name;
+ int (*eval)(char **argv, int argc, struct trapframe *tf);
+ char *helpmsg;
+};
+
+const struct command commands[]={
+ {
+ .name = "set",
+ .eval = do_set,
+ .helpmsg = "Set a register: set <reg> <value>",
+ },
+ {
+ .name = "get",
+ .eval = do_get,
+ .helpmsg = "Get register value: get <reg>",
+ },
+ {
+ .name = "dump",
+ .eval = do_dump,
+ .helpmsg = "Dump trapframe: dump",
+ },
+ {
+ .name = "trap",
+ .eval = do_trap,
+ .helpmsg = "Call trap handler: trap",
+ },
+ {
+ .name = "rmc",
+ .eval = do_rmc,
+ .helpmsg = "Call RMC handler: rmc",
+ },
+ {
+ .name = "help",
+ .eval = do_help,
+ .helpmsg = "Print this help menu: help",
+ },
+ {
+ .name = NULL
+ }
+};
+
static void
error(char *fmt, ...)
{
@@ -78,7 +127,7 @@ base_read(char* str, int base, int *err)
/* Get reg struct for named reg */
unsigned long long*
-get_named_reg(char* name, struct trapframe* tfp)
+get_named_reg(char* name, struct trapframe *tfp)
{
size_t i;
char *regptr;
@@ -111,18 +160,19 @@ get_rmc_cmd(char* name)
static const struct command *
get_command(char* name)
{
- size_t i;
+ const struct command *com;
- for(i=0;i<NUM_COMMANDS;i++){
- if(strcmp(name,commands[i].name)==0){
- return &commands[i];
+ for (com = commands; com->name; com++) {
+ if(strcmp(name, com->name)==0) {
+ return com;
}
}
+
return NULL;
}
int
-do_set(char** argv,int argc, struct trapframe* tfp)
+do_set(char **argv,int argc, struct trapframe *tfp)
{
unsigned long long *reg=NULL;
unsigned long long setval=0;
@@ -160,7 +210,7 @@ do_set(char** argv,int argc, struct trapframe* tfp)
}
int
-do_read(char** argv,int argc, struct trapframe* tfp)
+do_get(char **argv, int argc, struct trapframe *tfp)
{
unsigned long long* reg=NULL;
char* format_string;
@@ -198,21 +248,21 @@ do_read(char** argv,int argc, struct trapframe* tfp)
}
int
-do_dump(char** argv,int argc, struct trapframe* tfp)
+do_dump(char **argv,int argc, struct trapframe *tfp)
{
print_tf(tfp);
return 0;
}
int
-do_trap(char** argv,int argc, struct trapframe* tfp)
+do_trap(char **argv,int argc, struct trapframe *tfp)
{
trap(tfp);
return 0;
}
int
-do_rmc(char** argv,int argc, struct trapframe* tfp)
+do_rmc(char **argv,int argc, struct trapframe *tfp)
{
unsigned char class;
unsigned char func;
@@ -256,12 +306,22 @@ do_rmc(char** argv,int argc, struct trapframe* tfp)
return 0;
}
+static int
+do_help(char **argv, int argc, struct trapframe *tfp)
+{
+ const struct command *com;
+
+ for (com = commands; com->name; com++)
+ printf(PREFIX "%s\n", com->helpmsg);
+ return 0;
+}
+
static void
-parse_cmd(char * cmd, struct trapframe* tfp)
+parse_cmd(char * cmd, struct trapframe *tfp)
{
char *argv[MAX_PARTS], *p;
unsigned argc;
- struct command *com;
+ const struct command *com;
while (isspace(*cmd))
++cmd;