lkml.org 
[lkml]   [2020]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.7 229/274] MIPS: Fix exception handler memcpy()
    Date
    From: Ben Hutchings <ben@decadent.org.uk>

    [ Upstream commit f39293fd37fff74c531b7a52d0459cc77db85e7f ]

    The exception handler subroutines are declared as a single char, but
    when copied to the required addresses the copy length is 0x80.

    When range checks are enabled for memcpy() this results in a build
    failure, with error messages such as:

    In file included from arch/mips/mti-malta/malta-init.c:15:
    In function 'memcpy',
    inlined from 'mips_nmi_setup' at arch/mips/mti-malta/malta-init.c:98:2:
    include/linux/string.h:376:4: error: call to '__read_overflow2' declared with attribute error: detected read beyond size of object passed as 2nd parameter
    376 | __read_overflow2();
    | ^~~~~~~~~~~~~~~~~~

    Change the declarations to use type char[].

    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Signed-off-by: YunQiang Su <syq@debian.org>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/mips/loongson2ef/common/init.c | 4 ++--
    arch/mips/loongson64/init.c | 4 ++--
    arch/mips/mti-malta/malta-init.c | 8 ++++----
    arch/mips/pistachio/init.c | 8 ++++----
    4 files changed, 12 insertions(+), 12 deletions(-)

    diff --git a/arch/mips/loongson2ef/common/init.c b/arch/mips/loongson2ef/common/init.c
    index 45512178be77..ce3f02f75e2a 100644
    --- a/arch/mips/loongson2ef/common/init.c
    +++ b/arch/mips/loongson2ef/common/init.c
    @@ -19,10 +19,10 @@ unsigned long __maybe_unused _loongson_addrwincfg_base;
    static void __init mips_nmi_setup(void)
    {
    void *base;
    - extern char except_vec_nmi;
    + extern char except_vec_nmi[];

    base = (void *)(CAC_BASE + 0x380);
    - memcpy(base, &except_vec_nmi, 0x80);
    + memcpy(base, except_vec_nmi, 0x80);
    flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
    }

    diff --git a/arch/mips/loongson64/init.c b/arch/mips/loongson64/init.c
    index da38944471f4..86c5e93258ce 100644
    --- a/arch/mips/loongson64/init.c
    +++ b/arch/mips/loongson64/init.c
    @@ -17,10 +17,10 @@
    static void __init mips_nmi_setup(void)
    {
    void *base;
    - extern char except_vec_nmi;
    + extern char except_vec_nmi[];

    base = (void *)(CAC_BASE + 0x380);
    - memcpy(base, &except_vec_nmi, 0x80);
    + memcpy(base, except_vec_nmi, 0x80);
    flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
    }

    diff --git a/arch/mips/mti-malta/malta-init.c b/arch/mips/mti-malta/malta-init.c
    index ff2c1d809538..893af377aacc 100644
    --- a/arch/mips/mti-malta/malta-init.c
    +++ b/arch/mips/mti-malta/malta-init.c
    @@ -90,24 +90,24 @@ static void __init console_config(void)
    static void __init mips_nmi_setup(void)
    {
    void *base;
    - extern char except_vec_nmi;
    + extern char except_vec_nmi[];

    base = cpu_has_veic ?
    (void *)(CAC_BASE + 0xa80) :
    (void *)(CAC_BASE + 0x380);
    - memcpy(base, &except_vec_nmi, 0x80);
    + memcpy(base, except_vec_nmi, 0x80);
    flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
    }

    static void __init mips_ejtag_setup(void)
    {
    void *base;
    - extern char except_vec_ejtag_debug;
    + extern char except_vec_ejtag_debug[];

    base = cpu_has_veic ?
    (void *)(CAC_BASE + 0xa00) :
    (void *)(CAC_BASE + 0x300);
    - memcpy(base, &except_vec_ejtag_debug, 0x80);
    + memcpy(base, except_vec_ejtag_debug, 0x80);
    flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
    }

    diff --git a/arch/mips/pistachio/init.c b/arch/mips/pistachio/init.c
    index a09a5da38e6b..558995ed6fe8 100644
    --- a/arch/mips/pistachio/init.c
    +++ b/arch/mips/pistachio/init.c
    @@ -83,12 +83,12 @@ phys_addr_t mips_cdmm_phys_base(void)
    static void __init mips_nmi_setup(void)
    {
    void *base;
    - extern char except_vec_nmi;
    + extern char except_vec_nmi[];

    base = cpu_has_veic ?
    (void *)(CAC_BASE + 0xa80) :
    (void *)(CAC_BASE + 0x380);
    - memcpy(base, &except_vec_nmi, 0x80);
    + memcpy(base, except_vec_nmi, 0x80);
    flush_icache_range((unsigned long)base,
    (unsigned long)base + 0x80);
    }
    @@ -96,12 +96,12 @@ static void __init mips_nmi_setup(void)
    static void __init mips_ejtag_setup(void)
    {
    void *base;
    - extern char except_vec_ejtag_debug;
    + extern char except_vec_ejtag_debug[];

    base = cpu_has_veic ?
    (void *)(CAC_BASE + 0xa00) :
    (void *)(CAC_BASE + 0x300);
    - memcpy(base, &except_vec_ejtag_debug, 0x80);
    + memcpy(base, except_vec_ejtag_debug, 0x80);
    flush_icache_range((unsigned long)base,
    (unsigned long)base + 0x80);
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-09 01:14    [W:4.028 / U:0.724 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site