[Crash-utility] [PATCH] s390x: Print userspace PSW and registers for active tasks

Michael Holzheu holzheu at linux.vnet.ibm.com
Thu Apr 26 17:04:05 UTC 2012


Hi Dave,

Currently when we find a userspace pt_regs at the beginning of the stack,
we print nothing. With this patch the userspace PSW and general purpose
registers are printed.

With this change for the user it is clearer now that the task has
been interrupted while running in userspace.

Example: External interrupt while in userspace

Before change:

 crash> bt -a
 ...
 #1 [176327e08] arch_send_call_function_ipi_mask at 115d80
 #2 [176327e38] do_extint at 10dd82
 #3 [176327eb0] ext_skip at 63e344

After change:

 crash> bt -a
 ...
 #1 [176327e08] arch_send_call_function_ipi_mask at 115d80
 #2 [176327e38] do_extint at 10dd82
 #3 [176327eb0] ext_skip at 63e344
 PSW:  0705e00180000000 0000000080000a16 (userspace)
 GPRS: 0000000000000001 000003ff00647213 000003fffd800000 0000000003710001 
       0000000080000afc 000003fffff77e58 0000000080000bb0 000003fffff781c0 
       00000000800007bc 0000000000000000 0000000080000b44 000003fffff77e58 
       000003fffd7c6000 000003fffd777020 0000000080000b02 000003fffff77e58

Michael
---
 s390x.c |   20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

--- a/s390x.c
+++ b/s390x.c
@@ -978,12 +978,16 @@ static void print_ptregs(struct bt_info
 		return;
 
 	fprintf(fp, " PSW:  %016lx %016lx ", psw_flags, psw_addr);
-	sym = closest_symbol(psw_addr);
-	offs = psw_addr - closest_symbol_value(psw_addr);
-	if (module_symbol(psw_addr, NULL, &lm, NULL, 0))
-		fprintf(fp, "(%s+%ld [%s])\n", sym, offs, lm->mod_name);
-	else
-		fprintf(fp, "(%s+%ld)\n", sym, offs);
+	if (psw_flags & S390X_PSW_MASK_PSTATE) {
+		fprintf(fp, "(user space)\n");
+	} else {
+		sym = closest_symbol(psw_addr);
+		offs = psw_addr - closest_symbol_value(psw_addr);
+		if (module_symbol(psw_addr, NULL, &lm, NULL, 0))
+			fprintf(fp, "(%s+%ld [%s])\n", sym, offs, lm->mod_name);
+		else
+			fprintf(fp, "(%s+%ld)\n", sym, offs);
+	}
 
 	addr = sp + MEMBER_OFFSET("pt_regs", "gprs");
 	for (i = 0; i < 16; i++) {
@@ -1039,8 +1043,10 @@ static unsigned long show_trace(struct b
 			return sp;
 		/* Check for user PSW */
 		reg = readmem_ul(sp + MEMBER_OFFSET("pt_regs", "psw"));
-		if (reg & S390X_PSW_MASK_PSTATE)
+		if (reg & S390X_PSW_MASK_PSTATE) {
+			print_ptregs(bt, sp);
 			return sp;
+		}
 		/* Get new backchain from r15 */
 		reg = readmem_ul(sp + MEMBER_OFFSET("pt_regs", "gprs") +
 				 15 * sizeof(long));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: crash-6.0.5-print-user-pt_regs.patch
Type: text/x-patch
Size: 2395 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/crash-utility/attachments/20120426/dcb9ea1d/attachment.bin>


More information about the Crash-utility mailing list