mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	xtensa: dump userspace code around the exception PC
In the absence of other debug facilities dumping user code around the unhandled exception address may help debugging the issue. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
		
							parent
							
								
									cc34f2909d
								
							
						
					
					
						commit
						f7667ca106
					
				
					 2 changed files with 26 additions and 0 deletions
				
			
		|  | @ -38,3 +38,11 @@ config PRINT_STACK_DEPTH | |||
| 	help | ||||
| 	  This option allows you to set the stack depth that the kernel | ||||
| 	  prints in stack traces. | ||||
| 
 | ||||
| config PRINT_USER_CODE_ON_UNHANDLED_EXCEPTION | ||||
| 	bool "Dump user code around unhandled exception address" | ||||
| 	help | ||||
| 	  Enable this option to display user code around PC of the unhandled | ||||
| 	  exception (starting at address aligned on 16 byte boundary). | ||||
| 	  This may simplify finding faulting code in the absence of other | ||||
| 	  debug facilities. | ||||
|  |  | |||
|  | @ -175,6 +175,23 @@ __die_if_kernel(const char *str, struct pt_regs *regs, long err) | |||
| 		die(str, regs, err); | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_PRINT_USER_CODE_ON_UNHANDLED_EXCEPTION | ||||
| static inline void dump_user_code(struct pt_regs *regs) | ||||
| { | ||||
| 	char buf[32]; | ||||
| 
 | ||||
| 	if (copy_from_user(buf, (void __user *)(regs->pc & -16), sizeof(buf)) == 0) { | ||||
| 		print_hex_dump(KERN_INFO, " ", DUMP_PREFIX_NONE, | ||||
| 			       32, 1, buf, sizeof(buf), false); | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
| #else | ||||
| static inline void dump_user_code(struct pt_regs *regs) | ||||
| { | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Unhandled Exceptions. Kill user task or panic if in kernel space. | ||||
|  */ | ||||
|  | @ -190,6 +207,7 @@ void do_unhandled(struct pt_regs *regs) | |||
| 			    "\tEXCCAUSE is %ld\n", | ||||
| 			    current->comm, task_pid_nr(current), regs->pc, | ||||
| 			    regs->exccause); | ||||
| 	dump_user_code(regs); | ||||
| 	force_sig(SIGILL); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Max Filippov
						Max Filippov