powerpc: Add show_user_instructions()
show_user_instructions() is a slightly modified version of show_instructions() that allows userspace instruction dump. This will be useful within show_signal_msg() to dump userspace instructions of the faulty location. Here is a sample of what show_user_instructions() outputs: pandafault[10850]: code: 4bfffeec 4bfffee8 3c401002 38427f00 fbe1fff8 f821ffc1 7c3f0b78 3d22fffe pandafault[10850]: code: 392988d0 f93f0020 e93f0020 39400048 <99490000> 39200000 7d234b78 383f0040 The current->comm and current->pid printed can serve as a glue that links the instructions dump to its originator, allowing messages to be interleaved in the logs. Signed-off-by: Murilo Opsfelder Araujo <muriloo@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
		
							parent
							
								
									0f642d616b
								
							
						
					
					
						commit
						88b0fe1757
					
				
							
								
								
									
										13
									
								
								arch/powerpc/include/asm/stacktrace.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								arch/powerpc/include/asm/stacktrace.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0 */ | ||||
| /*
 | ||||
|  * Stack trace functions. | ||||
|  * | ||||
|  * Copyright 2018, Murilo Opsfelder Araujo, IBM Corporation. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _ASM_POWERPC_STACKTRACE_H | ||||
| #define _ASM_POWERPC_STACKTRACE_H | ||||
| 
 | ||||
| void show_user_instructions(struct pt_regs *regs); | ||||
| 
 | ||||
| #endif /* _ASM_POWERPC_STACKTRACE_H */ | ||||
| @ -1299,6 +1299,38 @@ static void show_instructions(struct pt_regs *regs) | ||||
| 	pr_cont("\n"); | ||||
| } | ||||
| 
 | ||||
| void show_user_instructions(struct pt_regs *regs) | ||||
| { | ||||
| 	unsigned long pc; | ||||
| 	int i; | ||||
| 
 | ||||
| 	pc = regs->nip - (instructions_to_print * 3 / 4 * sizeof(int)); | ||||
| 
 | ||||
| 	pr_info("%s[%d]: code: ", current->comm, current->pid); | ||||
| 
 | ||||
| 	for (i = 0; i < instructions_to_print; i++) { | ||||
| 		int instr; | ||||
| 
 | ||||
| 		if (!(i % 8) && (i > 0)) { | ||||
| 			pr_cont("\n"); | ||||
| 			pr_info("%s[%d]: code: ", current->comm, current->pid); | ||||
| 		} | ||||
| 
 | ||||
| 		if (probe_kernel_address((unsigned int __user *)pc, instr)) { | ||||
| 			pr_cont("XXXXXXXX "); | ||||
| 		} else { | ||||
| 			if (regs->nip == pc) | ||||
| 				pr_cont("<%08x> ", instr); | ||||
| 			else | ||||
| 				pr_cont("%08x ", instr); | ||||
| 		} | ||||
| 
 | ||||
| 		pc += sizeof(int); | ||||
| 	} | ||||
| 
 | ||||
| 	pr_cont("\n"); | ||||
| } | ||||
| 
 | ||||
| struct regbit { | ||||
| 	unsigned long bit; | ||||
| 	const char *name; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user