mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 18:53:24 +00:00 
			
		
		
		
	 ae24ffe5ec
			
		
	
	
		ae24ffe5ec
		
	
	
	
	
		
			
			Move the handling of truncated %rip from an iret fault to the fault entry path. This allows x86-64 to use the standard search_extable() function. Signed-off-by: Brian Gerst <brgerst@gmail.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Jan Beulich <jbeulich@novell.com> LKML-Reference: <1255357103-5418-1-git-send-email-brgerst@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
		
			
				
	
	
		
			38 lines
		
	
	
		
			883 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			883 B
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <linux/module.h>
 | |
| #include <linux/spinlock.h>
 | |
| #include <asm/uaccess.h>
 | |
| 
 | |
| 
 | |
| int fixup_exception(struct pt_regs *regs)
 | |
| {
 | |
| 	const struct exception_table_entry *fixup;
 | |
| 
 | |
| #ifdef CONFIG_PNPBIOS
 | |
| 	if (unlikely(SEGMENT_IS_PNP_CODE(regs->cs))) {
 | |
| 		extern u32 pnp_bios_fault_eip, pnp_bios_fault_esp;
 | |
| 		extern u32 pnp_bios_is_utter_crap;
 | |
| 		pnp_bios_is_utter_crap = 1;
 | |
| 		printk(KERN_CRIT "PNPBIOS fault.. attempting recovery.\n");
 | |
| 		__asm__ volatile(
 | |
| 			"movl %0, %%esp\n\t"
 | |
| 			"jmp *%1\n\t"
 | |
| 			: : "g" (pnp_bios_fault_esp), "g" (pnp_bios_fault_eip));
 | |
| 		panic("do_trap: can't hit this");
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| 	fixup = search_exception_tables(regs->ip);
 | |
| 	if (fixup) {
 | |
| 		/* If fixup is less than 16, it means uaccess error */
 | |
| 		if (fixup->fixup < 16) {
 | |
| 			current_thread_info()->uaccess_err = -EFAULT;
 | |
| 			regs->ip += fixup->fixup;
 | |
| 			return 1;
 | |
| 		}
 | |
| 		regs->ip = fixup->fixup;
 | |
| 		return 1;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 |