[Pdbg] [PATCH] regs: Allow user to opt in to backtrace
Joel Stanley
joel at jms.id.au
Mon Oct 15 12:02:41 AEDT 2018
The backtrace causes us to read memory which appears to have a high
likelihood of causing a checkstop due to an invalid address.
This adds a --backtrace flag to the regs command which enables the
backtrace. By default it is off to protect the user.
Signed-off-by: Joel Stanley <joel at jms.id.au>
---
src/main.c | 2 +-
src/optcmd.h | 20 ++++++++++++++++++++
src/thread.c | 19 +++++++++++++++----
3 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/src/main.c b/src/main.c
index 8b7e2ddae6cc..4966d511c62e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -135,7 +135,7 @@ static struct action actions[] = {
{ "putmem", "<address>", "Write to system memory" },
{ "threadstatus", "", "Print the status of a thread" },
{ "sreset", "", "Reset" },
- { "regs", "", "State" },
+ { "regs", "[--backtrace]", "State (optionally display backtrace)" },
};
static void print_usage(char *pname)
diff --git a/src/optcmd.h b/src/optcmd.h
index e5f688e13ea6..7d1bf2d6613c 100644
--- a/src/optcmd.h
+++ b/src/optcmd.h
@@ -179,6 +179,26 @@ struct optcmd_cmd {
.cmdp = __##cmd_func_, \
}
+/*
+ * Defines a new command taking no arguments or flags.
+ * @cmd_name - name of command used on the command line
+ * @cmd_func - pointer to the function to call for this command
+ */
+#define OPTCMD_DEFINE_CMD_ONLY_FLAGS(cmd_name_, cmd_func_, flag_, flags_) \
+ int cmd_func_(struct flag_); \
+ int __##cmd_func_(void *args[], void *flags[]) \
+ { \
+ struct flag_ flag; \
+ CPPMAGIC_JOIN(, CPPMAGIC_MAP(OPTCMD_CAST_FLAGS, CPPMAGIC_EVAL flags_)) \
+ return cmd_func_(flag); \
+ } \
+ \
+ struct optcmd_cmd optcmd_##cmd_name_ = { \
+ .cmd = #cmd_name_, \
+ .cmdp = __##cmd_func_, \
+ .flags = { CPPMAGIC_MAP(OPTCMD_FLAG, CPPMAGIC_EVAL flags_), {NULL} }, \
+ }
+
optcmd_cmd_t *optcmd_parse(struct optcmd_cmd *cmd, const char *argv[], int argc,
void **args[], void **flags[]);
diff --git a/src/thread.c b/src/thread.c
index d282307374c5..67b6c46443d7 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -188,11 +188,13 @@ static int sreset_thread(struct pdbg_target *thread_target, uint32_t index, uint
static int state_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1)
{
struct thread_regs regs;
+ bool do_backtrace = (bool)unused;
if (ram_state_thread(thread_target, ®s))
return 0;
- dump_stack(®s);
+ if (do_backtrace)
+ dump_stack(®s);
return 1;
}
@@ -227,14 +229,23 @@ static int thread_sreset(void)
}
OPTCMD_DEFINE_CMD(sreset, thread_sreset);
-static int thread_state(void)
+
+struct reg_flags {
+ bool do_backtrace;
+};
+
+#define REG_BACKTRACE_FLAG ("--backtrace", do_backtrace, parse_flag_noarg, false)
+
+static int thread_state(struct reg_flags flags)
{
int err;
- err = for_each_target("thread", state_thread, NULL, NULL);
+ err = for_each_target("thread", state_thread,
+ (uint64_t *)flags.do_backtrace, NULL);
for_each_target_release("thread");
return err;
}
-OPTCMD_DEFINE_CMD(regs, thread_state);
+OPTCMD_DEFINE_CMD_ONLY_FLAGS(regs, thread_state,
+ reg_flags, (REG_BACKTRACE_FLAG));
--
2.17.1
More information about the Pdbg
mailing list