aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@linux.intel.com>2013-08-05 18:02:37 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2013-08-06 17:18:23 -0400
commit1d9090e2fb32c84277cef6e72a21be7f78c929f4 (patch)
tree89c2cf998589bfb26908794fe22a5d48bebbc80a
parent9e1a431de08e2a49ca8dab0edc813c8cb96ba369 (diff)
x86, asmlinkage: Make all interrupt handlers asmlinkage / __visible
These handlers are all referenced from assembler stubs, so need to be visible. The handlers without arguments become asmlinkage, the others __visible to not force regparms(0) on x86-32. I put it all into a single patch, please let me know if you want it it split up. Signed-off-by: Andi Kleen <ak@linux.intel.com> Link: http://lkml.kernel.org/r/1375740170-7446-4-git-send-email-andi@firstfloor.org Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--arch/x86/include/asm/hw_irq.h120
-rw-r--r--arch/x86/include/asm/irq.h2
-rw-r--r--arch/x86/kernel/apic/apic.c12
-rw-r--r--arch/x86/kernel/irq.c8
-rw-r--r--arch/x86/kernel/irq_work.c4
-rw-r--r--arch/x86/kernel/smp.c12
6 files changed, 77 insertions, 81 deletions
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index e4ac559c4a24..92b3bae08b74 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -26,56 +26,56 @@
26#include <asm/sections.h> 26#include <asm/sections.h>
27 27
28/* Interrupt handlers registered during init_IRQ */ 28/* Interrupt handlers registered during init_IRQ */
29extern void apic_timer_interrupt(void); 29extern asmlinkage void apic_timer_interrupt(void);
30extern void x86_platform_ipi(void); 30extern asmlinkage void x86_platform_ipi(void);
31extern void kvm_posted_intr_ipi(void); 31extern asmlinkage void kvm_posted_intr_ipi(void);
32extern void error_interrupt(void); 32extern asmlinkage void error_interrupt(void);
33extern void irq_work_interrupt(void); 33extern asmlinkage void irq_work_interrupt(void);
34 34
35extern void spurious_interrupt(void); 35extern asmlinkage void spurious_interrupt(void);
36extern void thermal_interrupt(void); 36extern asmlinkage void thermal_interrupt(void);
37extern void reschedule_interrupt(void); 37extern asmlinkage void reschedule_interrupt(void);
38 38
39extern void invalidate_interrupt(void); 39extern asmlinkage void invalidate_interrupt(void);
40extern void invalidate_interrupt0(void); 40extern asmlinkage void invalidate_interrupt0(void);
41extern void invalidate_interrupt1(void); 41extern asmlinkage void invalidate_interrupt1(void);
42extern void invalidate_interrupt2(void); 42extern asmlinkage void invalidate_interrupt2(void);
43extern void invalidate_interrupt3(void); 43extern asmlinkage void invalidate_interrupt3(void);
44extern void invalidate_interrupt4(void); 44extern asmlinkage void invalidate_interrupt4(void);
45extern void invalidate_interrupt5(void); 45extern asmlinkage void invalidate_interrupt5(void);
46extern void invalidate_interrupt6(void); 46extern asmlinkage void invalidate_interrupt6(void);
47extern void invalidate_interrupt7(void); 47extern asmlinkage void invalidate_interrupt7(void);
48extern void invalidate_interrupt8(void); 48extern asmlinkage void invalidate_interrupt8(void);
49extern void invalidate_interrupt9(void); 49extern asmlinkage void invalidate_interrupt9(void);
50extern void invalidate_interrupt10(void); 50extern asmlinkage void invalidate_interrupt10(void);
51extern void invalidate_interrupt11(void); 51extern asmlinkage void invalidate_interrupt11(void);
52extern void invalidate_interrupt12(void); 52extern asmlinkage void invalidate_interrupt12(void);
53extern void invalidate_interrupt13(void); 53extern asmlinkage void invalidate_interrupt13(void);
54extern void invalidate_interrupt14(void); 54extern asmlinkage void invalidate_interrupt14(void);
55extern void invalidate_interrupt15(void); 55extern asmlinkage void invalidate_interrupt15(void);
56extern void invalidate_interrupt16(void); 56extern asmlinkage void invalidate_interrupt16(void);
57extern void invalidate_interrupt17(void); 57extern asmlinkage void invalidate_interrupt17(void);
58extern void invalidate_interrupt18(void); 58extern asmlinkage void invalidate_interrupt18(void);
59extern void invalidate_interrupt19(void); 59extern asmlinkage void invalidate_interrupt19(void);
60extern void invalidate_interrupt20(void); 60extern asmlinkage void invalidate_interrupt20(void);
61extern void invalidate_interrupt21(void); 61extern asmlinkage void invalidate_interrupt21(void);
62extern void invalidate_interrupt22(void); 62extern asmlinkage void invalidate_interrupt22(void);
63extern void invalidate_interrupt23(void); 63extern asmlinkage void invalidate_interrupt23(void);
64extern void invalidate_interrupt24(void); 64extern asmlinkage void invalidate_interrupt24(void);
65extern void invalidate_interrupt25(void); 65extern asmlinkage void invalidate_interrupt25(void);
66extern void invalidate_interrupt26(void); 66extern asmlinkage void invalidate_interrupt26(void);
67extern void invalidate_interrupt27(void); 67extern asmlinkage void invalidate_interrupt27(void);
68extern void invalidate_interrupt28(void); 68extern asmlinkage void invalidate_interrupt28(void);
69extern void invalidate_interrupt29(void); 69extern asmlinkage void invalidate_interrupt29(void);
70extern void invalidate_interrupt30(void); 70extern asmlinkage void invalidate_interrupt30(void);
71extern void invalidate_interrupt31(void); 71extern asmlinkage void invalidate_interrupt31(void);
72 72
73extern void irq_move_cleanup_interrupt(void); 73extern asmlinkage void irq_move_cleanup_interrupt(void);
74extern void reboot_interrupt(void); 74extern asmlinkage void reboot_interrupt(void);
75extern void threshold_interrupt(void); 75extern asmlinkage void threshold_interrupt(void);
76 76
77extern void call_function_interrupt(void); 77extern asmlinkage void call_function_interrupt(void);
78extern void call_function_single_interrupt(void); 78extern asmlinkage void call_function_single_interrupt(void);
79 79
80#ifdef CONFIG_TRACING 80#ifdef CONFIG_TRACING
81/* Interrupt handlers registered during init_IRQ */ 81/* Interrupt handlers registered during init_IRQ */
@@ -172,22 +172,18 @@ extern atomic_t irq_mis_count;
172extern void eisa_set_level_irq(unsigned int irq); 172extern void eisa_set_level_irq(unsigned int irq);
173 173
174/* SMP */ 174/* SMP */
175extern void smp_apic_timer_interrupt(struct pt_regs *); 175extern __visible void smp_apic_timer_interrupt(struct pt_regs *);
176extern void smp_spurious_interrupt(struct pt_regs *); 176extern __visible void smp_spurious_interrupt(struct pt_regs *);
177extern void smp_x86_platform_ipi(struct pt_regs *); 177extern __visible void smp_x86_platform_ipi(struct pt_regs *);
178extern void smp_error_interrupt(struct pt_regs *); 178extern __visible void smp_error_interrupt(struct pt_regs *);
179#ifdef CONFIG_X86_IO_APIC 179#ifdef CONFIG_X86_IO_APIC
180extern asmlinkage void smp_irq_move_cleanup_interrupt(void); 180extern asmlinkage void smp_irq_move_cleanup_interrupt(void);
181#endif 181#endif
182#ifdef CONFIG_SMP 182#ifdef CONFIG_SMP
183extern void smp_reschedule_interrupt(struct pt_regs *); 183extern __visible void smp_reschedule_interrupt(struct pt_regs *);
184extern void smp_call_function_interrupt(struct pt_regs *); 184extern __visible void smp_call_function_interrupt(struct pt_regs *);
185extern void smp_call_function_single_interrupt(struct pt_regs *); 185extern __visible void smp_call_function_single_interrupt(struct pt_regs *);
186#ifdef CONFIG_X86_32 186extern __visible void smp_invalidate_interrupt(struct pt_regs *);
187extern void smp_invalidate_interrupt(struct pt_regs *);
188#else
189extern asmlinkage void smp_invalidate_interrupt(struct pt_regs *);
190#endif
191#endif 187#endif
192 188
193extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECTOR])(void); 189extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECTOR])(void);
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h
index 57873beb3292..0ea10f27d613 100644
--- a/arch/x86/include/asm/irq.h
+++ b/arch/x86/include/asm/irq.h
@@ -33,7 +33,7 @@ extern void (*x86_platform_ipi_callback)(void);
33extern void native_init_IRQ(void); 33extern void native_init_IRQ(void);
34extern bool handle_irq(unsigned irq, struct pt_regs *regs); 34extern bool handle_irq(unsigned irq, struct pt_regs *regs);
35 35
36extern unsigned int do_IRQ(struct pt_regs *regs); 36extern __visible unsigned int do_IRQ(struct pt_regs *regs);
37 37
38/* Interrupt vector management */ 38/* Interrupt vector management */
39extern DECLARE_BITMAP(used_vectors, NR_VECTORS); 39extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index eca89c53a7f5..a7eb82d9b012 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -913,7 +913,7 @@ static void local_apic_timer_interrupt(void)
913 * [ if a single-CPU system runs an SMP kernel then we call the local 913 * [ if a single-CPU system runs an SMP kernel then we call the local
914 * interrupt as well. Thus we cannot inline the local irq ... ] 914 * interrupt as well. Thus we cannot inline the local irq ... ]
915 */ 915 */
916void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs) 916__visible void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)
917{ 917{
918 struct pt_regs *old_regs = set_irq_regs(regs); 918 struct pt_regs *old_regs = set_irq_regs(regs);
919 919
@@ -932,7 +932,7 @@ void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)
932 set_irq_regs(old_regs); 932 set_irq_regs(old_regs);
933} 933}
934 934
935void __irq_entry smp_trace_apic_timer_interrupt(struct pt_regs *regs) 935__visible void __irq_entry smp_trace_apic_timer_interrupt(struct pt_regs *regs)
936{ 936{
937 struct pt_regs *old_regs = set_irq_regs(regs); 937 struct pt_regs *old_regs = set_irq_regs(regs);
938 938
@@ -1946,14 +1946,14 @@ static inline void __smp_spurious_interrupt(void)
1946 "should never happen.\n", smp_processor_id()); 1946 "should never happen.\n", smp_processor_id());
1947} 1947}
1948 1948
1949void smp_spurious_interrupt(struct pt_regs *regs) 1949__visible void smp_spurious_interrupt(struct pt_regs *regs)
1950{ 1950{
1951 entering_irq(); 1951 entering_irq();
1952 __smp_spurious_interrupt(); 1952 __smp_spurious_interrupt();
1953 exiting_irq(); 1953 exiting_irq();
1954} 1954}
1955 1955
1956void smp_trace_spurious_interrupt(struct pt_regs *regs) 1956__visible void smp_trace_spurious_interrupt(struct pt_regs *regs)
1957{ 1957{
1958 entering_irq(); 1958 entering_irq();
1959 trace_spurious_apic_entry(SPURIOUS_APIC_VECTOR); 1959 trace_spurious_apic_entry(SPURIOUS_APIC_VECTOR);
@@ -2002,14 +2002,14 @@ static inline void __smp_error_interrupt(struct pt_regs *regs)
2002 2002
2003} 2003}
2004 2004
2005void smp_error_interrupt(struct pt_regs *regs) 2005__visible void smp_error_interrupt(struct pt_regs *regs)
2006{ 2006{
2007 entering_irq(); 2007 entering_irq();
2008 __smp_error_interrupt(regs); 2008 __smp_error_interrupt(regs);
2009 exiting_irq(); 2009 exiting_irq();
2010} 2010}
2011 2011
2012void smp_trace_error_interrupt(struct pt_regs *regs) 2012__visible void smp_trace_error_interrupt(struct pt_regs *regs)
2013{ 2013{
2014 entering_irq(); 2014 entering_irq();
2015 trace_error_apic_entry(ERROR_APIC_VECTOR); 2015 trace_error_apic_entry(ERROR_APIC_VECTOR);
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 3a8185c042a2..22d0687e7fda 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -177,7 +177,7 @@ u64 arch_irq_stat(void)
177 * SMP cross-CPU interrupts have their own specific 177 * SMP cross-CPU interrupts have their own specific
178 * handlers). 178 * handlers).
179 */ 179 */
180unsigned int __irq_entry do_IRQ(struct pt_regs *regs) 180__visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
181{ 181{
182 struct pt_regs *old_regs = set_irq_regs(regs); 182 struct pt_regs *old_regs = set_irq_regs(regs);
183 183
@@ -215,7 +215,7 @@ void __smp_x86_platform_ipi(void)
215 x86_platform_ipi_callback(); 215 x86_platform_ipi_callback();
216} 216}
217 217
218void smp_x86_platform_ipi(struct pt_regs *regs) 218__visible void smp_x86_platform_ipi(struct pt_regs *regs)
219{ 219{
220 struct pt_regs *old_regs = set_irq_regs(regs); 220 struct pt_regs *old_regs = set_irq_regs(regs);
221 221
@@ -229,7 +229,7 @@ void smp_x86_platform_ipi(struct pt_regs *regs)
229/* 229/*
230 * Handler for POSTED_INTERRUPT_VECTOR. 230 * Handler for POSTED_INTERRUPT_VECTOR.
231 */ 231 */
232void smp_kvm_posted_intr_ipi(struct pt_regs *regs) 232__visible void smp_kvm_posted_intr_ipi(struct pt_regs *regs)
233{ 233{
234 struct pt_regs *old_regs = set_irq_regs(regs); 234 struct pt_regs *old_regs = set_irq_regs(regs);
235 235
@@ -247,7 +247,7 @@ void smp_kvm_posted_intr_ipi(struct pt_regs *regs)
247} 247}
248#endif 248#endif
249 249
250void smp_trace_x86_platform_ipi(struct pt_regs *regs) 250__visible void smp_trace_x86_platform_ipi(struct pt_regs *regs)
251{ 251{
252 struct pt_regs *old_regs = set_irq_regs(regs); 252 struct pt_regs *old_regs = set_irq_regs(regs);
253 253
diff --git a/arch/x86/kernel/irq_work.c b/arch/x86/kernel/irq_work.c
index 636a55e4a13c..1de84e3ab4e0 100644
--- a/arch/x86/kernel/irq_work.c
+++ b/arch/x86/kernel/irq_work.c
@@ -22,14 +22,14 @@ static inline void __smp_irq_work_interrupt(void)
22 irq_work_run(); 22 irq_work_run();
23} 23}
24 24
25void smp_irq_work_interrupt(struct pt_regs *regs) 25__visible void smp_irq_work_interrupt(struct pt_regs *regs)
26{ 26{
27 irq_work_entering_irq(); 27 irq_work_entering_irq();
28 __smp_irq_work_interrupt(); 28 __smp_irq_work_interrupt();
29 exiting_irq(); 29 exiting_irq();
30} 30}
31 31
32void smp_trace_irq_work_interrupt(struct pt_regs *regs) 32__visible void smp_trace_irq_work_interrupt(struct pt_regs *regs)
33{ 33{
34 irq_work_entering_irq(); 34 irq_work_entering_irq();
35 trace_irq_work_entry(IRQ_WORK_VECTOR); 35 trace_irq_work_entry(IRQ_WORK_VECTOR);
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index cdaa347dfcad..7c3a5a61f2e4 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -256,7 +256,7 @@ static inline void __smp_reschedule_interrupt(void)
256 scheduler_ipi(); 256 scheduler_ipi();
257} 257}
258 258
259void smp_reschedule_interrupt(struct pt_regs *regs) 259__visible void smp_reschedule_interrupt(struct pt_regs *regs)
260{ 260{
261 ack_APIC_irq(); 261 ack_APIC_irq();
262 __smp_reschedule_interrupt(); 262 __smp_reschedule_interrupt();
@@ -271,7 +271,7 @@ static inline void smp_entering_irq(void)
271 irq_enter(); 271 irq_enter();
272} 272}
273 273
274void smp_trace_reschedule_interrupt(struct pt_regs *regs) 274__visible void smp_trace_reschedule_interrupt(struct pt_regs *regs)
275{ 275{
276 /* 276 /*
277 * Need to call irq_enter() before calling the trace point. 277 * Need to call irq_enter() before calling the trace point.
@@ -295,14 +295,14 @@ static inline void __smp_call_function_interrupt(void)
295 inc_irq_stat(irq_call_count); 295 inc_irq_stat(irq_call_count);
296} 296}
297 297
298void smp_call_function_interrupt(struct pt_regs *regs) 298__visible void smp_call_function_interrupt(struct pt_regs *regs)
299{ 299{
300 smp_entering_irq(); 300 smp_entering_irq();
301 __smp_call_function_interrupt(); 301 __smp_call_function_interrupt();
302 exiting_irq(); 302 exiting_irq();
303} 303}
304 304
305void smp_trace_call_function_interrupt(struct pt_regs *regs) 305__visible void smp_trace_call_function_interrupt(struct pt_regs *regs)
306{ 306{
307 smp_entering_irq(); 307 smp_entering_irq();
308 trace_call_function_entry(CALL_FUNCTION_VECTOR); 308 trace_call_function_entry(CALL_FUNCTION_VECTOR);
@@ -317,14 +317,14 @@ static inline void __smp_call_function_single_interrupt(void)
317 inc_irq_stat(irq_call_count); 317 inc_irq_stat(irq_call_count);
318} 318}
319 319
320void smp_call_function_single_interrupt(struct pt_regs *regs) 320__visible void smp_call_function_single_interrupt(struct pt_regs *regs)
321{ 321{
322 smp_entering_irq(); 322 smp_entering_irq();
323 __smp_call_function_single_interrupt(); 323 __smp_call_function_single_interrupt();
324 exiting_irq(); 324 exiting_irq();
325} 325}
326 326
327void smp_trace_call_function_single_interrupt(struct pt_regs *regs) 327__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs)
328{ 328{
329 smp_entering_irq(); 329 smp_entering_irq();
330 trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR); 330 trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);