----- Original Message -----
 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 
Looks good -- queued for crash-6.0.6.
Thanks,
  Dave
 ---
  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));