lkml.org 
[lkml]   [2019]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 25/76] powerpc/fsl: Add barrier_nospec implementation for NXP PowerPC Book3E
    Date
    commit ebcd1bfc33c7a90df941df68a6e5d4018c022fba upstream.

    Implement the barrier_nospec as a isync;sync instruction sequence.
    The implementation uses the infrastructure built for BOOK3S 64.

    Signed-off-by: Diana Craciun <diana.craciun@nxp.com>
    [mpe: Split out of larger patch]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/powerpc/Kconfig | 2 +-
    arch/powerpc/include/asm/barrier.h | 8 +++++++-
    arch/powerpc/lib/feature-fixups.c | 31 ++++++++++++++++++++++++++++++
    3 files changed, 39 insertions(+), 2 deletions(-)

    diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
    index a238698178fc..fa8f2aa88189 100644
    --- a/arch/powerpc/Kconfig
    +++ b/arch/powerpc/Kconfig
    @@ -167,7 +167,7 @@ config PPC
    config PPC_BARRIER_NOSPEC
    bool
    default y
    - depends on PPC_BOOK3S_64
    + depends on PPC_BOOK3S_64 || PPC_FSL_BOOK3E

    config GENERIC_CSUM
    def_bool CPU_LITTLE_ENDIAN
    diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h
    index 465a64316897..80024c4f2093 100644
    --- a/arch/powerpc/include/asm/barrier.h
    +++ b/arch/powerpc/include/asm/barrier.h
    @@ -77,12 +77,18 @@ do { \

    #define smp_mb__before_spinlock() smp_mb()

    +#ifdef CONFIG_PPC_BOOK3S_64
    +#define NOSPEC_BARRIER_SLOT nop
    +#elif defined(CONFIG_PPC_FSL_BOOK3E)
    +#define NOSPEC_BARRIER_SLOT nop; nop
    +#endif
    +
    #ifdef CONFIG_PPC_BARRIER_NOSPEC
    /*
    * Prevent execution of subsequent instructions until preceding branches have
    * been fully resolved and are no longer executing speculatively.
    */
    -#define barrier_nospec_asm NOSPEC_BARRIER_FIXUP_SECTION; nop
    +#define barrier_nospec_asm NOSPEC_BARRIER_FIXUP_SECTION; NOSPEC_BARRIER_SLOT

    // This also acts as a compiler barrier due to the memory clobber.
    #define barrier_nospec() asm (stringify_in_c(barrier_nospec_asm) ::: "memory")
    diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c
    index 5df57f7bae0a..b3e362437ec4 100644
    --- a/arch/powerpc/lib/feature-fixups.c
    +++ b/arch/powerpc/lib/feature-fixups.c
    @@ -318,6 +318,37 @@ void do_barrier_nospec_fixups(bool enable)
    }
    #endif /* CONFIG_PPC_BARRIER_NOSPEC */

    +#ifdef CONFIG_PPC_FSL_BOOK3E
    +void do_barrier_nospec_fixups_range(bool enable, void *fixup_start, void *fixup_end)
    +{
    + unsigned int instr[2], *dest;
    + long *start, *end;
    + int i;
    +
    + start = fixup_start;
    + end = fixup_end;
    +
    + instr[0] = PPC_INST_NOP;
    + instr[1] = PPC_INST_NOP;
    +
    + if (enable) {
    + pr_info("barrier-nospec: using isync; sync as speculation barrier\n");
    + instr[0] = PPC_INST_ISYNC;
    + instr[1] = PPC_INST_SYNC;
    + }
    +
    + for (i = 0; start < end; start++, i++) {
    + dest = (void *)start + *start;
    +
    + pr_devel("patching dest %lx\n", (unsigned long)dest);
    + patch_instruction(dest, instr[0]);
    + patch_instruction(dest + 1, instr[1]);
    + }
    +
    + printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i);
    +}
    +#endif /* CONFIG_PPC_FSL_BOOK3E */
    +
    void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end)
    {
    long *start, *end;
    --
    2.19.1


    \
     
     \ /
      Last update: 2019-04-15 20:46    [W:4.136 / U:0.968 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site