lkml.org 
[lkml]   [2021]   [Dec]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 04/13] powerpc/ftrace: Add support for livepatch to PPC32
    Date
    PPC64 needs some special logic to properly set up the TOC.
    See commit 85baa095497f ("powerpc/livepatch: Add live patching support
    on ppc64le") for details.

    PPC32 doesn't have TOC so it doesn't need that logic, so adding
    LIVEPATCH support is straight forward.

    Add CONFIG_LIVEPATCH_64 and move livepatch stack logic into that item.

    Livepatch sample modules all work.

    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    ---
    arch/powerpc/Kconfig | 6 +++++-
    arch/powerpc/include/asm/livepatch.h | 8 +++++---
    arch/powerpc/include/asm/thread_info.h | 2 +-
    arch/powerpc/kernel/asm-offsets.c | 2 +-
    4 files changed, 12 insertions(+), 6 deletions(-)

    diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
    index 0631c9241af3..cdac2115eb00 100644
    --- a/arch/powerpc/Kconfig
    +++ b/arch/powerpc/Kconfig
    @@ -9,6 +9,10 @@ config 64BIT
    bool
    default y if PPC64

    +config LIVEPATCH_64
    + def_bool PPC64
    + depends on LIVEPATCH
    +
    config MMU
    bool
    default y
    @@ -230,7 +234,7 @@ config PPC
    select HAVE_KPROBES_ON_FTRACE
    select HAVE_KRETPROBES
    select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
    - select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS && PPC64
    + select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS
    select HAVE_MOD_ARCH_SPECIFIC
    select HAVE_NMI if PERF_EVENTS || (PPC64 && PPC_BOOK3S)
    select HAVE_OPTPROBES
    diff --git a/arch/powerpc/include/asm/livepatch.h b/arch/powerpc/include/asm/livepatch.h
    index 4fe018cc207b..37af961eb74c 100644
    --- a/arch/powerpc/include/asm/livepatch.h
    +++ b/arch/powerpc/include/asm/livepatch.h
    @@ -23,12 +23,14 @@ static inline void klp_arch_set_pc(struct ftrace_regs *fregs, unsigned long ip)
    static inline unsigned long klp_get_ftrace_location(unsigned long faddr)
    {
    /*
    - * Live patch works only with -mprofile-kernel on PPC. In this case,
    - * the ftrace location is always within the first 16 bytes.
    + * Live patch works on PPC32 and only with -mprofile-kernel on PPC64. In
    + * both cases, the ftrace location is always within the first 16 bytes.
    */
    return ftrace_location_range(faddr, faddr + 16);
    }
    +#endif /* CONFIG_LIVEPATCH */

    +#ifdef CONFIG_LIVEPATCH_64
    static inline void klp_init_thread_info(struct task_struct *p)
    {
    /* + 1 to account for STACK_END_MAGIC */
    @@ -36,6 +38,6 @@ static inline void klp_init_thread_info(struct task_struct *p)
    }
    #else
    static inline void klp_init_thread_info(struct task_struct *p) { }
    -#endif /* CONFIG_LIVEPATCH */
    +#endif

    #endif /* _ASM_POWERPC_LIVEPATCH_H */
    diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
    index 5725029aaa29..42f8a1f99036 100644
    --- a/arch/powerpc/include/asm/thread_info.h
    +++ b/arch/powerpc/include/asm/thread_info.h
    @@ -51,7 +51,7 @@ struct thread_info {
    unsigned int cpu;
    #endif
    unsigned long local_flags; /* private flags for thread */
    -#ifdef CONFIG_LIVEPATCH
    +#ifdef CONFIG_LIVEPATCH_64
    unsigned long *livepatch_sp;
    #endif
    #if defined(CONFIG_VIRT_CPU_ACCOUNTING_NATIVE) && defined(CONFIG_PPC32)
    diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
    index 7582f3e3a330..eec536aef83a 100644
    --- a/arch/powerpc/kernel/asm-offsets.c
    +++ b/arch/powerpc/kernel/asm-offsets.c
    @@ -94,7 +94,7 @@ int main(void)
    OFFSET(TASK_CPU, task_struct, thread_info.cpu);
    #endif

    -#ifdef CONFIG_LIVEPATCH
    +#ifdef CONFIG_LIVEPATCH_64
    OFFSET(TI_livepatch_sp, thread_info, livepatch_sp);
    #endif

    --
    2.33.1
    \
     
     \ /
      Last update: 2021-12-20 17:39    [W:5.332 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site