Blame view
arch/frv/mm/extable.c
1.51 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 |
/* * linux/arch/frv/mm/extable.c */ |
1da177e4c Linux-2.6.12-rc2 |
4 5 6 |
#include <linux/module.h> #include <linux/spinlock.h> #include <asm/uaccess.h> |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 |
extern const void __memset_end, __memset_user_error_lr, __memset_user_error_handler; extern const void __memcpy_end, __memcpy_user_error_lr, __memcpy_user_error_handler; extern spinlock_t modlist_lock; |
1da177e4c Linux-2.6.12-rc2 |
10 11 12 13 14 15 16 |
/*****************************************************************************/ /* * see if there's a fixup handler available to deal with a kernel fault */ unsigned long search_exception_table(unsigned long pc) { |
018b8d12b [PATCH] frv: supp... |
17 |
const struct exception_table_entry *extab; |
1da177e4c Linux-2.6.12-rc2 |
18 19 20 21 22 23 24 25 26 27 28 |
/* determine if the fault lay during a memcpy_user or a memset_user */ if (__frame->lr == (unsigned long) &__memset_user_error_lr && (unsigned long) &memset <= pc && pc < (unsigned long) &__memset_end ) { /* the fault occurred in a protected memset * - we search for the return address (in LR) instead of the program counter * - it was probably during a clear_user() */ return (unsigned long) &__memset_user_error_handler; } |
018b8d12b [PATCH] frv: supp... |
29 30 31 32 |
if (__frame->lr == (unsigned long) &__memcpy_user_error_lr && (unsigned long) &memcpy <= pc && pc < (unsigned long) &__memcpy_end ) { |
1da177e4c Linux-2.6.12-rc2 |
33 34 35 36 37 38 |
/* the fault occurred in a protected memset * - we search for the return address (in LR) instead of the program counter * - it was probably during a copy_to/from_user() */ return (unsigned long) &__memcpy_user_error_handler; } |
018b8d12b [PATCH] frv: supp... |
39 40 41 |
extab = search_exception_tables(pc); if (extab) return extab->fixup; |
1da177e4c Linux-2.6.12-rc2 |
42 |
|
018b8d12b [PATCH] frv: supp... |
43 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
44 |
|
1da177e4c Linux-2.6.12-rc2 |
45 |
} /* end search_exception_table() */ |