diff options
-rw-r--r-- | arch/x86/include/asm/entry_arch.h | 5 | ||||
-rw-r--r-- | arch/x86/include/asm/hw_irq.h | 24 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 5 | ||||
-rw-r--r-- | arch/x86/kernel/irqinit.c | 79 |
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) | |||
16 | BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR) | 16 | BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR) |
17 | BUILD_INTERRUPT(reboot_interrupt,REBOOT_VECTOR) | 17 | BUILD_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 | ||
20 | BUILD_INTERRUPT3(invalidate_interrupt\idx, | 22 | BUILD_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); | |||
45 | extern void invalidate_interrupt5(void); | 45 | extern void invalidate_interrupt5(void); |
46 | extern void invalidate_interrupt6(void); | 46 | extern void invalidate_interrupt6(void); |
47 | extern void invalidate_interrupt7(void); | 47 | extern void invalidate_interrupt7(void); |
48 | extern void invalidate_interrupt8(void); | ||
49 | extern void invalidate_interrupt9(void); | ||
50 | extern void invalidate_interrupt10(void); | ||
51 | extern void invalidate_interrupt11(void); | ||
52 | extern void invalidate_interrupt12(void); | ||
53 | extern void invalidate_interrupt13(void); | ||
54 | extern void invalidate_interrupt14(void); | ||
55 | extern void invalidate_interrupt15(void); | ||
56 | extern void invalidate_interrupt16(void); | ||
57 | extern void invalidate_interrupt17(void); | ||
58 | extern void invalidate_interrupt18(void); | ||
59 | extern void invalidate_interrupt19(void); | ||
60 | extern void invalidate_interrupt20(void); | ||
61 | extern void invalidate_interrupt21(void); | ||
62 | extern void invalidate_interrupt22(void); | ||
63 | extern void invalidate_interrupt23(void); | ||
64 | extern void invalidate_interrupt24(void); | ||
65 | extern void invalidate_interrupt25(void); | ||
66 | extern void invalidate_interrupt26(void); | ||
67 | extern void invalidate_interrupt27(void); | ||
68 | extern void invalidate_interrupt28(void); | ||
69 | extern void invalidate_interrupt29(void); | ||
70 | extern void invalidate_interrupt30(void); | ||
71 | extern void invalidate_interrupt31(void); | ||
48 | 72 | ||
49 | extern void irq_move_cleanup_interrupt(void); | 73 | extern void irq_move_cleanup_interrupt(void); |
50 | extern void reboot_interrupt(void); | 74 | extern 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 | ||
979 | apicinterrupt (INVALIDATE_TLB_VECTOR_START)+\idx \ | 981 | apicinterrupt (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); |