Re: [patch] 2.6.1-mm5 compile do not use shared extable code for ia64

From: David Mosberger <davidm_at_napali.hpl.hp.com>
Date: 2004-01-24 14:00:34
>>>>> On Tue, 20 Jan 2004 09:00:04 -0800, Andrew Morton <akpm@osdl.org> said:

  Andrew> Jes Sorensen <jes@trained-monkey.org> wrote:
  >>  The new sort_extable and shares search_extable code doesn't work
  >> on ia64.

  Andrew> hm, OK.  It would be nice if ia64 could use the generic code
  Andrew> at some stage, of course.

How about something along these lines?  If you want to standardize on
a single instruction-address format, I'd strongly favor using the
location-relative addresses used on Alpha and ia64 (it makes no sense
to uses a full 64-bit address for those members).

	--david

===== lib/extable.c 1.3 vs edited =====
--- 1.3/lib/extable.c	Tue Jan 20 17:58:55 2004
+++ edited/lib/extable.c	Fri Jan 23 18:10:10 2004
@@ -19,6 +19,12 @@
 extern struct exception_table_entry __stop___ex_table[];
 
 #ifndef ARCH_HAS_SORT_EXTABLE
+
+# ifndef exception_table_entry_insn
+   /* Return the instruction address to which exception tabl entry E applies.  */
+#  define exception_table_entry_insn(e)	((e)->insn)
+# endif
+
 /*
  * The exception table needs to be sorted so that the binary
  * search that we use to find entries in it works properly.
@@ -33,7 +39,7 @@
 	/* insertion sort */
 	for (p = start + 1; p < finish; ++p) {
 		/* start .. p-1 is sorted */
-		if (p[0].insn < p[-1].insn) {
+		if (exception_table_entry_insn(&p[0]) < exception_table_entry_insn(&p[-1])) {
 			/* move element p down to its right place */
 			el = *p;
 			q = p;
@@ -41,7 +47,8 @@
 				/* el comes before q[-1], move q[-1] up one */
 				q[0] = q[-1];
 				--q;
-			} while (q > start && el.insn < q[-1].insn);
+			} while (q > start && (exception_table_entry_insn(&el)
+					       < exception_table_entry_insn(&q[-1])));
 			*q = el;
 		}
 	}
===== include/asm-ia64/uaccess.h 1.16 vs edited =====
--- 1.16/include/asm-ia64/uaccess.h	Fri Jan 23 16:43:32 2004
+++ edited/include/asm-ia64/uaccess.h	Fri Jan 23 18:06:38 2004
@@ -283,13 +283,18 @@
 	__su_ret;						\
 })
 
-#define ARCH_HAS_SORT_EXTABLE
 #define ARCH_HAS_SEARCH_EXTABLE
 
 struct exception_table_entry {
-	int addr;	/* gp-relative address of insn this fixup is for */
-	int cont;	/* gp-relative continuation address; if bit 2 is set, r9 is set to 0 */
+	int addr;	/* loc-relative address of insn this fixup is for */
+	int cont;	/* loc-relative continuation address; if bit 2 is set, r9 is set to 0 */
 };
+
+#define exception_table_entry_insn(e)				\
+({								\
+	const struct exception_table_entry *_etei_e = (e);	\
+	(u64) &(_etei_e)->addr + (_etei_e)->addr;		\
+})
 
 extern void handle_exception (struct pt_regs *regs, const struct exception_table_entry *e);
 extern const struct exception_table_entry *search_exception_tables (unsigned long addr);
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Received on Fri Jan 23 22:01:29 2004

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:21 EST