• Daniel Kurtz's avatar
    earlycon: Use a pointer table to fix __earlycon_table stride · dd709e72
    Daniel Kurtz authored
    Commit 99492c39 ("earlycon: Fix __earlycon_table stride") tried to fix
    __earlycon_table stride by forcing the earlycon_id struct alignment to 32
    and asking the linker to 32-byte align the __earlycon_table symbol.  This
    fix was based on commit 07fca0e5 ("tracing: Properly align linker
    defined symbols") which tried a similar fix for the tracing subsystem.
    
    However, this fix doesn't quite work because there is no guarantee that
    gcc will place structures packed into an array format.  In fact, gcc 4.9
    chooses to 64-byte align these structs by inserting additional padding
    between the entries because it has no clue that they are supposed to be in
    an array.  If we are unlucky, the linker will assign symbol
    "__earlycon_table" to a 32-byte aligned address which does not correspond
    to the 64-byte aligned contents of section "__earlycon_table".
    
    To address this same problem, the fix to the tracing system was
    subsequently re-implemented using a more robust table of pointers approach
    by commits:
     3d56e331 ("tracing: Replace syscall_meta_data struct array with pointer array")
     65498646 ("tracepoints: Fix section alignment using pointer array")
     e4a9ea5e ("tracing: Replace trace_event struct array with pointer array")
    
    Let's use this same "array of pointers to structs" approach for
    EARLYCON_TABLE.
    
    Fixes: 99492c39 ("earlycon: Fix __earlycon_table stride")
    Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
    Suggested-by: default avatarAaron Durbin <adurbin@chromium.org>
    Reviewed-by: default avatarRob Herring <robh@kernel.org>
    Tested-by: default avatarGuenter Roeck <groeck@chromium.org>
    Reviewed-by: default avatarGuenter Roeck <groeck@chromium.org>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    dd709e72
vmlinux.lds.h 29.4 KB