git: 28388d8abf8e - stable/12 - ddb: add ability to print user registers
Mitchell Horne
mhorne at FreeBSD.org
Mon Jan 25 13:43:07 UTC 2021
The branch stable/12 has been updated by mhorne:
URL: https://cgit.FreeBSD.org/src/commit/?id=28388d8abf8e2c7ac9247b138479832f96bcddc3
commit 28388d8abf8e2c7ac9247b138479832f96bcddc3
Author: mhorne <mhorne at FreeBSD.org>
AuthorDate: 2020-12-18 20:06:46 +0000
Commit: Mitchell Horne <mhorne at FreeBSD.org>
CommitDate: 2021-01-25 13:41:39 +0000
ddb: add ability to print user registers
Reviewed by: jhb (earlier version), markj, bcr (manpages)
Sponsored by: The FreeBSD Foundation
(cherry picked from commit 088a7eef95b1f1919fe6eee722a57c4d4e1e0656)
---
share/man/man4/ddb.4 | 10 +++-------
sys/ddb/db_print.c | 24 +++++++++++++++++++++++-
2 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/share/man/man4/ddb.4 b/share/man/man4/ddb.4
index 188b5c8fc5ec..28a54a49322d 100644
--- a/share/man/man4/ddb.4
+++ b/share/man/man4/ddb.4
@@ -934,14 +934,10 @@ at address
Display the register set.
If the
.Cm u
-modifier is specified, it displays user registers instead of
-kernel registers or the currently saved one.
+modifier is specified, the register contents of the thread's previous
+trapframe are displayed instead.
+Usually, this corresponds to the saved state from userspace.
.Pp
-.Sy Warning :
-The support of the
-.Cm u
-modifier depends on the machine.
-If not supported, incorrect information will be displayed.
.\"
.Pp
.It Ic show Cm rman Ar addr
diff --git a/sys/ddb/db_print.c b/sys/ddb/db_print.c
index 3ff0b781532d..da929457984d 100644
--- a/sys/ddb/db_print.c
+++ b/sys/ddb/db_print.c
@@ -49,12 +49,32 @@ __FBSDID("$FreeBSD$");
#include <ddb/db_sym.h>
void
-db_show_regs(db_expr_t _1, bool _2, db_expr_t _3, char *_4)
+db_show_regs(db_expr_t _1, bool _2, db_expr_t _3, char *modif)
{
+ struct trapframe *oldtf;
struct db_variable *regp;
db_expr_t value, offset;
const char *name;
+ /*
+ * The 'u' modifier instructs us to print the previous trapframe, most
+ * often containing state from userspace. This is done by temporarily
+ * switching out kdb_frame.
+ *
+ * NB: curthread is used instead of kdb_thread, so that behaviour is
+ * consistent with regular `show registers`, which always prints
+ * curthread's trapframe.
+ */
+ oldtf = kdb_frame;
+ if (modif[0] == 'u') {
+ if (curthread->td_frame == NULL ||
+ curthread->td_frame == oldtf) {
+ db_printf("previous trapframe unavailable");
+ return;
+ }
+ kdb_frame = curthread->td_frame;
+ }
+
for (regp = db_regs; regp < db_eregs; regp++) {
if (!db_read_variable(regp, &value))
continue;
@@ -70,4 +90,6 @@ db_show_regs(db_expr_t _1, bool _2, db_expr_t _3, char *_4)
db_printf("\n");
}
db_print_loc_and_inst(PC_REGS());
+
+ kdb_frame = oldtf;
}
More information about the dev-commits-src-all
mailing list