x86: Clean up asmlinkage use
Subsystems (8)
This patchkit makes the use of asmlinkage consistent in arch/x86 Originally arch/x86 was (mostly) fully annotated with asmlinkage, but this has bitrotted over time.
These changes were originally part of my LTO patchkit. In the interest of making it smaller, I'm posting them separately, as they can be considered cleanups.
By itself they do not improve anything in the existing kernel, except for making things more consistent.
They may be useful for other global compile time instrumentation tools to indicate clearly that some function/variable can be changed outside their view.
---
The goal is to mark every function or variable that can be called from assembler. asmlinkage on 32bit includes regparm(0) so changes semantics. Since I didn't want to audit every caller and make this patchkit a nop by itself, I did not add new asmlinkage to 32bit functions that take parameters. So no existing function switches from regparm(3) to (0).
Instead every function with parameter (and variables) becomes __visible. This is roughly equivalent now to the old "asmregparm" (which was removed some time ago), except it also works for variables.
So in summary the changes are:
- Mark every function without arguments (or 64bit only) that is used by assembler asmlinkage
- Mark every function with parameters or variables that is used by assembler __visible.
I also included a few related fixes with inline assembler and a type fix for the syscall table.
PATCH 1/16 x86: Fix sys_call_table type in asm/syscall.h v2
From: Andi Kleen <[email protected]>
Make the sys_call_table type defined in asm/syscall.h match the definition in syscall_64.c
v2: include asm/syscall.h in syscall_64.c too. I left uml alone because it doesn't have an syscall.h on its own and including the native one leads to other errors.
--- arch/x86/include/asm/syscall.h | 3 ++- arch/x86/kernel/syscall_64.c | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/x86/include/asm/syscall.h +2 -1
@@ -20,7 +20,8 @@#include <asm/thread_info.h> /* for TS_COMPAT */ #include <asm/unistd.h> -extern const unsigned long sys_call_table[]; +typedef void (*sys_call_ptr_t )(void ); +extern const sys_call_ptr_t sys_call_table[];/* * Only the low 32 bits of orig_ax are meaningful, so we return int.
arch/x86/kernel/syscall_64.c +1 -2
@@ -4,6 +4,7 @@#include <linux/sys.h> #include <linux/cache.h> #include <asm/asm-offsets.h> +#include <asm/syscall.h> #define __SYSCALL_COMMON (nr, sym, compat) __SYSCALL_64(nr, sym, compat)
@@ -19,8 +20,6 @@#define __SYSCALL_64 (nr, sym, compat) [nr] = sym, -typedef void (*sys_call_ptr_t )(void ); -extern void sys_ni_syscall (void );const sys_call_ptr_t sys_call_table[__NR_syscall_max+1 ] = {
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86: Fix sys_call_table type in asm/ syscall.h
x86: Fix sys_call_table type in asm/syscall.h
Commit-ID: 1599e8fc84dd9c2954df0d4b2db52f7f6719f339 Gitweb: http://git.kernel.org/tip/1599e8fc84dd9c2954df0d4b2db52f7f6719f339 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:35 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:18:08 -0700
x86: Fix sys_call_table type in asm/syscall.h
Make the sys_call_table type defined in asm/syscall.h match the definition in syscall_64.c
v2: include asm/syscall.h in syscall_64.c too. I left uml alone because it doesn't have an syscall.h on its own and including the native one leads to other errors.
--- arch/x86/include/asm/syscall.h | 3 ++- arch/x86/kernel/syscall_64.c | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/x86/include/asm/syscall.h +2 -1
@@ -20,7 +20,8 @@#include <asm/thread_info.h> /* for TS_COMPAT */ #include <asm/unistd.h> -extern const unsigned long sys_call_table[]; +typedef void (*sys_call_ptr_t )(void ); +extern const sys_call_ptr_t sys_call_table[];/* * Only the low 32 bits of orig_ax are meaningful, so we return int.
arch/x86/kernel/syscall_64.c +1 -2
@@ -4,6 +4,7 @@#include <linux/sys.h> #include <linux/cache.h> #include <asm/asm-offsets.h> +#include <asm/syscall.h> #define __SYSCALL_COMMON (nr, sym, compat) __SYSCALL_64(nr, sym, compat)
@@ -19,8 +20,6 @@#define __SYSCALL_64 (nr, sym, compat) [nr] = sym, -typedef void (*sys_call_ptr_t )(void ); -extern void sys_ni_syscall (void );const sys_call_ptr_t sys_call_table[__NR_syscall_max+1 ] = {
PATCH 2/16 x86, asmlinkage: Change dotraplinkage into __visible on 32bit v2
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
Mark 32bit dotraplinkage functions as __visible for LTO. 64bit already is using asmlinkage which includes it.
v2: Clean up (M.Marek)
--- arch/x86/include/asm/traps.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
arch/x86/include/asm/traps.h +1 -5
@@ -6,11 +6,7 @@#include <asm/debugreg.h> #include <asm/siginfo.h> /* TRAP_TRACE, ... */ -#ifdef CONFIG_X86_32 -#define dotraplinkage -#else -#define dotraplinkage asmlinkage -#endif +#define dotraplinkage __visible asmlinkage void divide_error(void); asmlinkage void debug(void);
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Change dotraplinkage into __visible on 32bit
x86, asmlinkage: Change dotraplinkage into __visible on 32bit
Commit-ID: 9e1a431de08e2a49ca8dab0edc813c8cb96ba369 Gitweb: http://git.kernel.org/tip/9e1a431de08e2a49ca8dab0edc813c8cb96ba369 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:36 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:18:17 -0700
x86, asmlinkage: Change dotraplinkage into __visible on 32bit
Mark 32bit dotraplinkage functions as __visible for LTO. 64bit already is using asmlinkage which includes it.
v2: Clean up (M.Marek)
--- arch/x86/include/asm/traps.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
arch/x86/include/asm/traps.h +1 -5
@@ -6,11 +6,7 @@#include <asm/debugreg.h> #include <asm/siginfo.h> /* TRAP_TRACE, ... */ -#ifdef CONFIG_X86_32 -#define dotraplinkage -#else -#define dotraplinkage asmlinkage -#endif +#define dotraplinkage __visible asmlinkage void divide_error(void); asmlinkage void debug(void);
PATCH 3/16 x86, asmlinkage: Make all interrupt handlers asmlinkage / __visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
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.
--- arch/x86/include/asm/hw_irq.h | 120 ++++++++++++++++++++---------------------- arch/x86/include/asm/irq.h | 2 +- arch/x86/kernel/apic/apic.c | 12 ++--- arch/x86/kernel/irq.c | 8 +-- arch/x86/kernel/irq_work.c | 4 +- arch/x86/kernel/smp.c | 12 ++--- 6 files changed, 77 insertions(+), 81 deletions(-)
arch/x86/include/asm/hw_irq.h +58 -62
@@ -26,56 +26,56 @@#include <asm/sections.h> /* Interrupt handlers registered during init_IRQ */ -extern void apic_timer_interrupt (void ); -extern void x86_platform_ipi (void ); -extern void kvm_posted_intr_ipi (void ); -extern void error_interrupt (void ); -extern void irq_work_interrupt (void ); - -extern void spurious_interrupt (void ); -extern void thermal_interrupt (void ); -extern void reschedule_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_interrupt10 (void ); -extern void invalidate_interrupt11 (void ); -extern void invalidate_interrupt12 (void ); -extern void invalidate_interrupt13 (void ); -extern void invalidate_interrupt14 (void ); -extern void invalidate_interrupt15 (void ); -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 irq_move_cleanup_interrupt (void ); -extern void reboot_interrupt (void ); -extern void threshold_interrupt (void ); - -extern void call_function_interrupt (void ); -extern void call_function_single_interrupt (void ); +extern asmlinkage void apic_timer_interrupt(void); +extern asmlinkage void x86_platform_ipi(void); +extern asmlinkage void kvm_posted_intr_ipi(void); +extern asmlinkage void error_interrupt(void); +extern asmlinkage void irq_work_interrupt(void); + +extern asmlinkage void spurious_interrupt(void); +extern asmlinkage void thermal_interrupt(void); +extern asmlinkage void reschedule_interrupt(void); + +extern asmlinkage void invalidate_interrupt(void); +extern asmlinkage void invalidate_interrupt0(void); +extern asmlinkage void invalidate_interrupt1(void); +extern asmlinkage void invalidate_interrupt2(void); +extern asmlinkage void invalidate_interrupt3(void); +extern asmlinkage void invalidate_interrupt4(void); +extern asmlinkage void invalidate_interrupt5(void); +extern asmlinkage void invalidate_interrupt6(void); +extern asmlinkage void invalidate_interrupt7(void); +extern asmlinkage void invalidate_interrupt8(void); +extern asmlinkage void invalidate_interrupt9(void); +extern asmlinkage void invalidate_interrupt10(void); +extern asmlinkage void invalidate_interrupt11(void); +extern asmlinkage void invalidate_interrupt12(void); +extern asmlinkage void invalidate_interrupt13(void); +extern asmlinkage void invalidate_interrupt14(void); +extern asmlinkage void invalidate_interrupt15(void); +extern asmlinkage void invalidate_interrupt16(void); +extern asmlinkage void invalidate_interrupt17(void); +extern asmlinkage void invalidate_interrupt18(void); +extern asmlinkage void invalidate_interrupt19(void); +extern asmlinkage void invalidate_interrupt20(void); +extern asmlinkage void invalidate_interrupt21(void); +extern asmlinkage void invalidate_interrupt22(void); +extern asmlinkage void invalidate_interrupt23(void); +extern asmlinkage void invalidate_interrupt24(void); +extern asmlinkage void invalidate_interrupt25(void); +extern asmlinkage void invalidate_interrupt26(void); +extern asmlinkage void invalidate_interrupt27(void); +extern asmlinkage void invalidate_interrupt28(void); +extern asmlinkage void invalidate_interrupt29(void); +extern asmlinkage void invalidate_interrupt30(void); +extern asmlinkage void invalidate_interrupt31(void); + +extern asmlinkage void irq_move_cleanup_interrupt(void); +extern asmlinkage void reboot_interrupt(void); +extern asmlinkage void threshold_interrupt(void); + +extern asmlinkage void call_function_interrupt(void); +extern asmlinkage void call_function_single_interrupt(void);#ifdef CONFIG_TRACING /* Interrupt handlers registered during init_IRQ */
@@ -172,22 +172,18 @@ extern atomic_t irq_mis_count;extern void eisa_set_level_irq (unsigned int irq);/* SMP */ -extern void smp_apic_timer_interrupt (struct pt_regs *); -extern void smp_spurious_interrupt (struct pt_regs *); -extern void smp_x86_platform_ipi (struct pt_regs *); -extern void smp_error_interrupt (struct pt_regs *); +extern __visible void smp_apic_timer_interrupt(struct pt_regs *); +extern __visible void smp_spurious_interrupt(struct pt_regs *); +extern __visible void smp_x86_platform_ipi(struct pt_regs *); +extern __visible void smp_error_interrupt(struct pt_regs *);#ifdef CONFIG_X86_IO_APIC extern asmlinkage void smp_irq_move_cleanup_interrupt(void);#endif #ifdef CONFIG_SMP -extern void smp_reschedule_interrupt (struct pt_regs *); -extern void smp_call_function_interrupt (struct pt_regs *); -extern void smp_call_function_single_interrupt (struct pt_regs *); -#ifdef CONFIG_X86_32 -extern void smp_invalidate_interrupt (struct pt_regs *); -#else -extern asmlinkage void smp_invalidate_interrupt(struct pt_regs *); -#endif +extern __visible void smp_reschedule_interrupt(struct pt_regs *); +extern __visible void smp_call_function_interrupt(struct pt_regs *); +extern __visible void smp_call_function_single_interrupt(struct pt_regs *); +extern __visible void smp_invalidate_interrupt(struct pt_regs *);#endif extern void (*__initconst interrupt[NR_VECTORS -FIRST_EXTERNAL_VECTOR ])(void );
arch/x86/include/asm/irq.h +1 -1
@@ -33,7 +33,7 @@ extern void (*x86_platform_ipi_callback)(void);extern void native_init_IRQ (void );extern bool handle_irq (unsigned irq,struct pt_regs *regs); -extern unsigned int do_IRQ (struct pt_regs *regs); +extern __visible unsigned int do_IRQ(struct pt_regs *regs);/* Interrupt vector management */ extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
arch/x86/kernel/apic/apic.c +6 -6
@@ -913,7 +913,7 @@ static void local_apic_timer_interrupt(void)* [ if a single-CPU system runs an SMP kernel then we call the local * interrupt as well. Thus we cannot inline the local irq ... ] */ -void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs) +__visible void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -932,7 +932,7 @@ void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)set_irq_regs (old_regs); } -void __irq_entry smp_trace_apic_timer_interrupt(struct pt_regs *regs) +__visible void __irq_entry smp_trace_apic_timer_interrupt(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -1946,14 +1946,14 @@ static inline void __smp_spurious_interrupt(void) "should never happen.\n", smp_processor_id()); } -void smp_spurious_interrupt (struct pt_regs *regs) +__visible void smp_spurious_interrupt(struct pt_regs *regs) {entering_irq ();__smp_spurious_interrupt ();exiting_irq (); } -void smp_trace_spurious_interrupt (struct pt_regs *regs) +__visible void smp_trace_spurious_interrupt(struct pt_regs *regs) {entering_irq ();trace_spurious_apic_entry (SPURIOUS_APIC_VECTOR );
@@ -2002,14 +2002,14 @@ static inline void __smp_error_interrupt(struct pt_regs *regs) } -void smp_error_interrupt (struct pt_regs *regs) +__visible void smp_error_interrupt(struct pt_regs *regs) {entering_irq ();__smp_error_interrupt (regs);exiting_irq (); } -void smp_trace_error_interrupt (struct pt_regs *regs) +__visible void smp_trace_error_interrupt(struct pt_regs *regs) {entering_irq ();trace_error_apic_entry (ERROR_APIC_VECTOR );
arch/x86/kernel/irq.c +4 -4
@@ -177,7 +177,7 @@ u64 arch_irq_stat(void)* SMP cross-CPU interrupts have their own specific * handlers). */ -unsigned int __irq_entry do_IRQ(struct pt_regs *regs) +__visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -215,7 +215,7 @@ void __smp_x86_platform_ipi(void)x86_platform_ipi_callback (); } -void smp_x86_platform_ipi (struct pt_regs *regs) +__visible void smp_x86_platform_ipi(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -229,7 +229,7 @@ void smp_x86_platform_ipi(struct pt_regs *regs)/* * Handler for POSTED_INTERRUPT_VECTOR. */ -void smp_kvm_posted_intr_ipi (struct pt_regs *regs) +__visible void smp_kvm_posted_intr_ipi(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -247,7 +247,7 @@ void smp_kvm_posted_intr_ipi(struct pt_regs *regs) }#endif -void smp_trace_x86_platform_ipi (struct pt_regs *regs) +__visible void smp_trace_x86_platform_ipi(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
arch/x86/kernel/irq_work.c +2 -2
@@ -22,14 +22,14 @@ static inline void __smp_irq_work_interrupt(void)irq_work_run (); } -void smp_irq_work_interrupt (struct pt_regs *regs) +__visible void smp_irq_work_interrupt(struct pt_regs *regs) {irq_work_entering_irq ();__smp_irq_work_interrupt ();exiting_irq (); } -void smp_trace_irq_work_interrupt (struct pt_regs *regs) +__visible void smp_trace_irq_work_interrupt(struct pt_regs *regs) {irq_work_entering_irq ();trace_irq_work_entry (IRQ_WORK_VECTOR );
arch/x86/kernel/smp.c +6 -6
@@ -256,7 +256,7 @@ static inline void __smp_reschedule_interrupt(void)scheduler_ipi (); } -void smp_reschedule_interrupt (struct pt_regs *regs) +__visible void smp_reschedule_interrupt(struct pt_regs *regs) {ack_APIC_irq ();__smp_reschedule_interrupt ();
@@ -271,7 +271,7 @@ static inline void smp_entering_irq(void)irq_enter (); } -void smp_trace_reschedule_interrupt (struct pt_regs *regs) +__visible void smp_trace_reschedule_interrupt(struct pt_regs *regs) {/* * Need to call irq_enter() before calling the trace point.
@@ -295,14 +295,14 @@ static inline void __smp_call_function_interrupt(void)inc_irq_stat (irq_call_count); } -void smp_call_function_interrupt (struct pt_regs *regs) +__visible void smp_call_function_interrupt(struct pt_regs *regs) {smp_entering_irq ();__smp_call_function_interrupt ();exiting_irq (); } -void smp_trace_call_function_interrupt (struct pt_regs *regs) +__visible void smp_trace_call_function_interrupt(struct pt_regs *regs) {smp_entering_irq ();trace_call_function_entry (CALL_FUNCTION_VECTOR );
@@ -317,14 +317,14 @@ static inline void __smp_call_function_single_interrupt(void)inc_irq_stat (irq_call_count); } -void smp_call_function_single_interrupt (struct pt_regs *regs) +__visible void smp_call_function_single_interrupt(struct pt_regs *regs) {smp_entering_irq ();__smp_call_function_single_interrupt ();exiting_irq (); } -void smp_trace_call_function_single_interrupt (struct pt_regs *regs) +__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs) {smp_entering_irq ();trace_call_function_single_entry (CALL_FUNCTION_SINGLE_VECTOR );
Signature · 1 line
1.8.3.1
H. Peter Anvin
reviewerRe: [PATCH 03/16] x86, asmlinkage: Make all interrupt handlers asmlinkage / __visible
Quoted 5 lines · Andi Kleen
From: Andi Kleen <[email protected]>
These handlers are all referenced from assembler stubs, so need to be visible.
Quoted 7 lines
The handlers without arguments become asmlinkage, the others
__visibleto 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 <[email protected]>
I'm getting massive conflicts on this patch, so I do need to understand better what is your baseline, and yes, it probably would be useful to split it up.
-hpa
H. Peter Anvin
reviewerRe: [PATCH 03/16] x86, asmlinkage: Make all interrupt handlers asmlinkage / __visible
Quoted 5 lines · H. Peter Anvin
I'm getting massive conflicts on this patch, so I do need to understand better what is your baseline, and yes, it probably would be useful to split it up.
My fault, core dumped.
Please ignore.
-hpa
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make all interrupt handlers asmlinkage / __visible
In reply to Andi Kleenx86, asmlinkage: Make all interrupt handlers asmlinkage / __visible
Commit-ID: 1d9090e2fb32c84277cef6e72a21be7f78c929f4 Gitweb: http://git.kernel.org/tip/1d9090e2fb32c84277cef6e72a21be7f78c929f4 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:37 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:18:23 -0700
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.
--- arch/x86/include/asm/hw_irq.h | 120 ++++++++++++++++++++---------------------- arch/x86/include/asm/irq.h | 2 +- arch/x86/kernel/apic/apic.c | 12 ++--- arch/x86/kernel/irq.c | 8 +-- arch/x86/kernel/irq_work.c | 4 +- arch/x86/kernel/smp.c | 12 ++--- 6 files changed, 77 insertions(+), 81 deletions(-)
arch/x86/include/asm/hw_irq.h +58 -62
@@ -26,56 +26,56 @@#include <asm/sections.h> /* Interrupt handlers registered during init_IRQ */ -extern void apic_timer_interrupt (void ); -extern void x86_platform_ipi (void ); -extern void kvm_posted_intr_ipi (void ); -extern void error_interrupt (void ); -extern void irq_work_interrupt (void ); - -extern void spurious_interrupt (void ); -extern void thermal_interrupt (void ); -extern void reschedule_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_interrupt10 (void ); -extern void invalidate_interrupt11 (void ); -extern void invalidate_interrupt12 (void ); -extern void invalidate_interrupt13 (void ); -extern void invalidate_interrupt14 (void ); -extern void invalidate_interrupt15 (void ); -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 irq_move_cleanup_interrupt (void ); -extern void reboot_interrupt (void ); -extern void threshold_interrupt (void ); - -extern void call_function_interrupt (void ); -extern void call_function_single_interrupt (void ); +extern asmlinkage void apic_timer_interrupt(void); +extern asmlinkage void x86_platform_ipi(void); +extern asmlinkage void kvm_posted_intr_ipi(void); +extern asmlinkage void error_interrupt(void); +extern asmlinkage void irq_work_interrupt(void); + +extern asmlinkage void spurious_interrupt(void); +extern asmlinkage void thermal_interrupt(void); +extern asmlinkage void reschedule_interrupt(void); + +extern asmlinkage void invalidate_interrupt(void); +extern asmlinkage void invalidate_interrupt0(void); +extern asmlinkage void invalidate_interrupt1(void); +extern asmlinkage void invalidate_interrupt2(void); +extern asmlinkage void invalidate_interrupt3(void); +extern asmlinkage void invalidate_interrupt4(void); +extern asmlinkage void invalidate_interrupt5(void); +extern asmlinkage void invalidate_interrupt6(void); +extern asmlinkage void invalidate_interrupt7(void); +extern asmlinkage void invalidate_interrupt8(void); +extern asmlinkage void invalidate_interrupt9(void); +extern asmlinkage void invalidate_interrupt10(void); +extern asmlinkage void invalidate_interrupt11(void); +extern asmlinkage void invalidate_interrupt12(void); +extern asmlinkage void invalidate_interrupt13(void); +extern asmlinkage void invalidate_interrupt14(void); +extern asmlinkage void invalidate_interrupt15(void); +extern asmlinkage void invalidate_interrupt16(void); +extern asmlinkage void invalidate_interrupt17(void); +extern asmlinkage void invalidate_interrupt18(void); +extern asmlinkage void invalidate_interrupt19(void); +extern asmlinkage void invalidate_interrupt20(void); +extern asmlinkage void invalidate_interrupt21(void); +extern asmlinkage void invalidate_interrupt22(void); +extern asmlinkage void invalidate_interrupt23(void); +extern asmlinkage void invalidate_interrupt24(void); +extern asmlinkage void invalidate_interrupt25(void); +extern asmlinkage void invalidate_interrupt26(void); +extern asmlinkage void invalidate_interrupt27(void); +extern asmlinkage void invalidate_interrupt28(void); +extern asmlinkage void invalidate_interrupt29(void); +extern asmlinkage void invalidate_interrupt30(void); +extern asmlinkage void invalidate_interrupt31(void); + +extern asmlinkage void irq_move_cleanup_interrupt(void); +extern asmlinkage void reboot_interrupt(void); +extern asmlinkage void threshold_interrupt(void); + +extern asmlinkage void call_function_interrupt(void); +extern asmlinkage void call_function_single_interrupt(void);#ifdef CONFIG_TRACING /* Interrupt handlers registered during init_IRQ */
@@ -172,22 +172,18 @@ extern atomic_t irq_mis_count;extern void eisa_set_level_irq (unsigned int irq);/* SMP */ -extern void smp_apic_timer_interrupt (struct pt_regs *); -extern void smp_spurious_interrupt (struct pt_regs *); -extern void smp_x86_platform_ipi (struct pt_regs *); -extern void smp_error_interrupt (struct pt_regs *); +extern __visible void smp_apic_timer_interrupt(struct pt_regs *); +extern __visible void smp_spurious_interrupt(struct pt_regs *); +extern __visible void smp_x86_platform_ipi(struct pt_regs *); +extern __visible void smp_error_interrupt(struct pt_regs *);#ifdef CONFIG_X86_IO_APIC extern asmlinkage void smp_irq_move_cleanup_interrupt(void);#endif #ifdef CONFIG_SMP -extern void smp_reschedule_interrupt (struct pt_regs *); -extern void smp_call_function_interrupt (struct pt_regs *); -extern void smp_call_function_single_interrupt (struct pt_regs *); -#ifdef CONFIG_X86_32 -extern void smp_invalidate_interrupt (struct pt_regs *); -#else -extern asmlinkage void smp_invalidate_interrupt(struct pt_regs *); -#endif +extern __visible void smp_reschedule_interrupt(struct pt_regs *); +extern __visible void smp_call_function_interrupt(struct pt_regs *); +extern __visible void smp_call_function_single_interrupt(struct pt_regs *); +extern __visible void smp_invalidate_interrupt(struct pt_regs *);#endif extern void (*__initconst interrupt[NR_VECTORS -FIRST_EXTERNAL_VECTOR ])(void );
arch/x86/include/asm/irq.h +1 -1
@@ -33,7 +33,7 @@ extern void (*x86_platform_ipi_callback)(void);extern void native_init_IRQ (void );extern bool handle_irq (unsigned irq,struct pt_regs *regs); -extern unsigned int do_IRQ (struct pt_regs *regs); +extern __visible unsigned int do_IRQ(struct pt_regs *regs);/* Interrupt vector management */ extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
arch/x86/kernel/apic/apic.c +6 -6
@@ -913,7 +913,7 @@ static void local_apic_timer_interrupt(void)* [ if a single-CPU system runs an SMP kernel then we call the local * interrupt as well. Thus we cannot inline the local irq ... ] */ -void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs) +__visible void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -932,7 +932,7 @@ void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)set_irq_regs (old_regs); } -void __irq_entry smp_trace_apic_timer_interrupt(struct pt_regs *regs) +__visible void __irq_entry smp_trace_apic_timer_interrupt(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -1946,14 +1946,14 @@ static inline void __smp_spurious_interrupt(void) "should never happen.\n", smp_processor_id()); } -void smp_spurious_interrupt (struct pt_regs *regs) +__visible void smp_spurious_interrupt(struct pt_regs *regs) {entering_irq ();__smp_spurious_interrupt ();exiting_irq (); } -void smp_trace_spurious_interrupt (struct pt_regs *regs) +__visible void smp_trace_spurious_interrupt(struct pt_regs *regs) {entering_irq ();trace_spurious_apic_entry (SPURIOUS_APIC_VECTOR );
@@ -2002,14 +2002,14 @@ static inline void __smp_error_interrupt(struct pt_regs *regs) } -void smp_error_interrupt (struct pt_regs *regs) +__visible void smp_error_interrupt(struct pt_regs *regs) {entering_irq ();__smp_error_interrupt (regs);exiting_irq (); } -void smp_trace_error_interrupt (struct pt_regs *regs) +__visible void smp_trace_error_interrupt(struct pt_regs *regs) {entering_irq ();trace_error_apic_entry (ERROR_APIC_VECTOR );
arch/x86/kernel/irq.c +4 -4
@@ -177,7 +177,7 @@ u64 arch_irq_stat(void)* SMP cross-CPU interrupts have their own specific * handlers). */ -unsigned int __irq_entry do_IRQ(struct pt_regs *regs) +__visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -215,7 +215,7 @@ void __smp_x86_platform_ipi(void)x86_platform_ipi_callback (); } -void smp_x86_platform_ipi (struct pt_regs *regs) +__visible void smp_x86_platform_ipi(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -229,7 +229,7 @@ void smp_x86_platform_ipi(struct pt_regs *regs)/* * Handler for POSTED_INTERRUPT_VECTOR. */ -void smp_kvm_posted_intr_ipi (struct pt_regs *regs) +__visible void smp_kvm_posted_intr_ipi(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
@@ -247,7 +247,7 @@ void smp_kvm_posted_intr_ipi(struct pt_regs *regs) }#endif -void smp_trace_x86_platform_ipi (struct pt_regs *regs) +__visible void smp_trace_x86_platform_ipi(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
arch/x86/kernel/irq_work.c +2 -2
@@ -22,14 +22,14 @@ static inline void __smp_irq_work_interrupt(void)irq_work_run (); } -void smp_irq_work_interrupt (struct pt_regs *regs) +__visible void smp_irq_work_interrupt(struct pt_regs *regs) {irq_work_entering_irq ();__smp_irq_work_interrupt ();exiting_irq (); } -void smp_trace_irq_work_interrupt (struct pt_regs *regs) +__visible void smp_trace_irq_work_interrupt(struct pt_regs *regs) {irq_work_entering_irq ();trace_irq_work_entry (IRQ_WORK_VECTOR );
arch/x86/kernel/smp.c +6 -6
@@ -256,7 +256,7 @@ static inline void __smp_reschedule_interrupt(void)scheduler_ipi (); } -void smp_reschedule_interrupt (struct pt_regs *regs) +__visible void smp_reschedule_interrupt(struct pt_regs *regs) {ack_APIC_irq ();__smp_reschedule_interrupt ();
@@ -271,7 +271,7 @@ static inline void smp_entering_irq(void)irq_enter (); } -void smp_trace_reschedule_interrupt (struct pt_regs *regs) +__visible void smp_trace_reschedule_interrupt(struct pt_regs *regs) {/* * Need to call irq_enter() before calling the trace point.
@@ -295,14 +295,14 @@ static inline void __smp_call_function_interrupt(void)inc_irq_stat (irq_call_count); } -void smp_call_function_interrupt (struct pt_regs *regs) +__visible void smp_call_function_interrupt(struct pt_regs *regs) {smp_entering_irq ();__smp_call_function_interrupt ();exiting_irq (); } -void smp_trace_call_function_interrupt (struct pt_regs *regs) +__visible void smp_trace_call_function_interrupt(struct pt_regs *regs) {smp_entering_irq ();trace_call_function_entry (CALL_FUNCTION_VECTOR );
@@ -317,14 +317,14 @@ static inline void __smp_call_function_single_interrupt(void)inc_irq_stat (irq_call_count); } -void smp_call_function_single_interrupt (struct pt_regs *regs) +__visible void smp_call_function_single_interrupt(struct pt_regs *regs) {smp_entering_irq ();__smp_call_function_single_interrupt ();exiting_irq (); } -void smp_trace_call_function_single_interrupt (struct pt_regs *regs) +__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs) {smp_entering_irq ();trace_call_function_single_entry (CALL_FUNCTION_SINGLE_VECTOR );
PATCH 4/16 x86, asmlinkage: Make _*_start_kernel visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
Obviously these functions have to be visible, otherwise the whole kernel could be optimized away.
--- arch/x86/include/asm/setup.h | 8 +++++--- arch/x86/kernel/head32.c | 2 +- arch/x86/kernel/head64.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-)
arch/x86/include/asm/setup.h +5 -3
@@ -6,6 +6,8 @@#define COMMAND_LINE_SIZE 2048 +#include <linux/linkage.h> +#ifdef __i386__#include <linux/pfn.h>
@@ -108,11 +110,11 @@ void *extend_brk(size_t size, size_t align);extern void probe_roms (void );#ifdef __i386__ -void __init i386_start_kernel (void ); +asmlinkage void __init i386_start_kernel(void);#else -void __init x86_64_start_kernel (char *real_mode); -void __init x86_64_start_reservations (char *real_mode_data); +asmlinkage void __init x86_64_start_kernel(char *real_mode); +asmlinkage void __init x86_64_start_reservations(char *real_mode_data);#endif /* __i386__ */ #endif /* _SETUP */
arch/x86/kernel/head32.c +1 -1
@@ -29,7 +29,7 @@ static void __init i386_default_early_setup(void)reserve_ebda_region (); } -void __init i386_start_kernel (void ) +asmlinkage void __init i386_start_kernel(void) {sanitize_boot_params (&boot_params);
arch/x86/kernel/head64.c +1 -1
@@ -137,7 +137,7 @@ static void __init copy_bootdata(char *real_mode_data) } } -void __init x86_64_start_kernel (char * real_mode_data) +asmlinkage void __init x86_64_start_kernel(char * real_mode_data) {int i;
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make _*_start_kernel visible
x86, asmlinkage: Make _*_start_kernel visible
Commit-ID: a1ed4ddfb780910c1bb1e9df9cfc87454b607489 Gitweb: http://git.kernel.org/tip/a1ed4ddfb780910c1bb1e9df9cfc87454b607489 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:38 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:18:26 -0700
x86, asmlinkage: Make _*_start_kernel visible
Obviously these functions have to be visible, otherwise the whole kernel could be optimized away.
--- arch/x86/include/asm/setup.h | 8 +++++--- arch/x86/kernel/head32.c | 2 +- arch/x86/kernel/head64.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-)
arch/x86/include/asm/setup.h +5 -3
@@ -6,6 +6,8 @@#define COMMAND_LINE_SIZE 2048 +#include <linux/linkage.h> +#ifdef __i386__#include <linux/pfn.h>
@@ -108,11 +110,11 @@ void *extend_brk(size_t size, size_t align);extern void probe_roms (void );#ifdef __i386__ -void __init i386_start_kernel (void ); +asmlinkage void __init i386_start_kernel(void);#else -void __init x86_64_start_kernel (char *real_mode); -void __init x86_64_start_reservations (char *real_mode_data); +asmlinkage void __init x86_64_start_kernel(char *real_mode); +asmlinkage void __init x86_64_start_reservations(char *real_mode_data);#endif /* __i386__ */ #endif /* _SETUP */
arch/x86/kernel/head32.c +1 -1
@@ -29,7 +29,7 @@ static void __init i386_default_early_setup(void)reserve_ebda_region (); } -void __init i386_start_kernel (void ) +asmlinkage void __init i386_start_kernel(void) {sanitize_boot_params (&boot_params);
arch/x86/kernel/head64.c +1 -1
@@ -137,7 +137,7 @@ static void __init copy_bootdata(char *real_mode_data) } } -void __init x86_64_start_kernel (char * real_mode_data) +asmlinkage void __init x86_64_start_kernel(char * real_mode_data) {int i;
PATCH 5/16 x86, asmlinkage: Make 32bit/64bit __switch_to visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
This function is called from inline assembler, so has to be visible.
--- arch/x86/include/asm/switch_to.h | 4 ++-- arch/x86/kernel/process_32.c | 2 +- arch/x86/kernel/process_64.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-)
arch/x86/include/asm/switch_to.h +2 -2
@@ -2,8 +2,8 @@#define _ASM_X86_SWITCH_TO_Hstruct task_struct ;/* one of the stranger aspects of C forward declarations */ -struct task_struct *__switch_to (struct task_struct *prev, -struct task_struct *next); +__visible struct task_struct *__switch_to(struct task_struct *prev, +struct task_struct *next);struct tss_struct ;void __switch_to_xtra (struct task_struct *prev_p,struct task_struct *next_p,struct tss_struct *tss);
arch/x86/kernel/process_32.c +1 -1
@@ -247,7 +247,7 @@ EXPORT_SYMBOL_GPL(start_thread);* the task-switch, and shows up in ret_from_fork in entry.S, * for example. */ -__notrace_funcgraph struct task_struct * +__visible __notrace_funcgraph struct task_struct *__switch_to (struct task_struct *prev_p,struct task_struct *next_p) { struct thread_struct *prev = &prev_p->thread,
arch/x86/kernel/process_64.c +1 -1
@@ -274,7 +274,7 @@ void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp)* Kprobes not supported here. Set the probe on schedule instead. * Function graph tracer not supported too. */ -__notrace_funcgraph struct task_struct * +__visible __notrace_funcgraph struct task_struct *__switch_to (struct task_struct *prev_p,struct task_struct *next_p) {struct thread_struct *prev = &prev_p->thread;
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make 32bit/ 64bit __switch_to visible
x86, asmlinkage: Make 32bit/64bit __switch_to visible
Commit-ID: 35ea7903b8a97162e38da9da3b560df74713321d Gitweb: http://git.kernel.org/tip/35ea7903b8a97162e38da9da3b560df74713321d Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:39 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:18:30 -0700
x86, asmlinkage: Make 32bit/64bit __switch_to visible
This function is called from inline assembler, so has to be visible.
--- arch/x86/include/asm/switch_to.h | 4 ++-- arch/x86/kernel/process_32.c | 2 +- arch/x86/kernel/process_64.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-)
arch/x86/include/asm/switch_to.h +2 -2
@@ -2,8 +2,8 @@#define _ASM_X86_SWITCH_TO_Hstruct task_struct ;/* one of the stranger aspects of C forward declarations */ -struct task_struct *__switch_to (struct task_struct *prev, -struct task_struct *next); +__visible struct task_struct *__switch_to(struct task_struct *prev, +struct task_struct *next);struct tss_struct ;void __switch_to_xtra (struct task_struct *prev_p,struct task_struct *next_p,struct tss_struct *tss);
arch/x86/kernel/process_32.c +1 -1
@@ -247,7 +247,7 @@ EXPORT_SYMBOL_GPL(start_thread);* the task-switch, and shows up in ret_from_fork in entry.S, * for example. */ -__notrace_funcgraph struct task_struct * +__visible __notrace_funcgraph struct task_struct *__switch_to (struct task_struct *prev_p,struct task_struct *next_p) { struct thread_struct *prev = &prev_p->thread,
arch/x86/kernel/process_64.c +1 -1
@@ -274,7 +274,7 @@ void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp)* Kprobes not supported here. Set the probe on schedule instead. * Function graph tracer not supported too. */ -__notrace_funcgraph struct task_struct * +__visible __notrace_funcgraph struct task_struct *__switch_to (struct task_struct *prev_p,struct task_struct *next_p) {struct thread_struct *prev = &prev_p->thread;
PATCH 6/16 x86, asmlinkage: Make various syscalls asmlinkage
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
FWIW I suspect sys_rt_sigreturn/sys_sigreturn should use standard SYSCALL wrappers. But I didn't do that change in this patch.
--- arch/x86/include/asm/syscalls.h | 6 +++--- arch/x86/kernel/signal.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-)
arch/x86/include/asm/syscalls.h +3 -3
@@ -24,7 +24,7 @@ asmlinkage long sys_iopl(unsigned int); asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);/* kernel/signal.c */ -long sys_rt_sigreturn (void ); +asmlinkage long sys_rt_sigreturn (void );/* kernel/tls.c */ asmlinkage long sys_set_thread_area (struct user_desc __user *);
@@ -34,7 +34,7 @@ asmlinkage long sys_get_thread_area(struct user_desc __user *);#ifdef CONFIG_X86_32 /* kernel/signal.c */ -unsigned long sys_sigreturn (void ); +asmlinkage unsigned long sys_sigreturn (void );/* kernel/vm86_32.c */ asmlinkage long sys_vm86old (struct vm86_struct __user *);
@@ -44,7 +44,7 @@ asmlinkage long sys_vm86(unsigned long, unsigned long);/* X86_64 only */ /* kernel/process_64.c */ -long sys_arch_prctl (int ,unsigned long ); +asmlinkage long sys_arch_prctl (int ,unsigned long );/* kernel/sys_x86_64.c */ asmlinkage long sys_mmap(unsigned long, unsigned long, unsigned long,
arch/x86/kernel/signal.c +2 -2
@@ -533,7 +533,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,* Do a signal return; undo the signal stack. */ #ifdef CONFIG_X86_32 -unsigned long sys_sigreturn (void ) +asmlinkage unsigned long sys_sigreturn (void ) {struct pt_regs *regs =current_pt_regs ();struct sigframe __user *frame;
@@ -562,7 +562,7 @@ badframe: }#endif /* CONFIG_X86_32 */ -long sys_rt_sigreturn (void ) +asmlinkage long sys_rt_sigreturn (void ) {struct pt_regs *regs =current_pt_regs ();struct rt_sigframe __user *frame;
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make various syscalls asmlinkage
x86, asmlinkage: Make various syscalls asmlinkage
Commit-ID: ff49103fdba59aa3f845ad2dcac0c26a9e4c5404 Gitweb: http://git.kernel.org/tip/ff49103fdba59aa3f845ad2dcac0c26a9e4c5404 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:40 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:18:33 -0700
x86, asmlinkage: Make various syscalls asmlinkage
FWIW I suspect sys_rt_sigreturn/sys_sigreturn should use standard SYSCALL wrappers. But I didn't do that change in this patch.
--- arch/x86/include/asm/syscalls.h | 6 +++--- arch/x86/kernel/signal.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-)
arch/x86/include/asm/syscalls.h +3 -3
@@ -24,7 +24,7 @@ asmlinkage long sys_iopl(unsigned int); asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);/* kernel/signal.c */ -long sys_rt_sigreturn (void ); +asmlinkage long sys_rt_sigreturn (void );/* kernel/tls.c */ asmlinkage long sys_set_thread_area (struct user_desc __user *);
@@ -34,7 +34,7 @@ asmlinkage long sys_get_thread_area(struct user_desc __user *);#ifdef CONFIG_X86_32 /* kernel/signal.c */ -unsigned long sys_sigreturn (void ); +asmlinkage unsigned long sys_sigreturn (void );/* kernel/vm86_32.c */ asmlinkage long sys_vm86old (struct vm86_struct __user *);
@@ -44,7 +44,7 @@ asmlinkage long sys_vm86(unsigned long, unsigned long);/* X86_64 only */ /* kernel/process_64.c */ -long sys_arch_prctl (int ,unsigned long ); +asmlinkage long sys_arch_prctl (int ,unsigned long );/* kernel/sys_x86_64.c */ asmlinkage long sys_mmap(unsigned long, unsigned long, unsigned long,
arch/x86/kernel/signal.c +2 -2
@@ -533,7 +533,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,* Do a signal return; undo the signal stack. */ #ifdef CONFIG_X86_32 -unsigned long sys_sigreturn (void ) +asmlinkage unsigned long sys_sigreturn (void ) {struct pt_regs *regs =current_pt_regs ();struct sigframe __user *frame;
@@ -562,7 +562,7 @@ badframe: }#endif /* CONFIG_X86_32 */ -long sys_rt_sigreturn (void ) +asmlinkage long sys_rt_sigreturn (void ) {struct pt_regs *regs =current_pt_regs ();struct rt_sigframe __user *frame;
PATCH 7/16 x86, asmlinkage: Make kprobes code visible and fix assembler code
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
- Make all the external assembler template symbols __visible
- Move the templates inline assembler code into a top level assembler statement, not inside a function. This avoids it being optimized away or cloned.
--- arch/x86/include/asm/kprobes.h | 10 +++++----- arch/x86/kernel/kprobes/core.c | 2 +- arch/x86/kernel/kprobes/opt.c | 5 +---- 3 files changed, 7 insertions(+), 10 deletions(-)
arch/x86/include/asm/kprobes.h +5 -5
@@ -49,10 +49,10 @@ typedef u8 kprobe_opcode_t;#define flush_insn_slot (p) do { } while (0)/* optinsn template addresses */ -extern kprobe_opcode_t optprobe_template_entry; -extern kprobe_opcode_t optprobe_template_val; -extern kprobe_opcode_t optprobe_template_call; -extern kprobe_opcode_t optprobe_template_end; +extern __visible kprobe_opcode_t optprobe_template_entry; +extern __visible kprobe_opcode_t optprobe_template_val; +extern __visible kprobe_opcode_t optprobe_template_call; +extern __visible kprobe_opcode_t optprobe_template_end;#define MAX_OPTIMIZED_LENGTH (MAX_INSN_SIZE + RELATIVE_ADDR_SIZE)#define MAX_OPTINSN_SIZE \ (((unsigned long)&optprobe_template_end - \
@@ -62,7 +62,7 @@ extern kprobe_opcode_t optprobe_template_end;extern const int kretprobe_blacklist_size;void arch_remove_kprobe (struct kprobe *p); -void kretprobe_trampoline (void ); +asmlinkage void kretprobe_trampoline(void);/* Architecture specific copy of original instruction*/ struct arch_specific_insn {
arch/x86/kernel/kprobes/core.c +1 -1
@@ -661,7 +661,7 @@ static void __used __kprobes kretprobe_trampoline_holder(void)/* * Called from kretprobe_trampoline */ -static __used __kprobes void *trampoline_handler (struct pt_regs *regs) +__visible __used __kprobes void *trampoline_handler(struct pt_regs *regs) {struct kretprobe_instance *ri =NULL ;struct hlist_head *head, empty_rp;
arch/x86/kernel/kprobes/opt.c +1 -4
@@ -88,9 +88,7 @@ static void __kprobes synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long v *(unsigned long *)addr = val; } -static void __used __kprobes kprobes_optinsn_template_holder (void ) -{ - asm volatile ( +asm ( ".global optprobe_template_entry\n" "optprobe_template_entry:\n"#ifdef CONFIG_X86_64
@@ -129,7 +127,6 @@ static void __used __kprobes kprobes_optinsn_template_holder(void)#endif ".global optprobe_template_end\n" "optprobe_template_end:\n"); -}#define TMPL_MOVE_IDX \ ((long)&optprobe_template_val - (long)&optprobe_template_entry)
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make kprobes code visible and fix assembler code
x86, asmlinkage: Make kprobes code visible and fix assembler code
Commit-ID: 04bb591ca74fb8ea06d5ab7fadfb7bf5b11fb28e Gitweb: http://git.kernel.org/tip/04bb591ca74fb8ea06d5ab7fadfb7bf5b11fb28e Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:41 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:19:48 -0700
x86, asmlinkage: Make kprobes code visible and fix assembler code
- Make all the external assembler template symbols __visible
- Move the templates inline assembler code into a top level assembler statement, not inside a function. This avoids it being optimized away or cloned.
--- arch/x86/include/asm/kprobes.h | 10 +++++----- arch/x86/kernel/kprobes/core.c | 2 +- arch/x86/kernel/kprobes/opt.c | 5 +---- 3 files changed, 7 insertions(+), 10 deletions(-)
arch/x86/include/asm/kprobes.h +5 -5
@@ -49,10 +49,10 @@ typedef u8 kprobe_opcode_t;#define flush_insn_slot (p) do { } while (0)/* optinsn template addresses */ -extern kprobe_opcode_t optprobe_template_entry; -extern kprobe_opcode_t optprobe_template_val; -extern kprobe_opcode_t optprobe_template_call; -extern kprobe_opcode_t optprobe_template_end; +extern __visible kprobe_opcode_t optprobe_template_entry; +extern __visible kprobe_opcode_t optprobe_template_val; +extern __visible kprobe_opcode_t optprobe_template_call; +extern __visible kprobe_opcode_t optprobe_template_end;#define MAX_OPTIMIZED_LENGTH (MAX_INSN_SIZE + RELATIVE_ADDR_SIZE)#define MAX_OPTINSN_SIZE \ (((unsigned long)&optprobe_template_end - \
@@ -62,7 +62,7 @@ extern kprobe_opcode_t optprobe_template_end;extern const int kretprobe_blacklist_size;void arch_remove_kprobe (struct kprobe *p); -void kretprobe_trampoline (void ); +asmlinkage void kretprobe_trampoline(void);/* Architecture specific copy of original instruction*/ struct arch_specific_insn {
arch/x86/kernel/kprobes/core.c +1 -1
@@ -661,7 +661,7 @@ static void __used __kprobes kretprobe_trampoline_holder(void)/* * Called from kretprobe_trampoline */ -static __used __kprobes void *trampoline_handler (struct pt_regs *regs) +__visible __used __kprobes void *trampoline_handler(struct pt_regs *regs) {struct kretprobe_instance *ri =NULL ;struct hlist_head *head, empty_rp;
arch/x86/kernel/kprobes/opt.c +1 -4
@@ -88,9 +88,7 @@ static void __kprobes synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long v *(unsigned long *)addr = val; } -static void __used __kprobes kprobes_optinsn_template_holder (void ) -{ - asm volatile ( +asm ( ".global optprobe_template_entry\n" "optprobe_template_entry:\n"#ifdef CONFIG_X86_64
@@ -129,7 +127,6 @@ static void __used __kprobes kprobes_optinsn_template_holder(void)#endif ".global optprobe_template_end\n" "optprobe_template_end:\n"); -}#define TMPL_MOVE_IDX \ ((long)&optprobe_template_val - (long)&optprobe_template_entry)
Masami Hiramatsu
Acked-byRe: [tip:x86/asmlinkage] x86, asmlinkage: Make kprobes code visible and fix assembler code
Quoted 7 lines · tip-bot for Andi Kleen
Commit-ID: 04bb591ca74fb8ea06d5ab7fadfb7bf5b11fb28e Gitweb: http://git.kernel.org/tip/04bb591ca74fb8ea06d5ab7fadfb7bf5b11fb28e Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:41 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:19:48 -0700
Quoted 6 lines
x86, asmlinkage: Make kprobes code visible and fix assembler code
- Make all the external assembler template symbols
__visible
- Move the templates inline assembler code into a top level assembler statement, not inside a function. This avoids it being optimized away or cloned.
Oh, I didn't know that I can use asm() at top level. Thanks!
Quoted 77 lines
Cc Ananth N Mavinakayanahalli <[email protected]>Cc Anil S Keshavamurthy <[email protected]>Cc "David S. Miller" <[email protected]>Cc Masami Hiramatsu <[email protected]>Signed-off-by Andi Kleen <[email protected]>Signed-off-by H. Peter Anvin <[email protected]>--- arch/x86/include/asm/kprobes.h | 10 +++++----- arch/x86/kernel/kprobes/core.c | 2 +- arch/x86/kernel/kprobes/opt.c | 5 +---- 3 files changed, 7 insertions(+), 10 deletions(-)arch/x86/include/asm/kprobes.h +5
-5@@ -49,10 +49,10 @@ typedef u8 kprobe_opcode_t;#define flush_insn_slot (p) do { } while (0)/* optinsn template addresses */ -extern kprobe_opcode_t optprobe_template_entry; -extern kprobe_opcode_t optprobe_template_val; -extern kprobe_opcode_t optprobe_template_call; -extern kprobe_opcode_t optprobe_template_end; +extern __visible kprobe_opcode_t optprobe_template_entry; +extern __visible kprobe_opcode_t optprobe_template_val; +extern __visible kprobe_opcode_t optprobe_template_call; +extern __visible kprobe_opcode_t optprobe_template_end;#define MAX_OPTIMIZED_LENGTH (MAX_INSN_SIZE + RELATIVE_ADDR_SIZE)#define MAX_OPTINSN_SIZE \ (((unsigned long)&optprobe_template_end - \@@ -62,7 +62,7 @@ extern kprobe_opcode_t optprobe_template_end;extern const int kretprobe_blacklist_size;void arch_remove_kprobe (struct kprobe *p); -void kretprobe_trampoline (void ); +asmlinkage void kretprobe_trampoline(void);/* Architecture specific copy of original instruction*/ struct arch_specific_insn {arch/x86/kernel/kprobes/core.c +1
-1@@ -661,7 +661,7 @@ static void __used __kprobes kretprobe_trampoline_holder(void)/* * Called from kretprobe_trampoline */ -static __used __kprobes void *trampoline_handler (struct pt_regs *regs) +__visible __used __kprobes void *trampoline_handler(struct pt_regs *regs) {struct kretprobe_instance *ri =NULL ;struct hlist_head *head, empty_rp;arch/x86/kernel/kprobes/opt.c +1
-4@@ -88,9 +88,7 @@ static void __kprobes synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long v *(unsigned long *)addr = val; } -static void __used __kprobes kprobes_optinsn_template_holder (void ) -{ - asm volatile ( +asm ( ".global optprobe_template_entry\n" "optprobe_template_entry:\n"#ifdef CONFIG_X86_64 @@ -129,7 +127,6 @@ static void __used __kprobes kprobes_optinsn_template_holder(void)#endif ".global optprobe_template_end\n" "optprobe_template_end:\n"); -}#define TMPL_MOVE_IDX \ ((long)&optprobe_template_val - (long)&optprobe_template_entry)
Signature · 4 lines
Masami HIRAMATSU IT Management Research Dept. Linux Technology Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
PATCH 8/16 x86, asmlinkage, kexec: Drop bogus asmlinkage in machine_kexec_32
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
A function pointer cannot be asmlinkage. Just drop it.
--- arch/x86/kernel/machine_kexec_32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/machine_kexec_32.c +1 -1
@@ -184,7 +184,7 @@ void machine_kexec(struct kimage *image)unsigned long page_list[PAGES_NR ];void *control_page;int save_ftrace_enabled; - asmlinkage unsigned long + unsigned long (*relocate_kernel_ptr)(unsigned long indirection_page, unsigned long control_page, unsigned long start_address,
Signature · 1 line
1.8.3.1
H. Peter Anvin
reviewerRe: [PATCH 08/16] x86, asmlinkage, kexec: Drop bogus asmlinkage in machine_kexec_32
Quoted 5 lines · Andi Kleen
From: Andi Kleen <[email protected]>
A function pointer cannot be asmlinkage. Just drop it.
Signed-off-by Andi Kleen <[email protected]>
Eh? It certainly matters for the function pointer if it is regparm(0) or regparm(3), and the pointed-to function definitely assumes regparm(0). So I think this patch is wrong, and if it isn't, it definitely needs better explanation why it isn't wrong.
-hpa
Re: [PATCH 08/16] x86, asmlinkage, kexec: Drop bogus asmlinkage in machine_kexec_32
Quoted 11 lines · H. Peter Anvin
Quoted 5 lines · Andi Kleen
From: Andi Kleen <[email protected]>
A function pointer cannot be asmlinkage. Just drop it.
Signed-off-by Andi Kleen <[email protected]>Eh? It certainly matters for the function pointer if it is regparm(0) or regparm(3), and the pointed-to function definitely assumes regparm(0). So I think this patch is wrong, and if it isn't, it definitely needs better explanation why it isn't wrong.
Ok. Good point.
It causes compiler warnings with __attribute__((externally_visible)) because only a definition can be visible.
But yes it is needed for regparm.
So in a sense these two are incompatible. I guess it can be dropped right now, as it's just a warning.
So please drop the patch and I'll too.
I'll not repost just for the drop, unless you ask me to (or other changes come up)
Longer term may need some different solution for this.
-Andi
Signature · 1 line
[email protected] -- Speaking for myself only.
PATCH 9/16 x86, asmlinkage: Make several variables used from assembler/linker script visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
plus one function load_gs_index
--- arch/x86/include/asm/pgtable.h | 3 ++- arch/x86/include/asm/processor.h | 2 +- arch/x86/include/asm/special_insns.h | 2 +- arch/x86/kernel/cpu/amd.c | 4 ++-- arch/x86/kernel/cpu/common.c | 4 ++-- arch/x86/kernel/process.c | 2 +- arch/x86/kernel/process_64.c | 2 +- arch/x86/kernel/setup.c | 4 ++-- arch/x86/kernel/signal.c | 2 +- arch/x86/lib/usercopy_64.c | 2 +- 10 files changed, 14 insertions(+), 13 deletions(-)
arch/x86/include/asm/pgtable.h +2 -1
@@ -22,7 +22,8 @@* ZERO_PAGE is a global shared page that is always zero: used * for zero-mapped memory areas etc.. */ -extern unsigned long empty_zero_page[PAGE_SIZE /sizeof (unsigned long )]; +extern unsigned long empty_zero_page[PAGE_SIZE /sizeof (unsigned long )] + __visible;#define ZERO_PAGE (vaddr) (virt_to_page(empty_zero_page))extern spinlock_t pgd_lock;
arch/x86/include/asm/processor.h +1 -1
@@ -412,7 +412,7 @@ union irq_stack_union { }; }; -DECLARE_PER_CPU_FIRST(union irq_stack_union, irq_stack_union); +DECLARE_PER_CPU_FIRST(union irq_stack_union, irq_stack_union) __visible;DECLARE_INIT_PER_CPU (irq_stack_union); DECLARE_PER_CPU(char *, irq_stack_ptr);
arch/x86/include/asm/special_insns.h +1 -1
@@ -101,7 +101,7 @@ static inline void native_wbinvd(void) asmvolatile ("wbinvd" : : :"memory" ); } -extern void native_load_gs_index (unsigned ); +extern asmlinkage void native_load_gs_index(unsigned);#ifdef CONFIG_PARAVIRT #include <asm/paravirt.h>
arch/x86/kernel/cpu/amd.c +2 -2
@@ -66,8 +66,8 @@ static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val)* performance at the same time.. */ -extern void vide (void ); -__asm__(".align 4\nvide: ret" ); +extern __visible void vide(void); +__asm__(".globl vide\n\t.align 4\nvide: ret" );static void init_amd_k5 (struct cpuinfo_x86 *c) {
arch/x86/kernel/cpu/common.c +2 -2
@@ -1076,7 +1076,7 @@ struct desc_ptr debug_idt_descr = { NR_VECTORS * 16 - 1, (unsigned long) debug_idt_table }; DEFINE_PER_CPU_FIRST(union irq_stack_union, - irq_stack_union)__aligned(PAGE_SIZE) ; + irq_stack_union)__aligned(PAGE_SIZE) __visible;/* * The following four percpu variables are hot. Align current_task to
@@ -1093,7 +1093,7 @@ EXPORT_PER_CPU_SYMBOL(kernel_stack); DEFINE_PER_CPU(char *, irq_stack_ptr) =init_per_cpu_var (irq_stack_union.irq_stack) +IRQ_STACK_SIZE -64 ; -DEFINE_PER_CPU(unsigned int, irq_count) = -1; +DEFINE_PER_CPU(unsigned int, irq_count) __visible = -1; DEFINE_PER_CPU(struct task_struct *, fpu_owner_task);
arch/x86/kernel/process.c +1 -1
@@ -36,7 +36,7 @@* section. Since TSS's are completely CPU-local, we want them * on exact cacheline boundaries, to eliminate cacheline ping-pong. */ -DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, init_tss) = INIT_TSS; +__visible DEFINE_PER_CPU_SHARED_ALIGNED (struct tss_struct ,init_tss ) =INIT_TSS ;#ifdef CONFIG_X86_64 static DEFINE_PER_CPU(unsigned char, is_idle);
arch/x86/kernel/process_64.c +1 -1
@@ -52,7 +52,7 @@ asmlinkage extern void ret_from_fork(void); -DEFINE_PER_CPU(unsigned long, old_rsp); +asmlinkage DEFINE_PER_CPU (unsigned long ,old_rsp );/* Prints also some state that isn't saved in the pt_regs */ void __show_regs (struct pt_regs *regs,int all)
arch/x86/kernel/setup.c +2 -2
@@ -206,9 +206,9 @@ EXPORT_SYMBOL(boot_cpu_data);#if !defined(CONFIG_X86_PAE ) || defined(CONFIG_X86_64 ) -unsigned long mmu_cr4_features; +__visible unsigned long mmu_cr4_features;#else -unsigned long mmu_cr4_features =X86_CR4_PAE ; +__visible unsigned long mmu_cr4_features =X86_CR4_PAE ;#endif /* Boot loader ID and version as integers, for the benefit of proc_dointvec */
arch/x86/kernel/signal.c +1 -1
@@ -728,7 +728,7 @@ static void do_signal(struct pt_regs *regs)* notification of userspace execution resumption * - triggered by the TIF_WORK_MASK flags */ -void +__visible voiddo_notify_resume (struct pt_regs *regs,void *unused,__u32 thread_info_flags) {user_exit ();
arch/x86/lib/usercopy_64.c +1 -1
@@ -68,7 +68,7 @@ EXPORT_SYMBOL(copy_in_user);* Since protection fault in copy_from/to_user is not a normal situation, * it is not necessary to optimize tail handling. */ -unsigned long +__visible unsigned long copy_user_handle_tail (char *to,char *from,unsigned len,unsigned zerorest) {char c;
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make several variables used from assembler/linker script visible
x86, asmlinkage: Make several variables used from assembler/linker script visible
Commit-ID: 277d5b40b7bf495d2d4193746181b17dd98441b2 Gitweb: http://git.kernel.org/tip/277d5b40b7bf495d2d4193746181b17dd98441b2 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:43 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:20:13 -0700
x86, asmlinkage: Make several variables used from assembler/linker script visible
Plus one function, load_gs_index().
--- arch/x86/include/asm/pgtable.h | 3 ++- arch/x86/include/asm/processor.h | 2 +- arch/x86/include/asm/special_insns.h | 2 +- arch/x86/kernel/cpu/amd.c | 4 ++-- arch/x86/kernel/cpu/common.c | 4 ++-- arch/x86/kernel/process.c | 2 +- arch/x86/kernel/process_64.c | 2 +- arch/x86/kernel/setup.c | 4 ++-- arch/x86/kernel/signal.c | 2 +- arch/x86/lib/usercopy_64.c | 2 +- 10 files changed, 14 insertions(+), 13 deletions(-)
arch/x86/include/asm/pgtable.h +2 -1
@@ -22,7 +22,8 @@* ZERO_PAGE is a global shared page that is always zero: used * for zero-mapped memory areas etc.. */ -extern unsigned long empty_zero_page[PAGE_SIZE /sizeof (unsigned long )]; +extern unsigned long empty_zero_page[PAGE_SIZE /sizeof (unsigned long )] + __visible;#define ZERO_PAGE (vaddr) (virt_to_page(empty_zero_page))extern spinlock_t pgd_lock;
arch/x86/include/asm/processor.h +1 -1
@@ -412,7 +412,7 @@ union irq_stack_union { }; }; -DECLARE_PER_CPU_FIRST(union irq_stack_union, irq_stack_union); +DECLARE_PER_CPU_FIRST(union irq_stack_union, irq_stack_union) __visible;DECLARE_INIT_PER_CPU (irq_stack_union); DECLARE_PER_CPU(char *, irq_stack_ptr);
arch/x86/include/asm/special_insns.h +1 -1
@@ -101,7 +101,7 @@ static inline void native_wbinvd(void) asmvolatile ("wbinvd" : : :"memory" ); } -extern void native_load_gs_index (unsigned ); +extern asmlinkage void native_load_gs_index(unsigned);#ifdef CONFIG_PARAVIRT #include <asm/paravirt.h>
arch/x86/kernel/cpu/amd.c +2 -2
@@ -66,8 +66,8 @@ static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val)* performance at the same time.. */ -extern void vide (void ); -__asm__(".align 4\nvide: ret" ); +extern __visible void vide(void); +__asm__(".globl vide\n\t.align 4\nvide: ret" );static void init_amd_k5 (struct cpuinfo_x86 *c) {
arch/x86/kernel/cpu/common.c +2 -2
@@ -1076,7 +1076,7 @@ struct desc_ptr debug_idt_descr = { NR_VECTORS * 16 - 1, (unsigned long) debug_idt_table }; DEFINE_PER_CPU_FIRST(union irq_stack_union, - irq_stack_union)__aligned(PAGE_SIZE) ; + irq_stack_union)__aligned(PAGE_SIZE) __visible;/* * The following four percpu variables are hot. Align current_task to
@@ -1093,7 +1093,7 @@ EXPORT_PER_CPU_SYMBOL(kernel_stack); DEFINE_PER_CPU(char *, irq_stack_ptr) =init_per_cpu_var (irq_stack_union.irq_stack) +IRQ_STACK_SIZE -64 ; -DEFINE_PER_CPU(unsigned int, irq_count) = -1; +DEFINE_PER_CPU(unsigned int, irq_count) __visible = -1; DEFINE_PER_CPU(struct task_struct *, fpu_owner_task);
arch/x86/kernel/process.c +1 -1
@@ -36,7 +36,7 @@* section. Since TSS's are completely CPU-local, we want them * on exact cacheline boundaries, to eliminate cacheline ping-pong. */ -DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, init_tss) = INIT_TSS; +__visible DEFINE_PER_CPU_SHARED_ALIGNED (struct tss_struct ,init_tss ) =INIT_TSS ;#ifdef CONFIG_X86_64 static DEFINE_PER_CPU(unsigned char, is_idle);
arch/x86/kernel/process_64.c +1 -1
@@ -52,7 +52,7 @@ asmlinkage extern void ret_from_fork(void); -DEFINE_PER_CPU(unsigned long, old_rsp); +asmlinkage DEFINE_PER_CPU (unsigned long ,old_rsp );/* Prints also some state that isn't saved in the pt_regs */ void __show_regs (struct pt_regs *regs,int all)
arch/x86/kernel/setup.c +2 -2
@@ -206,9 +206,9 @@ EXPORT_SYMBOL(boot_cpu_data);#if !defined(CONFIG_X86_PAE ) || defined(CONFIG_X86_64 ) -unsigned long mmu_cr4_features; +__visible unsigned long mmu_cr4_features;#else -unsigned long mmu_cr4_features =X86_CR4_PAE ; +__visible unsigned long mmu_cr4_features =X86_CR4_PAE ;#endif /* Boot loader ID and version as integers, for the benefit of proc_dointvec */
arch/x86/kernel/signal.c +1 -1
@@ -728,7 +728,7 @@ static void do_signal(struct pt_regs *regs)* notification of userspace execution resumption * - triggered by the TIF_WORK_MASK flags */ -void +__visible voiddo_notify_resume (struct pt_regs *regs,void *unused,__u32 thread_info_flags) {user_exit ();
arch/x86/lib/usercopy_64.c +1 -1
@@ -68,7 +68,7 @@ EXPORT_SYMBOL(copy_in_user);* Since protection fault in copy_from/to_user is not a normal situation, * it is not necessary to optimize tail handling. */ -unsigned long +__visible unsigned long copy_user_handle_tail (char *to,char *from,unsigned len,unsigned zerorest) {char c;
PATCH 10/16 x86, asmlinkage: Make syscall tables visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
They are referenced from entry*.S.
--- arch/x86/kernel/syscall_32.c | 2 +- arch/x86/kernel/syscall_64.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/x86/kernel/syscall_32.c +1 -1
@@ -15,7 +15,7 @@ typedef asmlinkage void (*sys_call_ptr_t)(void); extern asmlinkage void sys_ni_syscall(void); -const sys_call_ptr_t sys_call_table[__NR_syscall_max+1 ] = { +__visible const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {/* * Smells like a compiler bug -- it doesn't work * when the & below is removed.
arch/x86/kernel/syscall_64.c +1 -1
@@ -22,7 +22,7 @@extern void sys_ni_syscall (void ); -const sys_call_ptr_t sys_call_table[__NR_syscall_max+1 ] = { +asmlinkage const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {/* * Smells like a compiler bug -- it doesn't work * when the & below is removed.
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make syscall tables visible
x86, asmlinkage: Make syscall tables visible
Commit-ID: e0e745e45d3d3c22f60dc9b2c17bcfc0d9f2bc82 Gitweb: http://git.kernel.org/tip/e0e745e45d3d3c22f60dc9b2c17bcfc0d9f2bc82 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:44 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:20:18 -0700
x86, asmlinkage: Make syscall tables visible
They are referenced from entry*.S.
--- arch/x86/kernel/syscall_32.c | 2 +- arch/x86/kernel/syscall_64.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/x86/kernel/syscall_32.c +1 -1
@@ -15,7 +15,7 @@ typedef asmlinkage void (*sys_call_ptr_t)(void); extern asmlinkage void sys_ni_syscall(void); -const sys_call_ptr_t sys_call_table[__NR_syscall_max+1 ] = { +__visible const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {/* * Smells like a compiler bug -- it doesn't work * when the & below is removed.
arch/x86/kernel/syscall_64.c +1 -1
@@ -22,7 +22,7 @@extern void sys_ni_syscall (void ); -const sys_call_ptr_t sys_call_table[__NR_syscall_max+1 ] = { +asmlinkage const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {/* * Smells like a compiler bug -- it doesn't work * when the & below is removed.
PATCH 11/16 x86, asmlinkage, apm: Make APM data structure used from assembler visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
--- arch/x86/kernel/apm_32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/apm_32.c +1 -1
@@ -392,7 +392,7 @@ static struct cpuidle_device apm_cpuidle_device;/* * Local variables */ -static struct { +__visible struct {unsigned long offset;unsigned short segment; } apm_bios_entry;
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage, apm: Make APM data structure used from assembler visible
x86, asmlinkage, apm: Make APM data structure used from assembler visible
Commit-ID: 54c2f3fdb941204cad136024c7b854b7ad112ab6 Gitweb: http://git.kernel.org/tip/54c2f3fdb941204cad136024c7b854b7ad112ab6 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:45 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:20:20 -0700
x86, asmlinkage, apm: Make APM data structure used from assembler visible
--- arch/x86/kernel/apm_32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/apm_32.c +1 -1
@@ -392,7 +392,7 @@ static struct cpuidle_device apm_cpuidle_device;/* * Local variables */ -static struct { +__visible struct {unsigned long offset;unsigned short segment; } apm_bios_entry;
PATCH 12/16 x86, asmlinkage, paravirt: Add __visible/asmlinkage to xen paravirt ops
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
--- arch/x86/include/asm/paravirt_types.h | 3 ++- arch/x86/kernel/paravirt.c | 4 ++-- arch/x86/xen/xen-ops.h | 16 ++++++++-------- 3 files changed, 12 insertions(+), 11 deletions(-)
arch/x86/include/asm/paravirt_types.h +2 -1
@@ -387,7 +387,8 @@ extern struct pv_lock_ops pv_lock_ops;/* Simple instruction patching code. */ #define DEF_NATIVE (ops, name, code) \ - extern const char start_##ops##_##name[], end_##ops##_##name[]; \ + extern const char start_##ops##_##name[] __visible, \ + end_##ops##_##name[] __visible; \ asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":")unsigned paravirt_patch_nop (void );
arch/x86/kernel/paravirt.c +2 -2
@@ -324,7 +324,7 @@ struct pv_time_ops pv_time_ops = { .steal_clock = native_steal_clock, }; -struct pv_irq_ops pv_irq_ops = { +__visible struct pv_irq_ops pv_irq_ops = { .save_fl =__PV_IS_CALLEE_SAVE (native_save_fl), .restore_fl =__PV_IS_CALLEE_SAVE (native_restore_fl), .irq_disable =__PV_IS_CALLEE_SAVE (native_irq_disable),
@@ -336,7 +336,7 @@ struct pv_irq_ops pv_irq_ops = {#endif }; -struct pv_cpu_ops pv_cpu_ops = { +__visible struct pv_cpu_ops pv_cpu_ops = { .cpuid = native_cpuid, .get_debugreg = native_get_debugreg, .set_debugreg = native_set_debugreg,
arch/x86/xen/xen-ops.h +8 -8
@@ -105,9 +105,9 @@ static inline void __init xen_init_apic(void)/* Declare an asm function, along with symbols needed to make it inlineable */ #define DECL_ASM (ret, name, ...) \ - ret name(__VA_ARGS__); \ - extern char name##_end[]; \ - extern char name##_reloc[] \ + asmlinkage ret name(__VA_ARGS__); \ + extern char name##_end[] __visible; \ + extern char name##_reloc[] __visibleDECL_ASM (void, xen_irq_enable_direct, void);DECL_ASM (void, xen_irq_disable_direct, void);
@@ -115,11 +115,11 @@ DECL_ASM(unsigned long, xen_save_fl_direct, void); DECL_ASM(void, xen_restore_fl_direct, unsigned long);/* These are not functions, and cannot be called normally */ -void xen_iret (void ); -void xen_sysexit (void ); -void xen_sysret32 (void ); -void xen_sysret64 (void ); -void xen_adjust_exception_frame (void ); +asmlinkage void xen_iret(void); +asmlinkage void xen_sysexit(void); +asmlinkage void xen_sysret32(void); +asmlinkage void xen_sysret64(void); +asmlinkage void xen_adjust_exception_frame(void);extern int xen_panic_handler_init (void );
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage, paravirt: Add __visible/ asmlinkage to xen paravirt ops
x86, asmlinkage, paravirt: Add __visible/asmlinkage to xen paravirt ops
Commit-ID: 9a55fdbe941e5cfb7a5c438db890a58dad82ef8e Gitweb: http://git.kernel.org/tip/9a55fdbe941e5cfb7a5c438db890a58dad82ef8e Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:46 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:20:56 -0700
x86, asmlinkage, paravirt: Add __visible/asmlinkage to xen paravirt ops
--- arch/x86/include/asm/paravirt_types.h | 3 ++- arch/x86/kernel/paravirt.c | 4 ++-- arch/x86/xen/xen-ops.h | 16 ++++++++-------- 3 files changed, 12 insertions(+), 11 deletions(-)
arch/x86/include/asm/paravirt_types.h +2 -1
@@ -387,7 +387,8 @@ extern struct pv_lock_ops pv_lock_ops;/* Simple instruction patching code. */ #define DEF_NATIVE (ops, name, code) \ - extern const char start_##ops##_##name[], end_##ops##_##name[]; \ + extern const char start_##ops##_##name[] __visible, \ + end_##ops##_##name[] __visible; \ asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":")unsigned paravirt_patch_nop (void );
arch/x86/kernel/paravirt.c +2 -2
@@ -324,7 +324,7 @@ struct pv_time_ops pv_time_ops = { .steal_clock = native_steal_clock, }; -struct pv_irq_ops pv_irq_ops = { +__visible struct pv_irq_ops pv_irq_ops = { .save_fl =__PV_IS_CALLEE_SAVE (native_save_fl), .restore_fl =__PV_IS_CALLEE_SAVE (native_restore_fl), .irq_disable =__PV_IS_CALLEE_SAVE (native_irq_disable),
@@ -336,7 +336,7 @@ struct pv_irq_ops pv_irq_ops = {#endif }; -struct pv_cpu_ops pv_cpu_ops = { +__visible struct pv_cpu_ops pv_cpu_ops = { .cpuid = native_cpuid, .get_debugreg = native_get_debugreg, .set_debugreg = native_set_debugreg,
arch/x86/xen/xen-ops.h +8 -8
@@ -105,9 +105,9 @@ static inline void __init xen_init_apic(void)/* Declare an asm function, along with symbols needed to make it inlineable */ #define DECL_ASM (ret, name, ...) \ - ret name(__VA_ARGS__); \ - extern char name##_end[]; \ - extern char name##_reloc[] \ + asmlinkage ret name(__VA_ARGS__); \ + extern char name##_end[] __visible; \ + extern char name##_reloc[] __visibleDECL_ASM (void, xen_irq_enable_direct, void);DECL_ASM (void, xen_irq_disable_direct, void);
@@ -115,11 +115,11 @@ DECL_ASM(unsigned long, xen_save_fl_direct, void); DECL_ASM(void, xen_restore_fl_direct, unsigned long);/* These are not functions, and cannot be called normally */ -void xen_iret (void ); -void xen_sysexit (void ); -void xen_sysret32 (void ); -void xen_sysret64 (void ); -void xen_adjust_exception_frame (void ); +asmlinkage void xen_iret(void); +asmlinkage void xen_sysexit(void); +asmlinkage void xen_sysret32(void); +asmlinkage void xen_sysret64(void); +asmlinkage void xen_adjust_exception_frame(void);extern int xen_panic_handler_init (void );
PATCH 13/16 x86, asmlinkage: Make 64bit checksum functions visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
They are implemented in assembler.
--- arch/x86/include/asm/checksum_64.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/checksum_64.h +1 -1
@@ -133,7 +133,7 @@ extern __wsum csum_partial(const void *buff, int len, __wsum sum);/* Do not call this directly. Use the wrappers below */ -extern __wsum csum_partial_copy_generic (const void *src,const void *dst, +extern __visible __wsum csum_partial_copy_generic(const void *src, const void *dst,int len,__wsum sum,int *src_err_ptr,int *dst_err_ptr);
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make 64bit checksum functions visible
x86, asmlinkage: Make 64bit checksum functions visible
Commit-ID: 4a335c0695074c1fd2ede7f919b0064f53d35c3f Gitweb: http://git.kernel.org/tip/4a335c0695074c1fd2ede7f919b0064f53d35c3f Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:47 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:20:59 -0700
x86, asmlinkage: Make 64bit checksum functions visible
They are implemented in assembler.
--- arch/x86/include/asm/checksum_64.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/checksum_64.h +1 -1
@@ -133,7 +133,7 @@ extern __wsum csum_partial(const void *buff, int len, __wsum sum);/* Do not call this directly. Use the wrappers below */ -extern __wsum csum_partial_copy_generic (const void *src,const void *dst, +extern __visible __wsum csum_partial_copy_generic(const void *src, const void *dst,int len,__wsum sum,int *src_err_ptr,int *dst_err_ptr);
PATCH 14/16 x86, asmlinkage: Make dump_stack visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
dump_stack is used from assembler code, so make it visible.
--- include/linux/printk.h | 2 +- lib/dump_stack.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
include/linux/printk.h +1 -1
@@ -200,7 +200,7 @@ static inline void show_regs_print_info(const char *log_lvl) }#endif -extern void dump_stack (void )__cold ; +extern asmlinkage void dump_stack(void) __cold;#ifndef pr_fmt#define pr_fmt (fmt) fmt
lib/dump_stack.c +2 -2
@@ -23,7 +23,7 @@ static void __dump_stack(void)#ifdef CONFIG_SMP static atomic_t dump_lock =ATOMIC_INIT (-1 ); -void dump_stack (void ) +asmlinkage void dump_stack(void) {int was_locked;int old;
@@ -55,7 +55,7 @@ retry:preempt_enable (); }#else -void dump_stack (void ) +asmlinkage void dump_stack(void) {__dump_stack (); }
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage: Make dump_stack visible
x86, asmlinkage: Make dump_stack visible
Commit-ID: b6c035d04e80b4244a143e34e51c84cf2181bd94 Gitweb: http://git.kernel.org/tip/b6c035d04e80b4244a143e34e51c84cf2181bd94 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:48 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:21:01 -0700
x86, asmlinkage: Make dump_stack visible
dump_stack is used from assembler code, so make it visible.
--- include/linux/printk.h | 2 +- lib/dump_stack.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
include/linux/printk.h +1 -1
@@ -200,7 +200,7 @@ static inline void show_regs_print_info(const char *log_lvl) }#endif -extern void dump_stack (void )__cold ; +extern asmlinkage void dump_stack(void) __cold;#ifndef pr_fmt#define pr_fmt (fmt) fmt
lib/dump_stack.c +2 -2
@@ -23,7 +23,7 @@ static void __dump_stack(void)#ifdef CONFIG_SMP static atomic_t dump_lock =ATOMIC_INIT (-1 ); -void dump_stack (void ) +asmlinkage void dump_stack(void) {int was_locked;int old;
@@ -55,7 +55,7 @@ retry:preempt_enable (); }#else -void dump_stack (void ) +asmlinkage void dump_stack(void) {__dump_stack (); }
PATCH 15/16 x86, asmlinkage, power: Make various symbols used by the suspend asm code visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
--- arch/x86/power/cpu.c | 8 ++++---- arch/x86/power/hibernate_64.c | 12 ++++++------ kernel/power/hibernate.c | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-)
arch/x86/power/cpu.c +4 -4
@@ -25,10 +25,10 @@#include <asm/cpu.h> #ifdef CONFIG_X86_32 -unsigned long saved_context_ebx; -unsigned long saved_context_esp, saved_context_ebp; -unsigned long saved_context_esi, saved_context_edi; -unsigned long saved_context_eflags; +__visible unsigned long saved_context_ebx; +__visible unsigned long saved_context_esp, saved_context_ebp; +__visible unsigned long saved_context_esi, saved_context_edi; +__visible unsigned long saved_context_eflags;#endif struct saved_context saved_context;
arch/x86/power/hibernate_64.c +6 -6
@@ -20,26 +20,26 @@#include <asm/suspend.h> /* References to section boundaries */ -extern const void __nosave_begin, __nosave_end; +extern __visible const void __nosave_begin, __nosave_end;/* Defined in hibernate_asm_64.S */ -extern int restore_image (void ); +extern asmlinkage int restore_image(void);/* * Address to jump to in the last phase of restore in order to get to the image * kernel's text (this value is passed in the image header). */ -unsigned long restore_jump_address; +unsigned long restore_jump_address __visible;/* * Value of the cr3 register from before the hibernation (this value is passed * in the image header). */ -unsigned long restore_cr3; +unsigned long restore_cr3 __visible; -pgd_t *temp_level4_pgt; +pgd_t *temp_level4_pgt __visible; -void *relocated_restore_code; +void *relocated_restore_code __visible;static void *alloc_pgt_page (void *context) {
kernel/power/hibernate.c +1 -1
@@ -39,7 +39,7 @@ static int resume_delay;static char resume_file[256 ] =CONFIG_PM_STD_PARTITION ;dev_t swsusp_resume_device;sector_t swsusp_resume_block; -int in_suspend __nosavedata; +__visible int in_suspend __nosavedata;enum {HIBERNATION_INVALID ,
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage, power: Make various symbols used by the suspend asm code visible
x86, asmlinkage, power: Make various symbols used by the suspend asm code visible
Commit-ID: d6efc2f7240b4e55590df69d74f33fdb72ce934a Gitweb: http://git.kernel.org/tip/d6efc2f7240b4e55590df69d74f33fdb72ce934a Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:49 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:21:03 -0700
x86, asmlinkage, power: Make various symbols used by the suspend asm code visible
--- arch/x86/power/cpu.c | 8 ++++---- arch/x86/power/hibernate_64.c | 12 ++++++------ kernel/power/hibernate.c | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-)
arch/x86/power/cpu.c +4 -4
@@ -25,10 +25,10 @@#include <asm/cpu.h> #ifdef CONFIG_X86_32 -unsigned long saved_context_ebx; -unsigned long saved_context_esp, saved_context_ebp; -unsigned long saved_context_esi, saved_context_edi; -unsigned long saved_context_eflags; +__visible unsigned long saved_context_ebx; +__visible unsigned long saved_context_esp, saved_context_ebp; +__visible unsigned long saved_context_esi, saved_context_edi; +__visible unsigned long saved_context_eflags;#endif struct saved_context saved_context;
arch/x86/power/hibernate_64.c +6 -6
@@ -20,26 +20,26 @@#include <asm/suspend.h> /* References to section boundaries */ -extern const void __nosave_begin, __nosave_end; +extern __visible const void __nosave_begin, __nosave_end;/* Defined in hibernate_asm_64.S */ -extern int restore_image (void ); +extern asmlinkage int restore_image(void);/* * Address to jump to in the last phase of restore in order to get to the image * kernel's text (this value is passed in the image header). */ -unsigned long restore_jump_address; +unsigned long restore_jump_address __visible;/* * Value of the cr3 register from before the hibernation (this value is passed * in the image header). */ -unsigned long restore_cr3; +unsigned long restore_cr3 __visible; -pgd_t *temp_level4_pgt; +pgd_t *temp_level4_pgt __visible; -void *relocated_restore_code; +void *relocated_restore_code __visible;static void *alloc_pgt_page (void *context) {
kernel/power/hibernate.c +1 -1
@@ -39,7 +39,7 @@ static int resume_delay;static char resume_file[256 ] =CONFIG_PM_STD_PARTITION ;dev_t swsusp_resume_device;sector_t swsusp_resume_block; -int in_suspend __nosavedata; +__visible int in_suspend __nosavedata;enum {HIBERNATION_INVALID ,
PATCH 16/16 x86, asmlinkage, vdso: Mark vdso variables __visible
In reply to Andi KleenFrom: Andi Kleen <[email protected]>
--- arch/x86/include/asm/vvar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/vvar.h +1 -1
@@ -35,7 +35,7 @@#define DEFINE_VVAR (type, name) \ type name \ - __attribute__((section(".vvar_" #name), aligned(16))) + __attribute__((section(".vvar_" #name), aligned(16))) __visible#define VVAR (name) (*vvaraddr_ ## name)
Signature · 1 line
1.8.3.1
tip-bot for Andi Kleen
merge bot[tip:x86/asmlinkage] x86, asmlinkage, vdso: Mark vdso variables __visible
x86, asmlinkage, vdso: Mark vdso variables __visible
Commit-ID: 28596b6a8779b736829ad837f95fdc2e81bdd1ee Gitweb: http://git.kernel.org/tip/28596b6a8779b736829ad837f95fdc2e81bdd1ee Author: Andi Kleen <[email protected]> AuthorDate: Mon, 5 Aug 2013 15:02:50 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Tue, 6 Aug 2013 14:21:08 -0700
x86, asmlinkage, vdso: Mark vdso variables __visible
--- arch/x86/include/asm/vvar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/vvar.h +1 -1
@@ -35,7 +35,7 @@#define DEFINE_VVAR (type, name) \ type name \ - __attribute__((section(".vvar_" #name), aligned(16))) + __attribute__((section(".vvar_" #name), aligned(16))) __visible#define VVAR (name) (*vvaraddr_ ## name)