Subject: [patch] Ensure proper section alignment [gcc 3.4]

From: "Maciej W. Rozycki" <[email-masked]>
Date: Mon, 16 Feb 2004 12:11:39 +0100 (CET)

Hello,

 The exception-related sections appear to work with gcc 2.95 by accident 
-- they lack appropriate alignment directives and just happen to be 
properly aligned, at least most of the time.

 With gcc 3.4, this is no longer true -- I get a quick death of the kernel
because of an unaligned trap on an instruction fetch from the ".fixup"
section.  Here's a proposed solution that works for me.  I decided to
request proper alignment explicitly in all bits that refer to one of the
".fixup", "__ex_table" and "__dbe_table" sections.  This way a proper
alignment is set both for the main kernel binary and for modules, and also
of bits get removed in the future.  It should also make no doubt whether
to add an alignment directive or not for one adding code making use of
these sections.

 I've chosen ".p2align" as it has a well-defined platform-independent 
semantics.

 OK to apply?

  Maciej

-- 
+  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
+--------------------------------------------------------------+
+        e-mail: [email-masked], PGP key available        +

patch-mips-2.4.24-pre2-20040116-fixup-3
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/gdb-low.S linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/gdb-low.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/gdb-low.S	2003-02-21 03:56:24.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/gdb-low.S	2004-02-15 04:28:37.000000000 +0000
@@ -336,6 +336,7 @@ LEAF(kgdb_read_byte)
 		li	v0, 0
 		jr	ra
 		.section __ex_table,"a"
+		.p2align PTRLOG
 		PTR	4b, kgdbfault
 		.previous
 		END(kgdb_read_byte)
@@ -345,6 +346,7 @@ LEAF(kgdb_write_byte)
 		li	v0, 0
 		jr	ra
 		.section __ex_table,"a"
+		.p2align PTRLOG
 		PTR	5b, kgdbfault
 		.previous
 		END(kgdb_write_byte)
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/r2300_fpu.S linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/r2300_fpu.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/r2300_fpu.S	2001-04-12 04:25:48.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/r2300_fpu.S	2004-02-15 13:53:28.000000000 +0000
@@ -21,6 +21,7 @@
 #define EX(a,b)							\
 9:	a,##b;							\
 	.section __ex_table,"a";				\
+	.p2align PTRLOG;					\
 	PTR	9b,bad_stack;					\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/r4k_fpu.S linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/r4k_fpu.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/r4k_fpu.S	2001-04-12 04:25:48.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/r4k_fpu.S	2004-02-15 13:53:48.000000000 +0000
@@ -21,6 +21,7 @@
 #define EX(a,b)							\
 9:	a,b;							\
 	.section __ex_table,"a";				\
+	.p2align PTRLOG;					\
 	PTR	9b, fault;					\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/scall_o32.S linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/scall_o32.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/scall_o32.S	2003-10-29 03:56:51.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/scall_o32.S	2004-02-15 04:14:30.000000000 +0000
@@ -189,6 +189,7 @@ stackargs:
 	j	stack_done		# go back
 
 	.section __ex_table,"a"
+	.p2align PTRLOG
 	PTR	1b,bad_stack
 	PTR	2b,bad_stack
 	.previous
@@ -249,6 +250,7 @@ LEAF(mips_atomic_set)
 	beqz	a0, 1b
 
 	.section __ex_table,"a"
+	.p2align PTRLOG
 	PTR	1b, bad_stack
 	PTR	2b, bad_stack
 	.previous
@@ -272,6 +274,7 @@ LEAF(mips_atomic_set)
 2:	sw	a2, (a1)
 
 	.section __ex_table,"a"
+	.p2align PTRLOG
 	PTR	1b, no_mem
 	PTR	2b, no_mem
 	.previous
@@ -340,7 +343,8 @@ LEAF(sys_syscall)
 2:	lw	t3, 20(t0)
 3:	lw	t4, 24(t0)
 
-	.section	__ex_table, "a"
+	.section __ex_table, "a"
+	.p2align PTRLOG
 	.word	1b, efault
 	.word	2b, efault
 	.word	3b, efault
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/traps.c linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/traps.c
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/traps.c	2004-01-10 03:56:33.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/traps.c	2004-02-15 04:01:00.000000000 +0000
@@ -9,7 +9,7 @@
  * Copyright (C) 1999 Silicon Graphics, Inc.
  * Kevin D. Kissell, [email-masked] and Carsten Langgaard, [email-masked]
  * Copyright (C) 2000, 01 MIPS Technologies, Inc.
- * Copyright (C) 2002, 2003  Maciej W. Rozycki
+ * Copyright (C) 2002, 2003, 2004  Maciej W. Rozycki
  */
 #include <linux/config.h>
 #include <linux/init.h>
@@ -20,6 +20,7 @@
 #include <linux/smp_lock.h>
 #include <linux/spinlock.h>
 
+#include <asm/asm.h>
 #include <asm/bootinfo.h>
 #include <asm/branch.h>
 #include <asm/cpu.h>
@@ -282,6 +283,7 @@ void __declare_dbe_table(void)
 {
 	__asm__ __volatile__(
 	".section\t__dbe_table,\"a\"\n\t"
+	".p2align\t" STR(PTRLOG) "\n\t"
 	".previous"
 	);
 }
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/unaligned.c linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/unaligned.c
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/kernel/unaligned.c	2004-01-03 03:56:37.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/kernel/unaligned.c	2004-02-15 04:16:00.000000000 +0000
@@ -85,9 +85,6 @@
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
-#define STR(x)  __STR(x)
-#define __STR(x)  #x
-
 #ifdef CONFIG_PROC_FS
 unsigned long unaligned_instructions;
 #endif
@@ -159,10 +156,12 @@ static inline int emulate_load_store_ins
 			"li\t%1, 0\n"
 			"3:\t.set\tat\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -189,10 +188,12 @@ static inline int emulate_load_store_ins
 #endif
 			"li\t%1, 0\n"
 			"3:\t.section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -223,10 +224,12 @@ static inline int emulate_load_store_ins
 			"li\t%1, 0\n"
 			"3:\t.set\tat\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -263,10 +266,12 @@ static inline int emulate_load_store_ins
 			"dsrl\t%0, %0, 32\n\t"
 			"li\t%1, 0\n"
 			"3:\t.section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -305,10 +310,12 @@ static inline int emulate_load_store_ins
 #endif
 			"li\t%1, 0\n"
 			"3:\t.section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -347,10 +354,12 @@ static inline int emulate_load_store_ins
 			"li\t%0, 0\n"
 			"3:\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%0, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -377,10 +386,12 @@ static inline int emulate_load_store_ins
 			"li\t%0, 0\n"
 			"3:\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%0, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -415,10 +426,12 @@ static inline int emulate_load_store_ins
 			"li\t%0, 0\n"
 			"3:\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%0, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/memcpy.S linux-mips-2.4.24-pre2-20040116/arch/mips/lib/memcpy.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/memcpy.S	2003-06-28 02:56:51.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/lib/memcpy.S	2004-02-15 13:54:06.000000000 +0000
@@ -73,6 +73,7 @@
 #define EXC(inst_reg,addr,handler)		\
 9:	inst_reg, addr;				\
 	.section __ex_table,"a";		\
+	.p2align PTRLOG;			\
 	PTR	9b, handler;			\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/memset.S linux-mips-2.4.24-pre2-20040116/arch/mips/lib/memset.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/memset.S	2002-08-06 02:57:18.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/lib/memset.S	2004-02-15 13:54:10.000000000 +0000
@@ -12,6 +12,7 @@
 #define EX(insn,reg,addr,handler)			\
 9:	insn	reg, addr;				\
 	.section __ex_table,"a"; 			\
+	.p2align PTRLOG;				\
 	PTR	9b, handler; 				\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/strlen_user.S linux-mips-2.4.24-pre2-20040116/arch/mips/lib/strlen_user.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/strlen_user.S	2002-07-02 02:57:21.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/lib/strlen_user.S	2004-02-15 13:54:15.000000000 +0000
@@ -14,6 +14,7 @@
 #define EX(insn,reg,addr,handler)			\
 9:	insn	reg, addr;				\
 	.section __ex_table,"a";			\
+	.p2align PTRLOG;				\
 	PTR	9b, handler;				\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/strncpy_user.S linux-mips-2.4.24-pre2-20040116/arch/mips/lib/strncpy_user.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/strncpy_user.S	2001-09-07 04:26:28.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/lib/strncpy_user.S	2004-02-15 13:54:19.000000000 +0000
@@ -13,6 +13,7 @@
 #define EX(insn,reg,addr,handler)			\
 9:	insn	reg, addr;				\
 	.section __ex_table,"a";			\
+	.p2align PTRLOG;				\
 	PTR	9b, handler;				\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/strnlen_user.S linux-mips-2.4.24-pre2-20040116/arch/mips/lib/strnlen_user.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips/lib/strnlen_user.S	2002-07-02 02:57:21.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips/lib/strnlen_user.S	2004-02-15 13:54:22.000000000 +0000
@@ -14,6 +14,7 @@
 #define EX(insn,reg,addr,handler)			\
 9:	insn	reg, addr;				\
 	.section __ex_table,"a";			\
+	.p2align PTRLOG;				\
 	PTR	9b, handler;				\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/gdb-low.S linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/gdb-low.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/gdb-low.S	2003-07-15 15:17:59.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/gdb-low.S	2004-02-15 04:21:15.000000000 +0000
@@ -336,6 +336,7 @@ LEAF(kgdb_read_byte)
 		li	v0, 0
 		jr	ra
 		.section __ex_table,"a"
+		.p2align PTRLOG
 		PTR	4b, kgdbfault
 		.previous
 		END(kgdb_read_byte)
@@ -345,6 +346,7 @@ LEAF(kgdb_write_byte)
 		li	v0, 0
 		jr	ra
 		.section __ex_table,"a"
+		.p2align PTRLOG
 		PTR	5b, kgdbfault
 		.previous
 		END(kgdb_write_byte)
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/r4k_fpu.S linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/r4k_fpu.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/r4k_fpu.S	2003-07-16 02:56:44.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/r4k_fpu.S	2004-02-15 04:21:53.000000000 +0000
@@ -25,6 +25,7 @@
 .ex\@:	\insn	\reg, \src
 	.set	pop
 	.section __ex_table,"a"
+	.p2align PTRLOG
 	PTR	.ex\@, fault
 	.previous
 	.endm
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/scall_o32.S linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/scall_o32.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/scall_o32.S	2003-10-16 02:57:04.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/scall_o32.S	2004-02-15 04:22:31.000000000 +0000
@@ -176,6 +176,7 @@ stackargs:
 	j	stack_done		# go back
 
 	.section __ex_table,"a"
+	.p2align PTRLOG
 	PTR	1b, bad_stack
 	PTR	2b, bad_stack
 	.previous
@@ -226,6 +227,7 @@ LEAF(mips_atomic_set)
 	beqz	a0, 1b
 
 	.section __ex_table,"a"
+	.p2align PTRLOG
 	PTR	1b, bad_stack
 	PTR	2b, bad_stack
 	.previous
@@ -292,6 +294,7 @@ LEAF(sys32_syscall)
 3:	lw	t1, 24(t0)
 
 	.section __ex_table,"a"
+	.p2align PTRLOG
 	PTR	1b, efault
 	PTR	2b, efault
 	PTR	3b, efault
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/traps.c linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/traps.c
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/traps.c	2003-12-16 03:57:14.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/traps.c	2004-02-15 04:01:06.000000000 +0000
@@ -9,7 +9,7 @@
  * Copyright (C) 1999 Silicon Graphics, Inc.
  * Kevin D. Kissell, [email-masked] and Carsten Langgaard, [email-masked]
  * Copyright (C) 2000, 01 MIPS Technologies, Inc.
- * Copyright (C) 2002, 2003  Maciej W. Rozycki
+ * Copyright (C) 2002, 2003, 2004  Maciej W. Rozycki
  */
 #include <linux/config.h>
 #include <linux/init.h>
@@ -20,6 +20,7 @@
 #include <linux/smp_lock.h>
 #include <linux/spinlock.h>
 
+#include <asm/asm.h>
 #include <asm/bootinfo.h>
 #include <asm/branch.h>
 #include <asm/cpu.h>
@@ -292,6 +293,7 @@ void __declare_dbe_table(void)
 {
 	__asm__ __volatile__(
 	".section\t__dbe_table,\"a\"\n\t"
+	".p2align\t" STR(PTRLOG) "\n\t"
 	".previous"
 	);
 }
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/unaligned.c linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/unaligned.c
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/kernel/unaligned.c	2004-01-03 03:56:46.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/kernel/unaligned.c	2004-02-15 04:16:20.000000000 +0000
@@ -85,9 +85,6 @@
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
-#define STR(x)  __STR(x)
-#define __STR(x)  #x
-
 #ifdef CONFIG_PROC_FS
 unsigned long unaligned_instructions;
 #endif
@@ -159,10 +156,12 @@ static inline int emulate_load_store_ins
 			"li\t%1, 0\n"
 			"3:\t.set\tat\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -189,10 +188,12 @@ static inline int emulate_load_store_ins
 #endif
 			"li\t%1, 0\n"
 			"3:\t.section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -223,10 +224,12 @@ static inline int emulate_load_store_ins
 			"li\t%1, 0\n"
 			"3:\t.set\tat\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -263,10 +266,12 @@ static inline int emulate_load_store_ins
 			"dsrl\t%0, %0, 32\n\t"
 			"li\t%1, 0\n"
 			"3:\t.section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -305,10 +310,12 @@ static inline int emulate_load_store_ins
 #endif
 			"li\t%1, 0\n"
 			"3:\t.section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%1, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -347,10 +354,12 @@ static inline int emulate_load_store_ins
 			"li\t%0, 0\n"
 			"3:\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%0, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -377,10 +386,12 @@ static inline int emulate_load_store_ins
 			"li\t%0, 0\n"
 			"3:\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%0, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
@@ -415,10 +426,12 @@ static inline int emulate_load_store_ins
 			"li\t%0, 0\n"
 			"3:\n\t"
 			".section\t.fixup,\"ax\"\n\t"
+			".p2align\t2\n"
 			"4:\tli\t%0, %3\n\t"
 			"j\t3b\n\t"
 			".previous\n\t"
 			".section\t__ex_table,\"a\"\n\t"
+			".p2align\t" STR(PTRLOG) "\n\t"
 			STR(PTR)"\t1b, 4b\n\t"
 			STR(PTR)"\t2b, 4b\n\t"
 			".previous"
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/memcpy.S linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/memcpy.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/memcpy.S	2003-06-28 02:56:53.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/memcpy.S	2004-02-15 13:55:03.000000000 +0000
@@ -73,6 +73,7 @@
 #define EXC(inst_reg,addr,handler)		\
 9:	inst_reg, addr;				\
 	.section __ex_table,"a";		\
+	.p2align PTRLOG;			\
 	PTR	9b, handler;			\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/memset.S linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/memset.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/memset.S	2002-08-06 02:57:38.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/memset.S	2004-02-15 13:55:09.000000000 +0000
@@ -15,6 +15,7 @@
 #define EX(insn,reg,addr,handler)			\
 9:	insn	reg, addr;				\
 	.section __ex_table,"a"; 			\
+	.p2align PTRLOG;				\
 	PTR	9b, handler; 				\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/strlen_user.S linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/strlen_user.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/strlen_user.S	2002-12-11 03:56:45.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/strlen_user.S	2004-02-15 13:55:13.000000000 +0000
@@ -14,6 +14,7 @@
 #define EX(insn,reg,addr,handler)			\
 9:	insn	reg, addr;				\
 	.section __ex_table,"a";			\
+	.p2align PTRLOG;				\
 	PTR	9b, handler;				\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/strncpy_user.S linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/strncpy_user.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/strncpy_user.S	2002-12-11 03:56:45.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/strncpy_user.S	2004-02-15 13:55:16.000000000 +0000
@@ -13,6 +13,7 @@
 #define EX(insn,reg,addr,handler)			\
 9:	insn	reg, addr;				\
 	.section __ex_table,"a";			\
+	.p2align PTRLOG;				\
 	PTR	9b, handler;				\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/strnlen_user.S linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/strnlen_user.S
--- linux-mips-2.4.24-pre2-20040116.macro/arch/mips64/lib/strnlen_user.S	2002-12-11 03:56:45.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/arch/mips64/lib/strnlen_user.S	2004-02-15 13:55:20.000000000 +0000
@@ -14,6 +14,7 @@
 #define EX(insn,reg,addr,handler)			\
 9:	insn	reg, addr;				\
 	.section __ex_table,"a";			\
+	.p2align PTRLOG;				\
 	PTR	9b, handler;				\
 	.previous
 
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips/asm.h linux-mips-2.4.24-pre2-20040116/include/asm-mips/asm.h
--- linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips/asm.h	2003-12-31 03:57:05.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/include/asm-mips/asm.h	2004-02-15 04:01:41.000000000 +0000
@@ -29,6 +29,11 @@
 #define CAT(str1,str2) __CAT(str1,str2)
 #endif
 
+#ifndef STR
+#define STR(x) __STR(x)
+#define __STR(x) #x
+#endif
+
 /*
  * PIC specific declarations
  * Not used for the kernel but here seems to be the right place.
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips/paccess.h linux-mips-2.4.24-pre2-20040116/include/asm-mips/paccess.h
--- linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips/paccess.h	2002-07-06 23:48:37.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/include/asm-mips/paccess.h	2004-02-15 05:18:36.000000000 +0000
@@ -14,6 +14,7 @@
 #define _ASM_PACCESS_H
 
 #include <linux/errno.h>
+#include <asm/asm.h>
 
 #define put_dbe(x,ptr) __put_dbe((x),(ptr),sizeof(*(ptr)))
 #define get_dbe(x,ptr) __get_dbe((x),(ptr),sizeof(*(ptr)))
@@ -45,13 +46,15 @@ __asm__ __volatile__( \
 	"1:\tmove\t%0,$0\n" \
 	".set\tpop\n\t" \
 	"2:\n\t" \
-	".section\t.fixup,\"ax\"\n" \
+	".section\t.fixup,\"ax\"\n\t" \
+	".p2align\t2\n" \
 	"3:\tli\t%0,%3\n\t" \
 	"move\t%1,$0\n\t" \
 	"j\t2b\n\t" \
 	".previous\n\t" \
 	".section\t__dbe_table,\"a\"\n\t" \
-	".word\t1b-4,3b\n\t" \
+	".p2align\t" STR(PTRLOG) "\n\t" \
+	STR(PTR) "\t1b-4,3b\n\t" \
 	".previous" \
 	:"=r" (__gu_err), "=r" (__gu_val) \
 	:"o" (__mp(__gu_addr)), "i" (-EFAULT)); })
@@ -82,12 +85,14 @@ __asm__ __volatile__( \
 	"1:\tmove\t%0,$0\n" \
 	".set\tpop\n\t" \
 	"2:\n\t" \
-	".section\t.fixup,\"ax\"\n" \
+	".section\t.fixup,\"ax\"\n\t" \
+	".p2align\t2\n" \
 	"3:\tli\t%0,%3\n\t" \
 	"j\t2b\n\t" \
 	".previous\n\t" \
 	".section\t__dbe_table,\"a\"\n\t" \
-	".word\t1b-4,3b\n\t" \
+	".p2align\t" STR(PTRLOG) "\n\t" \
+	STR(PTR) "\t1b-4,3b\n\t" \
 	".previous" \
 	:"=r" (__pu_err) \
 	:"r" (__pu_val), "o" (__mp(__pu_addr)), "i" (-EFAULT)); })
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips/r4kcache.h linux-mips-2.4.24-pre2-20040116/include/asm-mips/r4kcache.h
--- linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips/r4kcache.h	2004-01-05 03:57:13.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/include/asm-mips/r4kcache.h	2004-02-15 04:24:10.000000000 +0000
@@ -77,6 +77,7 @@ static inline void protected_flush_icach
 		"2:\t.set mips0\n\t"
 		".set reorder\n\t"
 		".section\t__ex_table,\"a\"\n\t"
+		".p2align\t" STR(PTRLOG) "\n\t"
 		STR(PTR)"\t1b,2b\n\t"
 		".previous"
 		:
@@ -98,6 +99,7 @@ static inline void protected_writeback_d
 		"2:\t.set mips0\n\t"
 		".set reorder\n\t"
 		".section\t__ex_table,\"a\"\n\t"
+		".p2align\t" STR(PTRLOG) "\n\t"
 		STR(PTR)"\t1b,2b\n\t"
 		".previous"
 		:
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips/uaccess.h linux-mips-2.4.24-pre2-20040116/include/asm-mips/uaccess.h
--- linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips/uaccess.h	2004-02-13 06:26:20.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/include/asm-mips/uaccess.h	2004-02-15 05:19:03.000000000 +0000
@@ -13,8 +13,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 
-#define STR(x)  __STR(x)
-#define __STR(x)  #x
+#include <asm/asm.h>
 
 /*
  * The fs value determines whether argument validity checking should be
@@ -239,13 +238,15 @@ struct __large_struct { unsigned long bu
 	"1:\t" insn "\t%1,%2\n\t"					\
 	"move\t%0,$0\n"							\
 	"2:\n\t"							\
-	".section\t.fixup,\"ax\"\n"					\
+	".section\t.fixup,\"ax\"\n\t"					\
+	".p2align\t2\n"							\
 	"3:\tli\t%0,%3\n\t"						\
 	"move\t%1,$0\n\t"						\
 	"j\t2b\n\t"							\
 	".previous\n\t"							\
 	".section\t__ex_table,\"a\"\n\t"				\
-	".word\t1b,3b\n\t"						\
+	".p2align\t" STR(PTRLOG) "\n\t"					\
+	STR(PTR) "\t1b,3b\n\t"						\
 	".previous"							\
 	:"=r" (__gu_err), "=r" (__gu_val)				\
 	:"o" (__m(__gu_addr)), "i" (-EFAULT));				\
@@ -260,15 +261,18 @@ __asm__ __volatile__(							\
 	"1:\tlw\t%1,%2\n"						\
 	"2:\tlw\t%D1,%3\n\t"						\
 	"move\t%0,$0\n"							\
-	"3:\t.section\t.fixup,\"ax\"\n"					\
+	"3:\n\t"							\
+	".section\t.fixup,\"ax\"\n\t"					\
+	".p2align\t2\n"							\
 	"4:\tli\t%0,%4\n\t"						\
 	"move\t%1,$0\n\t"						\
 	"move\t%D1,$0\n\t"						\
 	"j\t3b\n\t"							\
 	".previous\n\t"							\
 	".section\t__ex_table,\"a\"\n\t"				\
-	".word\t1b,4b\n\t"						\
-	".word\t2b,4b\n\t"						\
+	".p2align\t" STR(PTRLOG) "\n\t"					\
+	STR(PTR) "\t1b,4b\n\t"						\
+	STR(PTR) "\t2b,4b\n\t"						\
 	".previous"							\
 	:"=r" (__gu_err), "=&r" (__gu_val)				\
 	:"o" (__m(__gu_addr)), "o" (__m(__gu_addr + 4)),		\
@@ -331,12 +335,14 @@ extern void __get_user_unknown(void);
 	"1:\t" insn "\t%z1, %2\t\t\t# __put_user_asm\n\t"		\
 	"move\t%0, $0\n"						\
 	"2:\n\t"							\
-	".section\t.fixup,\"ax\"\n"					\
+	".section\t.fixup,\"ax\"\n\t"					\
+	".p2align\t2\n"							\
 	"3:\tli\t%0, %3\n\t"						\
 	"j\t2b\n\t"							\
 	".previous\n\t"							\
 	".section\t__ex_table,\"a\"\n\t"				\
-	".word\t1b, 3b\n\t"						\
+	".p2align\t" STR(PTRLOG) "\n\t"					\
+	STR(PTR) "\t1b,3b\n\t"						\
 	".previous"							\
 	:"=r" (__pu_err)						\
 	:"Jr" (__pu_val), "o" (__m(__pu_addr)), "i" (-EFAULT));		\
@@ -349,13 +355,15 @@ __asm__ __volatile__(							\
 	"2:\tsw\t%D1, %3\n"						\
 	"move\t%0, $0\n"						\
 	"3:\n\t"							\
-	".section\t.fixup,\"ax\"\n"					\
+	".section\t.fixup,\"ax\"\n\t"					\
+	".p2align\t2\n"							\
 	"4:\tli\t%0, %4\n\t"						\
 	"j\t3b\n\t"							\
 	".previous\n\t"							\
 	".section\t__ex_table,\"a\"\n\t"				\
-	".word\t1b,4b\n\t"						\
-	".word\t2b,4b\n\t"						\
+	".p2align\t" STR(PTRLOG) "\n\t"					\
+	STR(PTR) "\t1b,4b\n\t"						\
+	STR(PTR) "\t2b,4b\n\t"						\
 	".previous"							\
 	:"=r" (__pu_err)						\
 	:"r" (__pu_val), "o" (__m(__pu_addr)), "o" (__m(__pu_addr + 4)),\
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips64/asm.h linux-mips-2.4.24-pre2-20040116/include/asm-mips64/asm.h
--- linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips64/asm.h	2003-12-31 03:57:06.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/include/asm-mips64/asm.h	2004-02-15 04:02:27.000000000 +0000
@@ -29,6 +29,11 @@
 #define CAT(str1,str2) __CAT(str1,str2)
 #endif
 
+#ifndef STR
+#define STR(x) __STR(x)
+#define __STR(x) #x
+#endif
+
 /*
  * PIC specific declarations
  * Not used for the kernel but here seems to be the right place.
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips64/paccess.h linux-mips-2.4.24-pre2-20040116/include/asm-mips64/paccess.h
--- linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips64/paccess.h	2002-07-07 10:08:24.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/include/asm-mips64/paccess.h	2004-02-15 05:18:41.000000000 +0000
@@ -14,6 +14,7 @@
 #define _ASM_PACCESS_H
 
 #include <linux/errno.h>
+#include <asm/asm.h>
 
 #define put_dbe(x,ptr) __put_dbe((x),(ptr),sizeof(*(ptr)))
 #define get_dbe(x,ptr) __get_dbe((x),(ptr),sizeof(*(ptr)))
@@ -42,13 +43,15 @@ __asm__ __volatile__( \
 	"1:\t" insn "\t%1,%2\n\t" \
 	"move\t%0,$0\n" \
 	"2:\n\t" \
-	".section\t.fixup,\"ax\"\n" \
+	".section\t.fixup,\"ax\"\n\t" \
+	".p2align\t2\n" \
 	"3:\tli\t%0,%3\n\t" \
 	"move\t%1,$0\n\t" \
 	"j\t2b\n\t" \
 	".previous\n\t" \
 	".section\t__dbe_table,\"a\"\n\t" \
-	".dword\t1b,3b\n\t" \
+	".p2align\t" STR(PTRLOG) "\n\t" \
+	STR(PTR) "\t1b,3b\n\t" \
 	".previous" \
 	:"=r" (__gu_err), "=r" (__gu_val) \
 	:"o" (__mp(__gu_addr)), "i" (-EFAULT)); })
@@ -76,12 +79,14 @@ __asm__ __volatile__( \
 	"1:\t" insn "\t%1,%2\n\t" \
 	"move\t%0,$0\n" \
 	"2:\n\t" \
-	".section\t.fixup,\"ax\"\n" \
+	".section\t.fixup,\"ax\"\n\t" \
+	".p2align\t2\n" \
 	"3:\tli\t%0,%3\n\t" \
 	"j\t2b\n\t" \
 	".previous\n\t" \
 	".section\t__dbe_table,\"a\"\n\t" \
-	".dword\t1b,3b\n\t" \
+	".p2align\t" STR(PTRLOG) "\n\t" \
+	STR(PTR) "\t1b,3b\n\t" \
 	".previous" \
 	:"=r" (__pu_err) \
 	:"r" (__pu_val), "o" (__mp(__pu_addr)), "i" (-EFAULT)); })
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips64/r4kcache.h linux-mips-2.4.24-pre2-20040116/include/asm-mips64/r4kcache.h
--- linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips64/r4kcache.h	2004-01-05 03:57:15.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/include/asm-mips64/r4kcache.h	2004-02-15 04:24:26.000000000 +0000
@@ -77,6 +77,7 @@ static inline void protected_flush_icach
 		"2:\t.set mips0\n\t"
 		".set reorder\n\t"
 		".section\t__ex_table,\"a\"\n\t"
+		".p2align\t" STR(PTRLOG) "\n\t"
 		STR(PTR)"\t1b,2b\n\t"
 		".previous"
 		:
@@ -98,6 +99,7 @@ static inline void protected_writeback_d
 		"2:\t.set mips0\n\t"
 		".set reorder\n\t"
 		".section\t__ex_table,\"a\"\n\t"
+		".p2align\t" STR(PTRLOG) "\n\t"
 		STR(PTR)"\t1b,2b\n\t"
 		".previous"
 		:
diff -up --recursive --new-file linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips64/uaccess.h linux-mips-2.4.24-pre2-20040116/include/asm-mips64/uaccess.h
--- linux-mips-2.4.24-pre2-20040116.macro/include/asm-mips64/uaccess.h	2003-09-15 02:57:28.000000000 +0000
+++ linux-mips-2.4.24-pre2-20040116/include/asm-mips64/uaccess.h	2004-02-15 05:18:54.000000000 +0000
@@ -13,8 +13,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 
-#define STR(x)  __STR(x)
-#define __STR(x)  #x
+#include <asm/asm.h>
 
 /*
  * The fs value determines whether argument validity checking should be
@@ -229,13 +228,15 @@ struct __large_struct { unsigned long bu
 	"1:\t" insn "\t%1,%2\n\t"					\
 	"move\t%0,$0\n"							\
 	"2:\n\t"							\
-	".section\t.fixup,\"ax\"\n"					\
+	".section\t.fixup,\"ax\"\n\t"					\
+	".p2align\t2\n"							\
 	"3:\tli\t%0,%3\n\t"						\
 	"move\t%1,$0\n\t"						\
 	"j\t2b\n\t"							\
 	".previous\n\t"							\
 	".section\t__ex_table,\"a\"\n\t"				\
-	".dword\t1b,3b\n\t"						\
+	".p2align\t" STR(PTRLOG) "\n\t"					\
+	STR(PTR) "\t1b,3b\n\t"						\
 	".previous"							\
 	:"=r" (__gu_err), "=r" (__gu_val)				\
 	:"o" (__m(__gu_addr)), "i" (-EFAULT));				\
@@ -287,12 +288,14 @@ extern void __get_user_unknown(void);
 	"1:\t" insn "\t%z1, %2\t\t\t# __put_user_asm\n\t"		\
 	"move\t%0, $0\n"						\
 	"2:\n\t"							\
-	".section\t.fixup,\"ax\"\n"					\
+	".section\t.fixup,\"ax\"\n\t"					\
+	".p2align\t2\n"							\
 	"3:\tli\t%0, %3\n\t"						\
 	"j\t2b\n\t"							\
 	".previous\n\t"							\
 	".section\t__ex_table,\"a\"\n\t"				\
-	".dword\t1b, 3b\n\t"						\
+	".p2align\t" STR(PTRLOG) "\n\t"					\
+	STR(PTR) "\t1b,3b\n\t"						\
 	".previous"							\
 	:"=r" (__pu_err)						\
 	:"Jr" (__pu_val), "o" (__m(__pu_addr)), "i" (-EFAULT));		\