| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * linux/arch/x86_64/mm/extable.c | 
 | 3 |  */ | 
 | 4 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 5 | #include <linux/module.h> | 
 | 6 | #include <linux/spinlock.h> | 
 | 7 | #include <linux/init.h> | 
 | 8 | #include <asm/uaccess.h> | 
 | 9 |  | 
 | 10 | /* Simple binary search */ | 
 | 11 | const struct exception_table_entry * | 
 | 12 | search_extable(const struct exception_table_entry *first, | 
 | 13 | 	       const struct exception_table_entry *last, | 
 | 14 | 	       unsigned long value) | 
 | 15 | { | 
 | 16 | 	/* Work around a B stepping K8 bug */ | 
 | 17 | 	if ((value >> 32) == 0) | 
 | 18 | 		value |= 0xffffffffUL << 32;  | 
 | 19 |  | 
 | 20 |         while (first <= last) { | 
 | 21 | 		const struct exception_table_entry *mid; | 
 | 22 | 		long diff; | 
 | 23 |  | 
 | 24 | 		mid = (last - first) / 2 + first; | 
 | 25 | 		diff = mid->insn - value; | 
 | 26 |                 if (diff == 0) | 
 | 27 |                         return mid; | 
 | 28 |                 else if (diff < 0) | 
 | 29 |                         first = mid+1; | 
 | 30 |                 else | 
 | 31 |                         last = mid-1; | 
 | 32 |         } | 
 | 33 |         return NULL; | 
 | 34 | } |