lkml.org 
[lkml]   [2022]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 013/130] x86/alternative: Support ALTERNATIVE_TERNARY
    Date
    From: Juergen Gross <jgross@suse.com>

    commit e208b3c4a9748b2c17aa09ba663b5096ccf82dce upstream.

    Add ALTERNATIVE_TERNARY support for replacing an initial instruction
    with either of two instructions depending on a feature:

    ALTERNATIVE_TERNARY "default_instr", FEATURE_NR,
    "feature_on_instr", "feature_off_instr"

    which will start with "default_instr" and at patch time will,
    depending on FEATURE_NR being set or not, patch that with either
    "feature_on_instr" or "feature_off_instr".

    [ bp: Add comment ontop. ]

    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210311142319.4723-7-jgross@suse.com
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/include/asm/alternative.h | 13 +++++++++++++
    1 file changed, 13 insertions(+)

    --- a/arch/x86/include/asm/alternative.h
    +++ b/arch/x86/include/asm/alternative.h
    @@ -179,6 +179,11 @@ static inline int alternatives_text_rese
    ALTINSTR_REPLACEMENT(newinstr2, feature2, 2) \
    ".popsection\n"

    +/* If @feature is set, patch in @newinstr_yes, otherwise @newinstr_no. */
    +#define ALTERNATIVE_TERNARY(oldinstr, feature, newinstr_yes, newinstr_no) \
    + ALTERNATIVE_2(oldinstr, newinstr_no, X86_FEATURE_ALWAYS, \
    + newinstr_yes, feature)
    +
    #define ALTERNATIVE_3(oldinsn, newinsn1, feat1, newinsn2, feat2, newinsn3, feat3) \
    OLDINSTR_3(oldinsn, 1, 2, 3) \
    ".pushsection .altinstructions,\"a\"\n" \
    @@ -210,6 +215,9 @@ static inline int alternatives_text_rese
    #define alternative_2(oldinstr, newinstr1, feature1, newinstr2, feature2) \
    asm_inline volatile(ALTERNATIVE_2(oldinstr, newinstr1, feature1, newinstr2, feature2) ::: "memory")

    +#define alternative_ternary(oldinstr, feature, newinstr_yes, newinstr_no) \
    + asm_inline volatile(ALTERNATIVE_TERNARY(oldinstr, feature, newinstr_yes, newinstr_no) ::: "memory")
    +
    /*
    * Alternative inline assembly with input.
    *
    @@ -380,6 +388,11 @@ static inline int alternatives_text_rese
    .popsection
    .endm

    +/* If @feature is set, patch in @newinstr_yes, otherwise @newinstr_no. */
    +#define ALTERNATIVE_TERNARY(oldinstr, feature, newinstr_yes, newinstr_no) \
    + ALTERNATIVE_2 oldinstr, newinstr_no, X86_FEATURE_ALWAYS, \
    + newinstr_yes, feature
    +
    #endif /* __ASSEMBLY__ */

    #endif /* _ASM_X86_ALTERNATIVE_H */

    \
     
     \ /
      Last update: 2022-07-12 20:46    [W:4.327 / U:0.460 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site