lkml.org 
[lkml]   [2021]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 08/11] powerpc/code-patching: Move patch_exception() outside code-patching.c
    Date
    patch_exception() is dedicated to book3e/64 is nothing more than
    a normal use of patch_branch(), so move it into a place dedicated
    to book3e/64.

    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    ---
    arch/powerpc/include/asm/code-patching.h | 7 -------
    arch/powerpc/include/asm/exception-64e.h | 4 ++++
    arch/powerpc/include/asm/nohash/64/pgtable.h | 6 ++++++
    arch/powerpc/lib/code-patching.c | 16 ----------------
    arch/powerpc/mm/nohash/book3e_pgtable.c | 14 ++++++++++++++
    5 files changed, 24 insertions(+), 23 deletions(-)

    diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h
    index 46e8c5a8ce51..275061c3c977 100644
    --- a/arch/powerpc/include/asm/code-patching.h
    +++ b/arch/powerpc/include/asm/code-patching.h
    @@ -63,13 +63,6 @@ int instr_is_relative_link_branch(ppc_inst_t instr);
    unsigned long branch_target(const u32 *instr);
    int translate_branch(ppc_inst_t *instr, const u32 *dest, const u32 *src);
    bool is_conditional_branch(ppc_inst_t instr);
    -#ifdef CONFIG_PPC_BOOK3E_64
    -void __patch_exception(int exc, unsigned long addr);
    -#define patch_exception(exc, name) do { \
    - extern unsigned int name; \
    - __patch_exception((exc), (unsigned long)&name); \
    -} while (0)
    -#endif

    #define OP_RT_RA_MASK 0xffff0000UL
    #define LIS_R2 (PPC_RAW_LIS(_R2, 0))
    diff --git a/arch/powerpc/include/asm/exception-64e.h b/arch/powerpc/include/asm/exception-64e.h
    index 40cdcb2fb057..b1ef1e92c34a 100644
    --- a/arch/powerpc/include/asm/exception-64e.h
    +++ b/arch/powerpc/include/asm/exception-64e.h
    @@ -149,6 +149,10 @@ exc_##label##_book3e:
    addi r11,r13,PACA_EXTLB; \
    TLB_MISS_RESTORE(r11)

    +#ifndef __ASSEMBLY__
    +extern unsigned int interrupt_base_book3e;
    +#endif
    +
    #define SET_IVOR(vector_number, vector_offset) \
    LOAD_REG_ADDR(r3,interrupt_base_book3e);\
    ori r3,r3,vector_offset@l; \
    diff --git a/arch/powerpc/include/asm/nohash/64/pgtable.h b/arch/powerpc/include/asm/nohash/64/pgtable.h
    index 9d2905a47410..a3313e853e5e 100644
    --- a/arch/powerpc/include/asm/nohash/64/pgtable.h
    +++ b/arch/powerpc/include/asm/nohash/64/pgtable.h
    @@ -313,6 +313,12 @@ extern int __meminit vmemmap_create_mapping(unsigned long start,
    unsigned long phys);
    extern void vmemmap_remove_mapping(unsigned long start,
    unsigned long page_size);
    +void __patch_exception(int exc, unsigned long addr);
    +#define patch_exception(exc, name) do { \
    + extern unsigned int name; \
    + __patch_exception((exc), (unsigned long)&name); \
    +} while (0)
    +
    #endif /* __ASSEMBLY__ */

    #endif /* _ASM_POWERPC_NOHASH_64_PGTABLE_H */
    diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
    index 2d878e67df3f..17e6443eb6c8 100644
    --- a/arch/powerpc/lib/code-patching.c
    +++ b/arch/powerpc/lib/code-patching.c
    @@ -370,22 +370,6 @@ int translate_branch(ppc_inst_t *instr, const u32 *dest, const u32 *src)
    return 1;
    }

    -#ifdef CONFIG_PPC_BOOK3E_64
    -void __patch_exception(int exc, unsigned long addr)
    -{
    - extern unsigned int interrupt_base_book3e;
    - unsigned int *ibase = &interrupt_base_book3e;
    -
    - /* Our exceptions vectors start with a NOP and -then- a branch
    - * to deal with single stepping from userspace which stops on
    - * the second instruction. Thus we need to patch the second
    - * instruction of the exception, not the first one
    - */
    -
    - patch_branch(ibase + (exc / 4) + 1, addr, 0);
    -}
    -#endif
    -
    #ifdef CONFIG_CODE_PATCHING_SELFTEST

    static int instr_is_branch_to_addr(const u32 *instr, unsigned long addr)
    diff --git a/arch/powerpc/mm/nohash/book3e_pgtable.c b/arch/powerpc/mm/nohash/book3e_pgtable.c
    index 77884e24281d..7b6db97c2bdc 100644
    --- a/arch/powerpc/mm/nohash/book3e_pgtable.c
    +++ b/arch/powerpc/mm/nohash/book3e_pgtable.c
    @@ -10,6 +10,7 @@
    #include <asm/pgalloc.h>
    #include <asm/tlb.h>
    #include <asm/dma.h>
    +#include <asm/code-patching.h>

    #include <mm/mmu_decl.h>

    @@ -115,3 +116,16 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
    smp_wmb();
    return 0;
    }
    +
    +void __patch_exception(int exc, unsigned long addr)
    +{
    + unsigned int *ibase = &interrupt_base_book3e;
    +
    + /* Our exceptions vectors start with a NOP and -then- a branch
    + * to deal with single stepping from userspace which stops on
    + * the second instruction. Thus we need to patch the second
    + * instruction of the exception, not the first one
    + */
    +
    + patch_branch(ibase + (exc / 4) + 1, addr, 0);
    +}
    --
    2.33.1
    \
     
     \ /
      Last update: 2021-12-02 13:03    [W:3.861 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site