[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 7/7] x86/build: Use new .nop directive when available
Newer versions of binutils are capable of emitting an exact number bytes worth of optimised nops. Use this in preference to .skip when available. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> RFC until support is actually committed to binutils mainline. --- xen/arch/x86/Rules.mk | 4 ++++ xen/include/asm-x86/alternative-asm.h | 14 ++++++++++++-- xen/include/asm-x86/alternative.h | 13 ++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/Rules.mk b/xen/arch/x86/Rules.mk index e169d67..bf5047f 100644 --- a/xen/arch/x86/Rules.mk +++ b/xen/arch/x86/Rules.mk @@ -28,6 +28,10 @@ $(call as-option-add,CFLAGS,CC,".equ \"x\"$$(comma)1", \ $(call as-option-add,CFLAGS,CC,\ ".if ((1 > 0) < 0); .error \"\";.endif",,-DHAVE_AS_NEGATIVE_TRUE) +# Check to see whether the assmbler supports the .nop directive. +$(call as-option-add,CFLAGS,CC,\ + ".L1: .L2: .nop (.L2 - .L1)$$(comma)9",-DHAVE_AS_NOP_DIRECTIVE) + CFLAGS += -mno-red-zone -fpic -fno-asynchronous-unwind-tables # Xen doesn't use SSE interally. If the compiler supports it, also skip the diff --git a/xen/include/asm-x86/alternative-asm.h b/xen/include/asm-x86/alternative-asm.h index 25f79fe..9e46bed 100644 --- a/xen/include/asm-x86/alternative-asm.h +++ b/xen/include/asm-x86/alternative-asm.h @@ -1,6 +1,8 @@ #ifndef _ASM_X86_ALTERNATIVE_ASM_H_ #define _ASM_X86_ALTERNATIVE_ASM_H_ +#include <asm/nops.h> + #ifdef __ASSEMBLY__ /* @@ -18,6 +20,14 @@ .byte \pad_len .endm +.macro mknops nr_bytes +#ifdef HAVE_AS_NOP_DIRECTIVE + .nop \nr_bytes, ASM_NOP_MAX +#else + .skip \nr_bytes, 0x90 +#endif +.endm + #define orig_len (.L\@_orig_e - .L\@_orig_s) #define pad_len (.L\@_orig_p - .L\@_orig_e) #define total_len (.L\@_orig_p - .L\@_orig_s) @@ -43,7 +53,7 @@ */ .L\@_diff = repl_len(1) - orig_len - .skip as_true(.L\@_diff > 0) * .L\@_diff, 0x90 + mknops (as_true(.L\@_diff > 0) * .L\@_diff) .L\@_orig_p: .pushsection .altinstructions, "a", @progbits @@ -76,7 +86,7 @@ */ .L\@_diff = as_max(repl_len(1), repl_len(2)) - orig_len - .skip as_true(.L\@_diff > 0) * .L\@_diff, 0x90 + mknops (as_true(.L\@_diff > 0) * .L\@_diff) .L\@_orig_p: .pushsection .altinstructions, "a", @progbits diff --git a/xen/include/asm-x86/alternative.h b/xen/include/asm-x86/alternative.h index d53cea0..51538b6 100644 --- a/xen/include/asm-x86/alternative.h +++ b/xen/include/asm-x86/alternative.h @@ -2,7 +2,6 @@ #define __X86_ALTERNATIVE_H__ #include <asm/alternative-asm.h> -#include <asm/nops.h> #ifndef __ASSEMBLY__ #include <xen/stringify.h> @@ -27,6 +26,14 @@ extern void apply_alternatives(const struct alt_instr *start, const struct alt_instr *end); extern void alternative_instructions(void); +asm ( ".macro mknops nr_bytes\n\t" +#ifdef HAVE_AS_NOP_DIRECTIVE + ".nop \\nr_bytes, " __stringify(ASM_NOP_MAX) "\n\t" +#else + ".skip \\nr_bytes, 0x90\n\t" +#endif + ".endm\n\t" ); + #define alt_orig_len "(.LXEN%=_orig_e - .LXEN%=_orig_s)" #define alt_pad_len "(.LXEN%=_orig_p - .LXEN%=_orig_e)" #define alt_total_len "(.LXEN%=_orig_p - .LXEN%=_orig_s)" @@ -46,7 +53,7 @@ extern void alternative_instructions(void); #define OLDINSTR_1(oldinstr, n1) \ ".LXEN%=_orig_s:\n\t" oldinstr "\n .LXEN%=_orig_e:\n\t" \ ".LXEN%=_diff = "alt_repl_len(n1)"-"alt_orig_len"\n\t" \ - ".skip "AS_TRUE"(.LXEN%=_diff > 0) * .LXEN%=_diff, 0x90\n\t" \ + "mknops ("AS_TRUE"(.LXEN%=_diff > 0) * .LXEN%=_diff)\n\t" \ ".LXEN%=_orig_p:\n\t" #define ALT_PADDING_LEN(n1, n2) \ @@ -55,7 +62,7 @@ extern void alternative_instructions(void); #define OLDINSTR_2(oldinstr, n1, n2) \ ".LXEN%=_orig_s:\n\t" oldinstr "\n .LXEN%=_orig_e:\n\t" \ ".LXEN%=_diff = "ALT_PADDING_LEN(n1, n2)"\n\t" \ - ".skip "AS_TRUE"(.LXEN%=_diff > 0) * .LXEN%=_diff, 0x90\n\t" \ + "mknops ("AS_TRUE"(.LXEN%=_diff > 0) * .LXEN%=_diff)\n\t" \ ".LXEN%=_orig_p:\n\t" #define ALTINSTR_ENTRY(feature, num) \ -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |