patch-2.4.0-test2 linux/arch/alpha/mm/extable.c
Next file: linux/arch/alpha/mm/fault.c
Previous file: linux/arch/alpha/lib/srm_puts.c
Back to the patch index
Back to the overall index
- Lines: 59
- Date:
Mon Jun 19 17:59:33 2000
- Orig file:
v2.4.0-test1/linux/arch/alpha/mm/extable.c
- Orig date:
Thu Jan 23 11:01:28 1997
diff -u --recursive --new-file v2.4.0-test1/linux/arch/alpha/mm/extable.c linux/arch/alpha/mm/extable.c
@@ -36,12 +36,12 @@
register unsigned long gp __asm__("$29");
-unsigned
-search_exception_table(unsigned long addr)
+static unsigned
+search_exception_table_without_gp(unsigned long addr)
{
unsigned ret;
-#ifndef CONFIG_MODULE
+#ifndef CONFIG_MODULES
/* There is only the kernel to search. */
ret = search_one_table(__start___ex_table, __stop___ex_table - 1,
addr - gp);
@@ -57,6 +57,42 @@
if (ret) return ret;
}
#endif
+
+ return 0;
+}
+
+unsigned
+search_exception_table(unsigned long addr, unsigned long exc_gp)
+{
+ unsigned ret;
+
+#ifndef CONFIG_MODULES
+ ret = search_one_table(__start___ex_table, __stop___ex_table - 1,
+ addr - exc_gp);
+ if (ret) return ret;
+#else
+ /* The kernel is the last "module" -- no need to treat it special. */
+ struct module *mp;
+ for (mp = module_list; mp ; mp = mp->next) {
+ if (!mp->ex_table_start)
+ continue;
+ ret = search_one_table(mp->ex_table_start,
+ mp->ex_table_end - 1, addr - exc_gp);
+ if (ret) return ret;
+ }
+#endif
+
+ /*
+ * The search failed with the exception gp. To be safe, try the
+ * old method before giving up.
+ */
+ ret = search_exception_table_without_gp(addr);
+ if (ret) {
+ printk(KERN_ALERT, "%s: [%lx] EX_TABLE search fail with"
+ "exc frame GP, success with raw GP\n",
+ current->comm, addr);
+ return ret;
+ }
return 0;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)