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"); | 	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 { | struct regbit { | ||||||
| 	unsigned long bit; | 	unsigned long bit; | ||||||
| 	const char *name; | 	const char *name; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user