mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 03:13:59 +00:00 
			
		
		
		
	allow bug table entries to use relative pointers (and use it on x86-64)
Impact: reduce bug table size This allows reducing the bug table size by half. Perhaps there are other 64-bit architectures that could also make use of this. Signed-off-by: Jan Beulich <jbeulich@novell.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									85072bd552
								
							
						
					
					
						commit
						b93a531e31
					
				| @ -87,6 +87,10 @@ config GENERIC_IOMAP | ||||
| config GENERIC_BUG | ||||
| 	def_bool y | ||||
| 	depends on BUG | ||||
| 	select GENERIC_BUG_RELATIVE_POINTERS if X86_64 | ||||
| 
 | ||||
| config GENERIC_BUG_RELATIVE_POINTERS | ||||
| 	bool | ||||
| 
 | ||||
| config GENERIC_HWEIGHT | ||||
| 	def_bool y | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
| #ifdef CONFIG_X86_32 | ||||
| # define __BUG_C0	"2:\t.long 1b, %c0\n" | ||||
| #else | ||||
| # define __BUG_C0	"2:\t.quad 1b, %c0\n" | ||||
| # define __BUG_C0	"2:\t.long 1b - 2b, %c0 - 2b\n" | ||||
| #endif | ||||
| 
 | ||||
| #define BUG()							\ | ||||
|  | ||||
| @ -8,9 +8,17 @@ | ||||
| #ifdef CONFIG_GENERIC_BUG | ||||
| #ifndef __ASSEMBLY__ | ||||
| struct bug_entry { | ||||
| #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS | ||||
| 	unsigned long	bug_addr; | ||||
| #else | ||||
| 	signed int	bug_addr_disp; | ||||
| #endif | ||||
| #ifdef CONFIG_DEBUG_BUGVERBOSE | ||||
| #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS | ||||
| 	const char	*file; | ||||
| #else | ||||
| 	signed int	file_disp; | ||||
| #endif | ||||
| 	unsigned short	line; | ||||
| #endif | ||||
| 	unsigned short	flags; | ||||
|  | ||||
							
								
								
									
										19
									
								
								lib/bug.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								lib/bug.c
									
									
									
									
									
								
							| @ -5,6 +5,8 @@ | ||||
| 
 | ||||
|   CONFIG_BUG - emit BUG traps.  Nothing happens without this. | ||||
|   CONFIG_GENERIC_BUG - enable this code. | ||||
|   CONFIG_GENERIC_BUG_RELATIVE_POINTERS - use 32-bit pointers relative to | ||||
| 	the containing struct bug_entry for bug_addr and file. | ||||
|   CONFIG_DEBUG_BUGVERBOSE - emit full file+line information for each BUG | ||||
| 
 | ||||
|   CONFIG_BUG and CONFIG_DEBUG_BUGVERBOSE are potentially user-settable | ||||
| @ -43,6 +45,15 @@ | ||||
| 
 | ||||
| extern const struct bug_entry __start___bug_table[], __stop___bug_table[]; | ||||
| 
 | ||||
| static inline unsigned long bug_addr(const struct bug_entry *bug) | ||||
| { | ||||
| #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS | ||||
| 	return bug->bug_addr; | ||||
| #else | ||||
| 	return (unsigned long)bug + bug->bug_addr_disp; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_MODULES | ||||
| static LIST_HEAD(module_bug_list); | ||||
| 
 | ||||
| @ -55,7 +66,7 @@ static const struct bug_entry *module_find_bug(unsigned long bugaddr) | ||||
| 		unsigned i; | ||||
| 
 | ||||
| 		for (i = 0; i < mod->num_bugs; ++i, ++bug) | ||||
| 			if (bugaddr == bug->bug_addr) | ||||
| 			if (bugaddr == bug_addr(bug)) | ||||
| 				return bug; | ||||
| 	} | ||||
| 	return NULL; | ||||
| @ -108,7 +119,7 @@ const struct bug_entry *find_bug(unsigned long bugaddr) | ||||
| 	const struct bug_entry *bug; | ||||
| 
 | ||||
| 	for (bug = __start___bug_table; bug < __stop___bug_table; ++bug) | ||||
| 		if (bugaddr == bug->bug_addr) | ||||
| 		if (bugaddr == bug_addr(bug)) | ||||
| 			return bug; | ||||
| 
 | ||||
| 	return module_find_bug(bugaddr); | ||||
| @ -133,7 +144,11 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs) | ||||
| 
 | ||||
| 	if (bug) { | ||||
| #ifdef CONFIG_DEBUG_BUGVERBOSE | ||||
| #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS | ||||
| 		file = bug->file; | ||||
| #else | ||||
| 		file = (const char *)bug + bug->file_disp; | ||||
| #endif | ||||
| 		line = bug->line; | ||||
| #endif | ||||
| 		warning = (bug->flags & BUGFLAG_WARNING) != 0; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Jan Beulich
						Jan Beulich