diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4309-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-GCC-.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4309-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-GCC-.patch | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4309-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-GCC-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4309-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-GCC-.patch new file mode 100644 index 00000000..8be7461e --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4309-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-GCC-.patch @@ -0,0 +1,155 @@ +From b7033f0828ca07dbc4e3a8b4f4c91b23e09eb08c Mon Sep 17 00:00:00 2001 +From: Nick Desaulniers <ndesaulniers@google.com> +Date: Wed, 16 Oct 2019 16:02:08 -0700 +Subject: [PATCH 4309/4736] drm/amdgpu: fix stack alignment ABI mismatch for + GCC 7.1+ + +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: Nick Desaulniers <ndesaulniers@google.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/calcs/Makefile | 9 +++++++++ + drivers/gpu/drm/amd/display/dc/dcn20/Makefile | 9 +++++++++ + drivers/gpu/drm/amd/display/dc/dcn21/Makefile | 9 +++++++++ + drivers/gpu/drm/amd/display/dc/dml/Makefile | 9 +++++++++ + drivers/gpu/drm/amd/display/dc/dsc/Makefile | 9 +++++++++ + 5 files changed, 45 insertions(+) + +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/Makefile b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +index ab522ea992d2..393215ef9f98 100644 +--- a/drivers/gpu/drm/amd/display/dc/calcs/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +@@ -27,6 +27,15 @@ + calcs_ccflags := -mhard-float -msse + + ifdef CONFIG_CC_IS_GCC ++ifeq ($(call cc-ifversion, -lt, 0701, y), y) ++IS_OLD_GCC = 1 ++endif ++endif ++ ++ifdef IS_OLD_GCC ++# Stack alignment mismatch, proceed with caution. ++# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3 ++# (8B stack alignment). + calcs_ccflags += -mpreferred-stack-boundary=4 + endif + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/Makefile b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile +index a02e02980310..d684cb912d92 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn20/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile +@@ -13,6 +13,15 @@ endif + CFLAGS_dcn20_resource.o := -mhard-float -msse + + ifdef CONFIG_CC_IS_GCC ++ifeq ($(call cc-ifversion, -lt, 0701, y), y) ++IS_OLD_GCC = 1 ++endif ++endif ++ ++ifdef IS_OLD_GCC ++# Stack alignment mismatch, proceed with caution. ++# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3 ++# (8B stack alignment). + CFLAGS_dcn20_resource.o += -mpreferred-stack-boundary=4 + endif + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/Makefile b/drivers/gpu/drm/amd/display/dc/dcn21/Makefile +index 0fa857b69143..72609a40c6a3 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn21/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dcn21/Makefile +@@ -6,6 +6,15 @@ DCN21 = dcn21_hubp.o dcn21_hubbub.o dcn21_resource.o dcn21_hwseq.o dcn21_link_en + CFLAGS_dcn21_resource.o := -mhard-float -msse + + ifdef CONFIG_CC_IS_GCC ++ifeq ($(call cc-ifversion, -lt, 0701, y), y) ++IS_OLD_GCC = 1 ++endif ++endif ++ ++ifdef IS_OLD_GCC ++# Stack alignment mismatch, proceed with caution. ++# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3 ++# (8B stack alignment). + CFLAGS_dcn21_resource.o += -mpreferred-stack-boundary=4 + endif + +diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile +index b3db0900b473..f85f2bb1b0c7 100644 +--- a/drivers/gpu/drm/amd/display/dc/dml/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile +@@ -27,6 +27,15 @@ + dml_ccflags := -mhard-float -msse + + ifdef CONFIG_CC_IS_GCC ++ifeq ($(call cc-ifversion, -lt, 0701, y), y) ++IS_OLD_GCC = 1 ++endif ++endif ++ ++ifdef IS_OLD_GCC ++# Stack alignment mismatch, proceed with caution. ++# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3 ++# (8B stack alignment). + dml_ccflags += -mpreferred-stack-boundary=4 + endif + +diff --git a/drivers/gpu/drm/amd/display/dc/dsc/Makefile b/drivers/gpu/drm/amd/display/dc/dsc/Makefile +index 4d18e2b60223..ec2ebee0078f 100644 +--- a/drivers/gpu/drm/amd/display/dc/dsc/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dsc/Makefile +@@ -4,6 +4,15 @@ + dsc_ccflags := -mhard-float -msse + + ifdef CONFIG_CC_IS_GCC ++ifeq ($(call cc-ifversion, -lt, 0701, y), y) ++IS_OLD_GCC = 1 ++endif ++endif ++ ++ifdef IS_OLD_GCC ++# Stack alignment mismatch, proceed with caution. ++# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3 ++# (8B stack alignment). + dsc_ccflags += -mpreferred-stack-boundary=4 + endif + +-- +2.17.1 + |