patch-2.2.16 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

diff -urN v2.2.15/linux/arch/alpha/mm/extable.c linux/arch/alpha/mm/extable.c
@@ -36,8 +36,8 @@
 
 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;
 
@@ -59,4 +59,39 @@
 #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)