lkml.org 
[lkml]   [2021]   [Jan]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 14/35] of: fix linker-section match-table corruption
    Date
    From: Johan Hovold <johan@kernel.org>

    commit 5812b32e01c6d86ba7a84110702b46d8a8531fe9 upstream.

    Specify type alignment when declaring linker-section match-table entries
    to prevent gcc from increasing alignment and corrupting the various
    tables with padding (e.g. timers, irqchips, clocks, reserved memory).

    This is specifically needed on x86 where gcc (typically) aligns larger
    objects like struct of_device_id with static extent on 32-byte
    boundaries which at best prevents matching on anything but the first
    entry. Specifying alignment when declaring variables suppresses this
    optimisation.

    Here's a 64-bit example where all entries are corrupt as 16 bytes of
    padding has been inserted before the first entry:

    ffffffff8266b4b0 D __clk_of_table
    ffffffff8266b4c0 d __of_table_fixed_factor_clk
    ffffffff8266b5a0 d __of_table_fixed_clk
    ffffffff8266b680 d __clk_of_table_sentinel

    And here's a 32-bit example where the 8-byte-aligned table happens to be
    placed on a 32-byte boundary so that all but the first entry are corrupt
    due to the 28 bytes of padding inserted between entries:

    812b3ec0 D __irqchip_of_table
    812b3ec0 d __of_table_irqchip1
    812b3fa0 d __of_table_irqchip2
    812b4080 d __of_table_irqchip3
    812b4160 d irqchip_of_match_end

    Verified on x86 using gcc-9.3 and gcc-4.9 (which uses 64-byte
    alignment), and on arm using gcc-7.2.

    Note that there are no in-tree users of these tables on x86 currently
    (even if they are included in the image).

    Fixes: 54196ccbe0ba ("of: consolidate linker section OF match table declarations")
    Fixes: f6e916b82022 ("irqchip: add basic infrastructure")
    Cc: stable <stable@vger.kernel.org> # 3.9
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20201123102319.8090-2-johan@kernel.org
    [ johan: adjust context to 5.4 ]
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    include/linux/of.h | 1 +
    1 file changed, 1 insertion(+)

    --- a/include/linux/of.h
    +++ b/include/linux/of.h
    @@ -1258,6 +1258,7 @@ static inline int of_get_available_child
    #define _OF_DECLARE(table, name, compat, fn, fn_type) \
    static const struct of_device_id __of_table_##name \
    __used __section(__##table##_of_table) \
    + __aligned(__alignof__(struct of_device_id)) \
    = { .compatible = compat, \
    .data = (fn == (fn_type)NULL) ? fn : fn }
    #else

    \
     
     \ /
      Last update: 2021-01-04 17:02    [W:5.243 / U:0.420 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site