• Nick Desaulniers's avatar
    drm/amdgpu: fix stack alignment ABI mismatch for GCC 7.1+ · 00db2971
    Nick Desaulniers authored
    GCC earlier than 7.1 errors when compiling code that makes use of
    `double`s and sets a stack alignment outside of the range of [2^4-2^12]:
    
    $ cat foo.c
    double foo(double x, double y) {
      return x + y;
    }
    $ gcc-4.9 -mpreferred-stack-boundary=3 foo.c
    error: -mpreferred-stack-boundary=3 is not between 4 and 12
    
    This is likely why the AMDGPU driver was ever compiled with a different
    stack alignment (and thus different ABI) than the rest of the x86
    kernel. The kernel uses 8B stack alignment, while the driver was using
    16B stack alignment in a few places.
    
    Since GCC 7.1+ doesn't error, fix the ABI mismatch for users of newer
    versions of GCC.
    
    There was discussion about whether to mark the driver broken or not for
    users of GCC earlier than 7.1, but since the driver currently is
    working, don't explicitly break the driver for them here.
    
    Relying on differing stack alignment is unspecified behavior, and
    brittle, and may break in the future.
    
    This patch is no functional change for GCC users earlier than 7.1. It's
    been compile tested on GCC 4.9 and 8.3 to check the correct flags. It
    should be boot tested when built with GCC 7.1+.
    
    -mincoming-stack-boundary= or -mstackrealign may help keep this code
    building for pre-GCC 7.1 users.
    
    The version check for GCC is broken into two conditionals, both because
    cc-ifversion is currently GCC specific, and it simplifies a subsequent
    patch.
    Signed-off-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    00db2971
Makefile 2.94 KB