diff options
author | Andi Kleen <ak@linux.intel.com> | 2013-08-05 18:02:37 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2013-08-06 17:18:23 -0400 |
commit | 1d9090e2fb32c84277cef6e72a21be7f78c929f4 (patch) | |
tree | 89c2cf998589bfb26908794fe22a5d48bebbc80a | |
parent | 9e1a431de08e2a49ca8dab0edc813c8cb96ba369 (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.h | 120 | ||||
-rw-r--r-- | arch/x86/include/asm/irq.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/apic.c | 12 | ||||
-rw-r--r-- | arch/x86/kernel/irq.c | 8 | ||||
-rw-r--r-- | arch/x86/kernel/irq_work.c | 4 | ||||
-rw-r--r-- | arch/x86/kernel/smp.c | 12 |
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 */ |
29 | extern void apic_timer_interrupt(void); | 29 | extern asmlinkage void apic_timer_interrupt(void); |
30 | extern void x86_platform_ipi(void); | 30 | extern asmlinkage void x86_platform_ipi(void); |
31 | extern void kvm_posted_intr_ipi(void); | 31 | extern asmlinkage void kvm_posted_intr_ipi(void); |
32 | extern void error_interrupt(void); | 32 | extern asmlinkage void error_interrupt(void); |
33 | extern void irq_work_interrupt(void); | 33 | extern asmlinkage void irq_work_interrupt(void); |
34 | 34 | ||
35 | extern void spurious_interrupt(void); | 35 | extern asmlinkage void spurious_interrupt(void); |
36 | extern void thermal_interrupt(void); | 36 | extern asmlinkage void thermal_interrupt(void); |
37 | extern void reschedule_interrupt(void); | 37 | extern asmlinkage void reschedule_interrupt(void); |
38 | 38 | ||
39 | extern void invalidate_interrupt(void); | 39 | extern asmlinkage void invalidate_interrupt(void); |
40 | extern void invalidate_interrupt0(void); | 40 | extern asmlinkage void invalidate_interrupt0(void); |
41 | extern void invalidate_interrupt1(void); | 41 | extern asmlinkage void invalidate_interrupt1(void); |
42 | extern void invalidate_interrupt2(void); | 42 | extern asmlinkage void invalidate_interrupt2(void); |
43 | extern void invalidate_interrupt3(void); | 43 | extern asmlinkage void invalidate_interrupt3(void); |
44 | extern void invalidate_interrupt4(void); | 44 | extern asmlinkage void invalidate_interrupt4(void); |
45 | extern void invalidate_interrupt5(void); | 45 | extern asmlinkage void invalidate_interrupt5(void); |
46 | extern void invalidate_interrupt6(void); | 46 | extern asmlinkage void invalidate_interrupt6(void); |
47 | extern void invalidate_interrupt7(void); | 47 | extern asmlinkage void invalidate_interrupt7(void); |
48 | extern void invalidate_interrupt8(void); | 48 | extern asmlinkage void invalidate_interrupt8(void); |
49 | extern void invalidate_interrupt9(void); | 49 | extern asmlinkage void invalidate_interrupt9(void); |
50 | extern void invalidate_interrupt10(void); | 50 | extern asmlinkage void invalidate_interrupt10(void); |
51 | extern void invalidate_interrupt11(void); | 51 | extern asmlinkage void invalidate_interrupt11(void); |
52 | extern void invalidate_interrupt12(void); | 52 | extern asmlinkage void invalidate_interrupt12(void); |
53 | extern void invalidate_interrupt13(void); | 53 | extern asmlinkage void invalidate_interrupt13(void); |
54 | extern void invalidate_interrupt14(void); | 54 | extern asmlinkage void invalidate_interrupt14(void); |
55 | extern void invalidate_interrupt15(void); | 55 | extern asmlinkage void invalidate_interrupt15(void); |
56 | extern void invalidate_interrupt16(void); | 56 | extern asmlinkage void invalidate_interrupt16(void); |
57 | extern void invalidate_interrupt17(void); | 57 | extern asmlinkage void invalidate_interrupt17(void); |
58 | extern void invalidate_interrupt18(void); | 58 | extern asmlinkage void invalidate_interrupt18(void); |
59 | extern void invalidate_interrupt19(void); | 59 | extern asmlinkage void invalidate_interrupt19(void); |
60 | extern void invalidate_interrupt20(void); | 60 | extern asmlinkage void invalidate_interrupt20(void); |
61 | extern void invalidate_interrupt21(void); | 61 | extern asmlinkage void invalidate_interrupt21(void); |
62 | extern void invalidate_interrupt22(void); | 62 | extern asmlinkage void invalidate_interrupt22(void); |
63 | extern void invalidate_interrupt23(void); | 63 | extern asmlinkage void invalidate_interrupt23(void); |
64 | extern void invalidate_interrupt24(void); | 64 | extern asmlinkage void invalidate_interrupt24(void); |
65 | extern void invalidate_interrupt25(void); | 65 | extern asmlinkage void invalidate_interrupt25(void); |
66 | extern void invalidate_interrupt26(void); | 66 | extern asmlinkage void invalidate_interrupt26(void); |
67 | extern void invalidate_interrupt27(void); | 67 | extern asmlinkage void invalidate_interrupt27(void); |
68 | extern void invalidate_interrupt28(void); | 68 | extern asmlinkage void invalidate_interrupt28(void); |
69 | extern void invalidate_interrupt29(void); | 69 | extern asmlinkage void invalidate_interrupt29(void); |
70 | extern void invalidate_interrupt30(void); | 70 | extern asmlinkage void invalidate_interrupt30(void); |
71 | extern void invalidate_interrupt31(void); | 71 | extern asmlinkage void invalidate_interrupt31(void); |
72 | 72 | ||
73 | extern void irq_move_cleanup_interrupt(void); | 73 | extern asmlinkage void irq_move_cleanup_interrupt(void); |
74 | extern void reboot_interrupt(void); | 74 | extern asmlinkage void reboot_interrupt(void); |
75 | extern void threshold_interrupt(void); | 75 | extern asmlinkage void threshold_interrupt(void); |
76 | 76 | ||
77 | extern void call_function_interrupt(void); | 77 | extern asmlinkage void call_function_interrupt(void); |
78 | extern void call_function_single_interrupt(void); | 78 | extern 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; | |||
172 | extern void eisa_set_level_irq(unsigned int irq); | 172 | extern void eisa_set_level_irq(unsigned int irq); |
173 | 173 | ||
174 | /* SMP */ | 174 | /* SMP */ |
175 | extern void smp_apic_timer_interrupt(struct pt_regs *); | 175 | extern __visible void smp_apic_timer_interrupt(struct pt_regs *); |
176 | extern void smp_spurious_interrupt(struct pt_regs *); | 176 | extern __visible void smp_spurious_interrupt(struct pt_regs *); |
177 | extern void smp_x86_platform_ipi(struct pt_regs *); | 177 | extern __visible void smp_x86_platform_ipi(struct pt_regs *); |
178 | extern void smp_error_interrupt(struct pt_regs *); | 178 | extern __visible void smp_error_interrupt(struct pt_regs *); |
179 | #ifdef CONFIG_X86_IO_APIC | 179 | #ifdef CONFIG_X86_IO_APIC |
180 | extern asmlinkage void smp_irq_move_cleanup_interrupt(void); | 180 | extern asmlinkage void smp_irq_move_cleanup_interrupt(void); |
181 | #endif | 181 | #endif |
182 | #ifdef CONFIG_SMP | 182 | #ifdef CONFIG_SMP |
183 | extern void smp_reschedule_interrupt(struct pt_regs *); | 183 | extern __visible void smp_reschedule_interrupt(struct pt_regs *); |
184 | extern void smp_call_function_interrupt(struct pt_regs *); | 184 | extern __visible void smp_call_function_interrupt(struct pt_regs *); |
185 | extern void smp_call_function_single_interrupt(struct pt_regs *); | 185 | extern __visible void smp_call_function_single_interrupt(struct pt_regs *); |
186 | #ifdef CONFIG_X86_32 | 186 | extern __visible void smp_invalidate_interrupt(struct pt_regs *); |
187 | extern void smp_invalidate_interrupt(struct pt_regs *); | ||
188 | #else | ||
189 | extern asmlinkage void smp_invalidate_interrupt(struct pt_regs *); | ||
190 | #endif | ||
191 | #endif | 187 | #endif |
192 | 188 | ||
193 | extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECTOR])(void); | 189 | extern 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); | |||
33 | extern void native_init_IRQ(void); | 33 | extern void native_init_IRQ(void); |
34 | extern bool handle_irq(unsigned irq, struct pt_regs *regs); | 34 | extern bool handle_irq(unsigned irq, struct pt_regs *regs); |
35 | 35 | ||
36 | extern unsigned int do_IRQ(struct pt_regs *regs); | 36 | extern __visible unsigned int do_IRQ(struct pt_regs *regs); |
37 | 37 | ||
38 | /* Interrupt vector management */ | 38 | /* Interrupt vector management */ |
39 | extern DECLARE_BITMAP(used_vectors, NR_VECTORS); | 39 | extern 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 | */ |
916 | void __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 | ||
935 | void __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 | ||
1949 | void 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 | ||
1956 | void 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 | ||
2005 | void 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 | ||
2012 | void 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 | */ |
180 | unsigned 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 | ||
218 | void 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 | */ |
232 | void 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 | ||
250 | void 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 | ||
25 | void 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 | ||
32 | void 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 | ||
259 | void 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 | ||
274 | void 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 | ||
298 | void 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 | ||
305 | void 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 | ||
320 | void 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 | ||
327 | void 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); |