Re: [tip:x86/mm] x86: Work around old gas bug

From: Shaohua Li
Date: Thu Mar 03 2011 - 00:27:44 EST


On Thu, 2011-03-03 at 00:24 +0800, Andrew Morton wrote:
> On Wed, 2 Mar 2011 11:41:44 +0100 Ingo Molnar <mingo@xxxxxxx> wrote:
>
> > Meanwhile, what i hate more than ugly code repetition is code that does not build at
> > all on akpm's test environment ;-)
>
> I hadn't got around to testing it. Bad news :(
>
Andrew,
can you this on your side? this is what Jan proposed. I can only test a
latest binutils here.

Thanks,
Shaohua

---
arch/x86/include/asm/entry_arch.h | 13 ++++---
arch/x86/include/asm/hw_irq.h | 44 ++++++++++++-------------
arch/x86/kernel/entry_64.S | 13 ++++---
arch/x86/kernel/irqinit.c | 66 +++++++++++++++++++-------------------
4 files changed, 69 insertions(+), 67 deletions(-)

Index: linux/arch/x86/include/asm/entry_arch.h
===================================================================
--- linux.orig/arch/x86/include/asm/entry_arch.h 2011-03-03 11:24:15.000000000 +0800
+++ linux/arch/x86/include/asm/entry_arch.h 2011-03-03 11:29:01.000000000 +0800
@@ -16,13 +16,14 @@ BUILD_INTERRUPT(call_function_single_int
BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR)
BUILD_INTERRUPT(reboot_interrupt,REBOOT_VECTOR)

-.irp idx,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, \
- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
-.if NUM_INVALIDATE_TLB_VECTORS > \idx
-BUILD_INTERRUPT3(invalidate_interrupt\idx,
- (INVALIDATE_TLB_VECTOR_START)+\idx,
+.irpc maj, "01"
+ .irpc min, "0123456789abcdef"
+ .if NUM_INVALIDATE_TLB_VECTORS > 0x\maj\min
+BUILD_INTERRUPT3(invalidate_interrupt\maj\min,
+ (INVALIDATE_TLB_VECTOR_START)+0x\maj\min,
smp_invalidate_interrupt)
-.endif
+ .endif
+ .endr
.endr
#endif

Index: linux/arch/x86/kernel/entry_64.S
===================================================================
--- linux.orig/arch/x86/kernel/entry_64.S 2011-03-03 11:23:57.000000000 +0800
+++ linux/arch/x86/kernel/entry_64.S 2011-03-03 11:29:04.000000000 +0800
@@ -975,12 +975,13 @@ apicinterrupt X86_PLATFORM_IPI_VECTOR \
x86_platform_ipi smp_x86_platform_ipi

#ifdef CONFIG_SMP
-.irp idx,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, \
- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
-.if NUM_INVALIDATE_TLB_VECTORS > \idx
-apicinterrupt (INVALIDATE_TLB_VECTOR_START)+\idx \
- invalidate_interrupt\idx smp_invalidate_interrupt
-.endif
+.irpc maj, "01"
+ .irpc min, "0123456789abcdef"
+ .if NUM_INVALIDATE_TLB_VECTORS > 0x\maj\min
+ apicinterrupt (INVALIDATE_TLB_VECTOR_START)+0x\maj\min \
+ invalidate_interrupt\maj\min smp_invalidate_interrupt
+ .endif
+ .endr
.endr
#endif

Index: linux/arch/x86/include/asm/hw_irq.h
===================================================================
--- linux.orig/arch/x86/include/asm/hw_irq.h 2011-03-03 11:29:42.000000000 +0800
+++ linux/arch/x86/include/asm/hw_irq.h 2011-03-03 11:31:37.000000000 +0800
@@ -37,16 +37,22 @@ extern void reschedule_interrupt(void);
extern void mce_self_interrupt(void);

extern void invalidate_interrupt(void);
-extern void invalidate_interrupt0(void);
-extern void invalidate_interrupt1(void);
-extern void invalidate_interrupt2(void);
-extern void invalidate_interrupt3(void);
-extern void invalidate_interrupt4(void);
-extern void invalidate_interrupt5(void);
-extern void invalidate_interrupt6(void);
-extern void invalidate_interrupt7(void);
-extern void invalidate_interrupt8(void);
-extern void invalidate_interrupt9(void);
+extern void invalidate_interrupt00(void);
+extern void invalidate_interrupt01(void);
+extern void invalidate_interrupt02(void);
+extern void invalidate_interrupt03(void);
+extern void invalidate_interrupt04(void);
+extern void invalidate_interrupt05(void);
+extern void invalidate_interrupt06(void);
+extern void invalidate_interrupt07(void);
+extern void invalidate_interrupt08(void);
+extern void invalidate_interrupt09(void);
+extern void invalidate_interrupt0a(void);
+extern void invalidate_interrupt0b(void);
+extern void invalidate_interrupt0c(void);
+extern void invalidate_interrupt0d(void);
+extern void invalidate_interrupt0e(void);
+extern void invalidate_interrupt0f(void);
extern void invalidate_interrupt10(void);
extern void invalidate_interrupt11(void);
extern void invalidate_interrupt12(void);
@@ -57,18 +63,12 @@ extern void invalidate_interrupt16(void)
extern void invalidate_interrupt17(void);
extern void invalidate_interrupt18(void);
extern void invalidate_interrupt19(void);
-extern void invalidate_interrupt20(void);
-extern void invalidate_interrupt21(void);
-extern void invalidate_interrupt22(void);
-extern void invalidate_interrupt23(void);
-extern void invalidate_interrupt24(void);
-extern void invalidate_interrupt25(void);
-extern void invalidate_interrupt26(void);
-extern void invalidate_interrupt27(void);
-extern void invalidate_interrupt28(void);
-extern void invalidate_interrupt29(void);
-extern void invalidate_interrupt30(void);
-extern void invalidate_interrupt31(void);
+extern void invalidate_interrupt1a(void);
+extern void invalidate_interrupt1b(void);
+extern void invalidate_interrupt1c(void);
+extern void invalidate_interrupt1d(void);
+extern void invalidate_interrupt1e(void);
+extern void invalidate_interrupt1f(void);

extern void irq_move_cleanup_interrupt(void);
extern void reboot_interrupt(void);
Index: linux/arch/x86/kernel/irqinit.c
===================================================================
--- linux.orig/arch/x86/kernel/irqinit.c 2011-03-03 11:32:04.000000000 +0800
+++ linux/arch/x86/kernel/irqinit.c 2011-03-03 11:39:48.000000000 +0800
@@ -165,74 +165,74 @@ static void __init smp_intr_init(void)

/* IPIs for invalidation */
#define ALLOC_INVTLB_VEC(NR) \
- alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+NR, \
+ alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+0x##NR, \
invalidate_interrupt##NR)

switch (NUM_INVALIDATE_TLB_VECTORS) {
default:
- ALLOC_INVTLB_VEC(31);
+ ALLOC_INVTLB_VEC(1f);
case 31:
- ALLOC_INVTLB_VEC(30);
+ ALLOC_INVTLB_VEC(1e);
case 30:
- ALLOC_INVTLB_VEC(29);
+ ALLOC_INVTLB_VEC(1d);
case 29:
- ALLOC_INVTLB_VEC(28);
+ ALLOC_INVTLB_VEC(1c);
case 28:
- ALLOC_INVTLB_VEC(27);
+ ALLOC_INVTLB_VEC(1b);
case 27:
- ALLOC_INVTLB_VEC(26);
+ ALLOC_INVTLB_VEC(1a);
case 26:
- ALLOC_INVTLB_VEC(25);
+ ALLOC_INVTLB_VEC(19);
case 25:
- ALLOC_INVTLB_VEC(24);
+ ALLOC_INVTLB_VEC(18);
case 24:
- ALLOC_INVTLB_VEC(23);
+ ALLOC_INVTLB_VEC(17);
case 23:
- ALLOC_INVTLB_VEC(22);
+ ALLOC_INVTLB_VEC(16);
case 22:
- ALLOC_INVTLB_VEC(21);
+ ALLOC_INVTLB_VEC(15);
case 21:
- ALLOC_INVTLB_VEC(20);
+ ALLOC_INVTLB_VEC(14);
case 20:
- ALLOC_INVTLB_VEC(19);
+ ALLOC_INVTLB_VEC(13);
case 19:
- ALLOC_INVTLB_VEC(18);
+ ALLOC_INVTLB_VEC(12);
case 18:
- ALLOC_INVTLB_VEC(17);
+ ALLOC_INVTLB_VEC(11);
case 17:
- ALLOC_INVTLB_VEC(16);
+ ALLOC_INVTLB_VEC(10);
case 16:
- ALLOC_INVTLB_VEC(15);
+ ALLOC_INVTLB_VEC(0f);
case 15:
- ALLOC_INVTLB_VEC(14);
+ ALLOC_INVTLB_VEC(0e);
case 14:
- ALLOC_INVTLB_VEC(13);
+ ALLOC_INVTLB_VEC(0d);
case 13:
- ALLOC_INVTLB_VEC(12);
+ ALLOC_INVTLB_VEC(0c);
case 12:
- ALLOC_INVTLB_VEC(11);
+ ALLOC_INVTLB_VEC(0b);
case 11:
- ALLOC_INVTLB_VEC(10);
+ ALLOC_INVTLB_VEC(0a);
case 10:
- ALLOC_INVTLB_VEC(9);
+ ALLOC_INVTLB_VEC(09);
case 9:
- ALLOC_INVTLB_VEC(8);
+ ALLOC_INVTLB_VEC(08);
case 8:
- ALLOC_INVTLB_VEC(7);
+ ALLOC_INVTLB_VEC(07);
case 7:
- ALLOC_INVTLB_VEC(6);
+ ALLOC_INVTLB_VEC(06);
case 6:
- ALLOC_INVTLB_VEC(5);
+ ALLOC_INVTLB_VEC(05);
case 5:
- ALLOC_INVTLB_VEC(4);
+ ALLOC_INVTLB_VEC(04);
case 4:
- ALLOC_INVTLB_VEC(3);
+ ALLOC_INVTLB_VEC(03);
case 3:
- ALLOC_INVTLB_VEC(2);
+ ALLOC_INVTLB_VEC(02);
case 2:
- ALLOC_INVTLB_VEC(1);
+ ALLOC_INVTLB_VEC(01);
case 1:
- ALLOC_INVTLB_VEC(0);
+ ALLOC_INVTLB_VEC(00);
break;
}



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/