9os

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

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:
Mscripts/gendebuglang.sh | 23-----------------------
Msrc/debuglang/debuglang.c | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
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;