lkml.org 
[lkml]   [2022]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 14/31] ARM: early traps initialisation
    Date
    From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>

    commit 04e91b7324760a377a725e218b5ee783826d30f5 upstream.

    Provide a couple of helpers to copy the vectors and stubs, and also
    to flush the copied vectors and stubs.

    Acked-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/arm/kernel/traps.c | 27 +++++++++++++++++++++------
    1 file changed, 21 insertions(+), 6 deletions(-)

    --- a/arch/arm/kernel/traps.c
    +++ b/arch/arm/kernel/traps.c
    @@ -820,10 +820,22 @@ static inline void __init kuser_init(voi
    }
    #endif

    +#ifndef CONFIG_CPU_V7M
    +static void copy_from_lma(void *vma, void *lma_start, void *lma_end)
    +{
    + memcpy(vma, lma_start, lma_end - lma_start);
    +}
    +
    +static void flush_vectors(void *vma, size_t offset, size_t size)
    +{
    + unsigned long start = (unsigned long)vma + offset;
    + unsigned long end = start + size;
    +
    + flush_icache_range(start, end);
    +}
    +
    void __init early_trap_init(void *vectors_base)
    {
    -#ifndef CONFIG_CPU_V7M
    - unsigned long vectors = (unsigned long)vectors_base;
    extern char __stubs_start[], __stubs_end[];
    extern char __vectors_start[], __vectors_end[];
    unsigned i;
    @@ -844,17 +856,20 @@ void __init early_trap_init(void *vector
    * into the vector page, mapped at 0xffff0000, and ensure these
    * are visible to the instruction stream.
    */
    - memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);
    - memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start);
    + copy_from_lma(vectors_base, __vectors_start, __vectors_end);
    + copy_from_lma(vectors_base + 0x1000, __stubs_start, __stubs_end);

    kuser_init(vectors_base);

    - flush_icache_range(vectors, vectors + PAGE_SIZE * 2);
    + flush_vectors(vectors_base, 0, PAGE_SIZE * 2);
    +}
    #else /* ifndef CONFIG_CPU_V7M */
    +void __init early_trap_init(void *vectors_base)
    +{
    /*
    * on V7-M there is no need to copy the vector table to a dedicated
    * memory area. The address is configurable and so a table in the kernel
    * image can be used.
    */
    -#endif
    }
    +#endif

    \
     
     \ /
      Last update: 2022-03-10 15:26    [W:3.220 / U:1.696 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site