aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/entry_arch.h5
-rw-r--r--arch/x86/include/asm/hw_irq.h24
-rw-r--r--arch/x86/kernel/entry_64.S5
-rw-r--r--arch/x86/kernel/irqinit.c79
4 files changed, 103 insertions, 10 deletions
diff --git a/arch/x86/include/asm/entry_arch.h b/arch/x86/include/asm/entry_arch.h
index 57650ab4a5f5..1cd6d26a0a8d 100644
--- a/arch/x86/include/asm/entry_arch.h
+++ b/arch/x86/include/asm/entry_arch.h
@@ -16,10 +16,13 @@ BUILD_INTERRUPT(call_function_single_interrupt,CALL_FUNCTION_SINGLE_VECTOR)
16BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR) 16BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR)
17BUILD_INTERRUPT(reboot_interrupt,REBOOT_VECTOR) 17BUILD_INTERRUPT(reboot_interrupt,REBOOT_VECTOR)
18 18
19.irpc idx, "01234567" 19.irp idx,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, \
20 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
21.if NUM_INVALIDATE_TLB_VECTORS > \idx
20BUILD_INTERRUPT3(invalidate_interrupt\idx, 22BUILD_INTERRUPT3(invalidate_interrupt\idx,
21 (INVALIDATE_TLB_VECTOR_START)+\idx, 23 (INVALIDATE_TLB_VECTOR_START)+\idx,
22 smp_invalidate_interrupt) 24 smp_invalidate_interrupt)
25.endif
23.endr 26.endr
24#endif 27#endif
25 28
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index 0274ec5a7e62..bb9efe8706e2 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -45,6 +45,30 @@ extern void invalidate_interrupt4(void);
45extern void invalidate_interrupt5(void); 45extern void invalidate_interrupt5(void);
46extern void invalidate_interrupt6(void); 46extern void invalidate_interrupt6(void);
47extern void invalidate_interrupt7(void); 47extern void invalidate_interrupt7(void);
48extern void invalidate_interrupt8(void);
49extern void invalidate_interrupt9(void);
50extern void invalidate_interrupt10(void);
51extern void invalidate_interrupt11(void);
52extern void invalidate_interrupt12(void);
53extern void invalidate_interrupt13(void);
54extern void invalidate_interrupt14(void);
55extern void invalidate_interrupt15(void);
56extern void invalidate_interrupt16(void);
57extern void invalidate_interrupt17(void);
58extern void invalidate_interrupt18(void);
59extern void invalidate_interrupt19(void);
60extern void invalidate_interrupt20(void);
61extern void invalidate_interrupt21(void);
62extern void invalidate_interrupt22(void);
63extern void invalidate_interrupt23(void);
64extern void invalidate_interrupt24(void);
65extern void invalidate_interrupt25(void);
66extern void invalidate_interrupt26(void);
67extern void invalidate_interrupt27(void);
68extern void invalidate_interrupt28(void);
69extern void invalidate_interrupt29(void);
70extern void invalidate_interrupt30(void);
71extern void invalidate_interrupt31(void);
48 72
49extern void irq_move_cleanup_interrupt(void); 73extern void irq_move_cleanup_interrupt(void);
50extern void reboot_interrupt(void); 74extern void reboot_interrupt(void);
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index aed1ffbeb0c9..891268c645ea 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -975,9 +975,12 @@ apicinterrupt X86_PLATFORM_IPI_VECTOR \
975 x86_platform_ipi smp_x86_platform_ipi 975 x86_platform_ipi smp_x86_platform_ipi
976 976
977#ifdef CONFIG_SMP 977#ifdef CONFIG_SMP
978.irpc idx, "01234567" 978.irp idx,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, \
979 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
980.if NUM_INVALIDATE_TLB_VECTORS > \idx
979apicinterrupt (INVALIDATE_TLB_VECTOR_START)+\idx \ 981apicinterrupt (INVALIDATE_TLB_VECTOR_START)+\idx \
980 invalidate_interrupt\idx smp_invalidate_interrupt 982 invalidate_interrupt\idx smp_invalidate_interrupt
983.endif
981.endr 984.endr
982#endif 985#endif
983 986
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c
index c752e973958d..7aad10a63e04 100644
--- a/arch/x86/kernel/irqinit.c
+++ b/arch/x86/kernel/irqinit.c
@@ -164,14 +164,77 @@ static void __init smp_intr_init(void)
164 alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt); 164 alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt);
165 165
166 /* IPIs for invalidation */ 166 /* IPIs for invalidation */
167 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+0, invalidate_interrupt0); 167#define ALLOC_INVTLB_VEC(NR) \
168 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+1, invalidate_interrupt1); 168 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+NR, \
169 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+2, invalidate_interrupt2); 169 invalidate_interrupt##NR)
170 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+3, invalidate_interrupt3); 170
171 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+4, invalidate_interrupt4); 171 switch (NUM_INVALIDATE_TLB_VECTORS) {
172 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+5, invalidate_interrupt5); 172 default:
173 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+6, invalidate_interrupt6); 173 ALLOC_INVTLB_VEC(31);
174 alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+7, invalidate_interrupt7); 174 case 31:
175 ALLOC_INVTLB_VEC(30);
176 case 30:
177 ALLOC_INVTLB_VEC(29);
178 case 29:
179 ALLOC_INVTLB_VEC(28);
180 case 28:
181 ALLOC_INVTLB_VEC(27);
182 case 27:
183 ALLOC_INVTLB_VEC(26);
184 case 26:
185 ALLOC_INVTLB_VEC(25);
186 case 25:
187 ALLOC_INVTLB_VEC(24);
188 case 24:
189 ALLOC_INVTLB_VEC(23);
190 case 23:
191 ALLOC_INVTLB_VEC(22);
192 case 22:
193 ALLOC_INVTLB_VEC(21);
194 case 21:
195 ALLOC_INVTLB_VEC(20);
196 case 20:
197 ALLOC_INVTLB_VEC(19);
198 case 19:
199 ALLOC_INVTLB_VEC(18);
200 case 18:
201 ALLOC_INVTLB_VEC(17);
202 case 17:
203 ALLOC_INVTLB_VEC(16);
204 case 16:
205 ALLOC_INVTLB_VEC(15);
206 case 15:
207 ALLOC_INVTLB_VEC(14);
208 case 14:
209 ALLOC_INVTLB_VEC(13);
210 case 13:
211 ALLOC_INVTLB_VEC(12);
212 case 12:
213 ALLOC_INVTLB_VEC(11);
214 case 11:
215 ALLOC_INVTLB_VEC(10);
216 case 10:
217 ALLOC_INVTLB_VEC(9);
218 case 9:
219 ALLOC_INVTLB_VEC(8);
220 case 8:
221 ALLOC_INVTLB_VEC(7);
222 case 7:
223 ALLOC_INVTLB_VEC(6);
224 case 6:
225 ALLOC_INVTLB_VEC(5);
226 case 5:
227 ALLOC_INVTLB_VEC(4);
228 case 4:
229 ALLOC_INVTLB_VEC(3);
230 case 3:
231 ALLOC_INVTLB_VEC(2);
232 case 2:
233 ALLOC_INVTLB_VEC(1);
234 case 1:
235 ALLOC_INVTLB_VEC(0);
236 break;
237 }
175 238
176 /* IPI for generic function call */ 239 /* IPI for generic function call */
177 alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); 240 alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt);