extable.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1994, 1995, 1996, 1999 by Ralf Baechle
  7.  * Copyright (C) 1999 by Silicon Graphics
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/module.h>
  11. #include <linux/spinlock.h>
  12. #include <asm/uaccess.h>
  13. extern const struct exception_table_entry __start___ex_table[];
  14. extern const struct exception_table_entry __stop___ex_table[];
  15. static inline unsigned long
  16. search_one_table(const struct exception_table_entry *first,
  17.                  const struct exception_table_entry *last,
  18.                  unsigned long value)
  19. {
  20. while (first <= last) {
  21. const struct exception_table_entry *mid;
  22. long diff;
  23. mid = (last - first) / 2 + first;
  24. diff = mid->insn - value;
  25. if (diff == 0)
  26. return mid->nextinsn;
  27. else if (diff < 0)
  28. first = mid+1;
  29. else
  30. last = mid-1;
  31. }
  32. return 0;
  33. }
  34. extern spinlock_t modlist_lock;
  35. unsigned long search_exception_table(unsigned long addr)
  36. {
  37. unsigned long ret = 0;
  38. unsigned long flags;
  39. #ifndef CONFIG_MODULES
  40. /* There is only the kernel to search.  */
  41. ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);
  42. return ret;
  43. #else
  44. /* The kernel is the last "module" -- no need to treat it special.  */
  45. struct module *mp;
  46. spin_lock_irqsave(&modlist_lock, flags);
  47. for (mp = module_list; mp != NULL; mp = mp->next) {
  48. if (mp->ex_table_start == NULL)
  49. continue;
  50. ret = search_one_table(mp->ex_table_start,
  51.        mp->ex_table_end - 1, addr);
  52. if (ret)
  53. break;
  54. }
  55. spin_unlock_irqrestore(&modlist_lock, flags);
  56. return ret;
  57. #endif
  58. }