[Pdbg] [PATCH 06/10] pdbg: add an expert mode

Alistair Popple alistair at popple.id.au
Tue May 8 12:32:31 AEST 2018


If I read this correctly it looks like this makes every command require expert
mode? Is that because they all assert special wakeup or something?

- Alistair

On Thursday, 3 May 2018 4:26:58 PM AEST Nicholas Piggin wrote:
> Add an --expert mode which contains dangerous options or things which
> are "stateful" between pdbg invocations, where the release command and
> possibly others need to be run to return the system to a normal state.
> 
> If you're not in expert mode, you just run a command and that's it.
> More commands can be added to expert mode as we go.
> 
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
>  libpdbg/libpdbg.c |  2 ++
>  libpdbg/libpdbg.h |  3 +++
>  src/main.c        | 59 +++++++++++++++++++++++++++++++++++++----------
>  3 files changed, 52 insertions(+), 12 deletions(-)
> 
> diff --git a/libpdbg/libpdbg.c b/libpdbg/libpdbg.c
> index 0d91cc3..8162d17 100644
> --- a/libpdbg/libpdbg.c
> +++ b/libpdbg/libpdbg.c
> @@ -4,6 +4,8 @@
>  #include "device.h"
>  #include "libpdbg.h"
>  
> +bool pdbg_expert_mode = false;
> +
>  struct pdbg_target *__pdbg_next_target(const char *class, struct pdbg_target *parent, struct pdbg_target *last)
>  {
>  	struct pdbg_target *next, *tmp;
> diff --git a/libpdbg/libpdbg.h b/libpdbg/libpdbg.h
> index 50baacc..2fec479 100644
> --- a/libpdbg/libpdbg.h
> +++ b/libpdbg/libpdbg.h
> @@ -1,9 +1,12 @@
>  #ifndef __LIBPDBG_H
>  #define __LIBPDBG_H
>  
> +extern bool pdbg_expert_mode;
> +
>  struct pdbg_target;
>  struct pdbg_target_class;
>  
> +
>  struct pdbg_taget *pdbg_root_target;
>  
>  /* loops/iterators */
> diff --git a/src/main.c b/src/main.c
> index 293f4e0..b651395 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -66,12 +66,14 @@ static int threadsel[MAX_PROCESSORS][MAX_CHIPS][MAX_THREADS];
>  static int handle_probe(int optind, int argc, char *argv[]);
>  static int handle_release(int optind, int argc, char *argv[]);
>  
> -static struct {
> +struct action {
>  	const char *name;
>  	const char *args;
>  	const char *desc;
>  	int (*fn)(int, int, char **);
> -} actions[] = {
> +};
> +
> +static struct action expert_actions[] = {
>  	{ "getcfam", "<address>", "Read system cfam", &handle_cfams },
>  	{ "putcfam", "<address> <value> [<mask>]", "Write system cfam", &handle_cfams },
>  	{ "getscom", "<address>", "Read system scom", &handle_scoms },
> @@ -90,7 +92,6 @@ static struct {
>  	{ "start",   "", "Start thread", &thread_start },
>  	{ "step",    "<count>", "Set a thread <count> instructions", &thread_step },
>  	{ "stop",    "", "Stop thread", &thread_stop },
> -	{ "threadstatus", "", "Print the status of a thread", &thread_status_print },
>  	{ "sreset",  "", "Reset", &thread_sreset },
>  	{ "htm_start", "", "[deprecated use 'htm nest start'] Start Nest HTM", &run_htm_start },
>  	{ "htm_stop", "", "[deprecated use 'htm nest stop'] Stop Nest HTM", &run_htm_stop },
> @@ -100,10 +101,15 @@ static struct {
>  	{ "htm_trace", "" , "[deprecated use 'htm nest trace'] Configure and start tracing with HTM", &run_htm_trace },
>  	{ "htm_analyse", "", "[derepcated use 'htm nest analyse'] Stop and dump buffer to file", &run_htm_analyse },
>  	{ "htm", "(core | nest) (start | stop | status | reset | dump | trace | analyse", "Hardware Trace Macro", &run_htm },
> -	{ "probe", "", "", &handle_probe },
>  	{ "release", "", "Should be called after pdbg work is finished, to release special wakeups and other resources.", &handle_release},
>  };
>  
> +static struct action actions[] = {
> +	{ "probe", "", "", &handle_probe },
> +	{ "threadstatus", "", "Print the status of a thread", &thread_status_print },
> +};
> +
> +
>  static void print_usage(char *pname)
>  {
>  	int i;
> @@ -129,12 +135,18 @@ static void print_usage(char *pname)
>  	printf("\t-s, --slave-address=backend device address\n");
>  	printf("\t\tDevice slave address to use for the backend. Not used by FSI\n");
>  	printf("\t\tand defaults to 0x50 for I2C\n");
> +	printf("\t--expert\n");
>  	printf("\t-V, --version\n");
>  	printf("\t-h, --help\n");
>  	printf("\n");
>  	printf(" Commands:\n");
>  	for (i = 0; i < ARRAY_SIZE(actions); i++)
>  		printf("\t%s %s\n", actions[i].name, actions[i].args);
> +	if (pdbg_expert_mode) {
> +		printf(" Expert Commands:\n");
> +		for (i = 0; i < ARRAY_SIZE(expert_actions); i++)
> +			printf("\t%s %s\n", expert_actions[i].name, expert_actions[i].args);
> +	}
>  }
>  
>  static bool parse_options(int argc, char *argv[])
> @@ -152,12 +164,13 @@ static bool parse_options(int argc, char *argv[])
>  		{"slave-address",	required_argument,	NULL,	's'},
>  		{"thread",		required_argument,	NULL,	't'},
>  		{"version",		no_argument,		NULL,	'V'},
> +		{"expert",		no_argument,		NULL,	'E'},
>  		{NULL,			0,			NULL,     0}
>  	};
>  	char *endptr;
>  
>  	do {
> -		c = getopt_long(argc, argv, "+ab:c:d:hp:s:t:V", long_opts, NULL);
> +		c = getopt_long(argc, argv, "+ab:c:d:hp:s:t:VE", long_opts, NULL);
>  		if (c == -1)
>  			break;
>  
> @@ -241,11 +254,15 @@ static bool parse_options(int argc, char *argv[])
>  			break;
>  
>  		case 'V':
> -			errno = 0;
>  			printf("%s (commit %s)\n", PACKAGE_STRING, GIT_SHA1);
>  			exit(1);
>  			break;
>  
> +		case 'E':
> +			opt_error = false;
> +			pdbg_expert_mode = true;
> +			break;
> +
>  		case '?':
>  		case 'h':
>  			opt_error = true;
> @@ -548,6 +565,14 @@ static int handle_probe(int optind, int argc, char *argv[])
>  	return 1;
>  }
>  
> +/*
> + * Release handler for !pdbg_expert_mode
> + */
> +static void atexit_release(void)
> +{
> +	do_release();
> +}
> +
>  static int handle_release(int optind, int argc, char *argv[])
>  {
>  	do_release();
> @@ -589,19 +614,29 @@ int main(int argc, char *argv[])
>  	if (target_selection())
>  		return 1;
>  
> +	if (!pdbg_expert_mode)
> +		atexit(atexit_release);
> +
>  	for (i = 0; i < ARRAY_SIZE(actions); i++) {
>  		if (strcmp(argv[optind], actions[i].name) == 0) {
>  			rc = actions[i].fn(optind, argc, argv);
> -			break;
> +			goto found_action;
>  		}
>  	}
> -
> -	if (i == ARRAY_SIZE(actions)) {
> -		PR_ERROR("Unsupported command: %s\n", argv[optind]);
> -		print_usage(argv[0]);
> -		return 1;
> +	if (pdbg_expert_mode) {
> +		for (i = 0; i < ARRAY_SIZE(expert_actions); i++) {
> +			if (strcmp(argv[optind], expert_actions[i].name) == 0) {
> +				rc = expert_actions[i].fn(optind, argc, argv);
> +				goto found_action;
> +			}
> +		}
>  	}
>  
> +	PR_ERROR("Unsupported command: %s\n", argv[optind]);
> +	print_usage(argv[0]);
> +	return 1;
> +
> +found_action:
>  	if (rc <= 0) {
>                  printf("No valid targets found or specified. Try adding -p/-c/-t options to specify a target.\n");
>                  printf("Alternatively run %s -a probe to get a list of all valid targets\n", argv[0]);
> 




More information about the Pdbg mailing list