Message ID | 1345345030-22211-53-git-send-email-andi@firstfloor.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 08/18/2012 07:56 PM, Andi Kleen wrote: > From: Andi Kleen <ak@linux.intel.com> > > The paravirt patching code assumes that it can reference a > local assembler label between two different top level assembler > statements. This does not work with some experimental gcc builds, > where the assembler code may end up in different assembler files. Egad, what are those zany gcc chaps up to now? J > > Replace it with extern / global /asm linkage labels. > > This also removes one redundant copy of the macro. > > Cc: jeremy@goop.org > Signed-off-by: Andi Kleen <ak@linux.intel.com> > --- > arch/x86/include/asm/paravirt_types.h | 9 +++++---- > arch/x86/kernel/paravirt.c | 5 ----- > 2 files changed, 5 insertions(+), 9 deletions(-) > > diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h > index 4f262bc..6a464ba 100644 > --- a/arch/x86/include/asm/paravirt_types.h > +++ b/arch/x86/include/asm/paravirt_types.h > @@ -385,10 +385,11 @@ extern struct pv_lock_ops pv_lock_ops; > _paravirt_alt(insn_string, "%c[paravirt_typenum]", "%c[paravirt_clobber]") > > /* Simple instruction patching code. */ > -#define DEF_NATIVE(ops, name, code) \ > - extern const char start_##ops##_##name[] __visible, \ > - end_##ops##_##name[] __visible; \ > - asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":") > +#define NATIVE_LABEL(a,x,b) "\n\t.globl " a #x "_" #b "\n" a #x "_" #b ":\n\t" > + > +#define DEF_NATIVE(ops, name, code) \ > + __visible extern const char start_##ops##_##name[], end_##ops##_##name[]; \ > + asm(NATIVE_LABEL("start_", ops, name) code NATIVE_LABEL("end_", ops, name)) > > unsigned paravirt_patch_nop(void); > unsigned paravirt_patch_ident_32(void *insnbuf, unsigned len); > diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c > index 17fff18..947255e 100644 > --- a/arch/x86/kernel/paravirt.c > +++ b/arch/x86/kernel/paravirt.c > @@ -62,11 +62,6 @@ void __init default_banner(void) > pv_info.name); > } > > -/* Simple instruction patching code. */ > -#define DEF_NATIVE(ops, name, code) \ > - extern const char start_##ops##_##name[], end_##ops##_##name[]; \ > - asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":") > - > /* Undefined instruction for dealing with missing ops pointers. */ > static const unsigned char ud2a[] = { 0x0f, 0x0b }; > -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 4f262bc..6a464ba 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h @@ -385,10 +385,11 @@ extern struct pv_lock_ops pv_lock_ops; _paravirt_alt(insn_string, "%c[paravirt_typenum]", "%c[paravirt_clobber]") /* Simple instruction patching code. */ -#define DEF_NATIVE(ops, name, code) \ - extern const char start_##ops##_##name[] __visible, \ - end_##ops##_##name[] __visible; \ - asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":") +#define NATIVE_LABEL(a,x,b) "\n\t.globl " a #x "_" #b "\n" a #x "_" #b ":\n\t" + +#define DEF_NATIVE(ops, name, code) \ + __visible extern const char start_##ops##_##name[], end_##ops##_##name[]; \ + asm(NATIVE_LABEL("start_", ops, name) code NATIVE_LABEL("end_", ops, name)) unsigned paravirt_patch_nop(void); unsigned paravirt_patch_ident_32(void *insnbuf, unsigned len); diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 17fff18..947255e 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c @@ -62,11 +62,6 @@ void __init default_banner(void) pv_info.name); } -/* Simple instruction patching code. */ -#define DEF_NATIVE(ops, name, code) \ - extern const char start_##ops##_##name[], end_##ops##_##name[]; \ - asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":") - /* Undefined instruction for dealing with missing ops pointers. */ static const unsigned char ud2a[] = { 0x0f, 0x0b };