diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4308-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-Clan.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4308-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-Clan.patch | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4308-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-Clan.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4308-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-Clan.patch new file mode 100644 index 00000000..5268111d --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4308-drm-amdgpu-fix-stack-alignment-ABI-mismatch-for-Clan.patch @@ -0,0 +1,161 @@ +From 0549828354c1707532b672c9e9d08ecc418c1421 Mon Sep 17 00:00:00 2001 +From: Nick Desaulniers <ndesaulniers@google.com> +Date: Wed, 16 Oct 2019 16:02:07 -0700 +Subject: [PATCH 4308/4736] drm/amdgpu: fix stack alignment ABI mismatch for + Clang + +The x86 kernel is compiled with an 8B stack alignment via +`-mpreferred-stack-boundary=3` for GCC since 3.6-rc1 via +commit d9b0cde91c60 ("x86-64, gcc: Use -mpreferred-stack-boundary=3 if supported") +or `-mstack-alignment=8` for Clang. Parts of the AMDGPU driver are +compiled with 16B stack alignment. + +Generally, the stack alignment is part of the ABI. Linking together two +different translation units with differing stack alignment is dangerous, +particularly when the translation unit with the smaller stack alignment +makes calls into the translation unit with the larger stack alignment. +While 8B aligned stacks are sometimes also 16B aligned, they are not +always. + +Multiple users have reported General Protection Faults (GPF) when using +the AMDGPU driver compiled with Clang. Clang is placing objects in stack +slots assuming the stack is 16B aligned, and selecting instructions that +require 16B aligned memory operands. + +At runtime, syscall handlers with 8B aligned stack call into code that +assumes 16B stack alignment. When the stack is a multiple of 8B but not +16B, these instructions result in a GPF. + +Remove the code that added compatibility between the differing compiler +flags, as it will result in runtime GPFs when built with Clang. Cleanups +for GCC will be sent in later patches in the series. + +Link: https://github.com/ClangBuiltLinux/linux/issues/735 +Tested-by: Shirish S <shirish.s@amd.com> +Debugged-by: Yuxuan Shui <yshuiv7@gmail.com> +Reported-by: Shirish S <shirish.s@amd.com> +Reported-by: Yuxuan Shui <yshuiv7@gmail.com> +Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com> +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 | 10 ++++------ + drivers/gpu/drm/amd/display/dc/dcn20/Makefile | 10 ++++------ + drivers/gpu/drm/amd/display/dc/dcn21/Makefile | 10 ++++------ + drivers/gpu/drm/amd/display/dc/dml/Makefile | 10 ++++------ + drivers/gpu/drm/amd/display/dc/dsc/Makefile | 10 ++++------ + 5 files changed, 20 insertions(+), 30 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/Makefile b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +index 16614d73a5fc..ab522ea992d2 100644 +--- a/drivers/gpu/drm/amd/display/dc/calcs/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +@@ -24,13 +24,11 @@ + # It calculates Bandwidth and Watermarks values for HW programming + # + +-ifneq ($(call cc-option, -mpreferred-stack-boundary=4),) +- cc_stack_align := -mpreferred-stack-boundary=4 +-else ifneq ($(call cc-option, -mstack-alignment=16),) +- cc_stack_align := -mstack-alignment=16 +-endif ++calcs_ccflags := -mhard-float -msse + +-calcs_ccflags := -mhard-float -msse $(cc_stack_align) ++ifdef CONFIG_CC_IS_GCC ++calcs_ccflags += -mpreferred-stack-boundary=4 ++endif + + ifdef CONFIG_CC_IS_CLANG + calcs_ccflags += -msse2 +diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/Makefile b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile +index f57a3b281408..a02e02980310 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn20/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dcn20/Makefile +@@ -10,13 +10,11 @@ ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT + DCN20 += dcn20_dsc.o + endif + +-ifneq ($(call cc-option, -mpreferred-stack-boundary=4),) +- cc_stack_align := -mpreferred-stack-boundary=4 +-else ifneq ($(call cc-option, -mstack-alignment=16),) +- cc_stack_align := -mstack-alignment=16 +-endif ++CFLAGS_dcn20_resource.o := -mhard-float -msse + +-CFLAGS_dcn20_resource.o := -mhard-float -msse $(cc_stack_align) ++ifdef CONFIG_CC_IS_GCC ++CFLAGS_dcn20_resource.o += -mpreferred-stack-boundary=4 ++endif + + ifdef CONFIG_CC_IS_CLANG + CFLAGS_dcn20_resource.o += -msse2 +diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/Makefile b/drivers/gpu/drm/amd/display/dc/dcn21/Makefile +index 4ddd4037c1f8..0fa857b69143 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn21/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dcn21/Makefile +@@ -3,13 +3,11 @@ + + DCN21 = dcn21_hubp.o dcn21_hubbub.o dcn21_resource.o dcn21_hwseq.o dcn21_link_encoder.o + +-ifneq ($(call cc-option, -mpreferred-stack-boundary=4),) +- cc_stack_align := -mpreferred-stack-boundary=4 +-else ifneq ($(call cc-option, -mstack-alignment=16),) +- cc_stack_align := -mstack-alignment=16 +-endif ++CFLAGS_dcn21_resource.o := -mhard-float -msse + +-CFLAGS_dcn21_resource.o := -mhard-float -msse $(cc_stack_align) ++ifdef CONFIG_CC_IS_GCC ++CFLAGS_dcn21_resource.o += -mpreferred-stack-boundary=4 ++endif + + ifdef CONFIG_CC_IS_CLANG + CFLAGS_dcn21_resource.o += -msse2 +diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile +index af2a864a6da0..b3db0900b473 100644 +--- a/drivers/gpu/drm/amd/display/dc/dml/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile +@@ -24,13 +24,11 @@ + # It provides the general basic services required by other DAL + # subcomponents. + +-ifneq ($(call cc-option, -mpreferred-stack-boundary=4),) +- cc_stack_align := -mpreferred-stack-boundary=4 +-else ifneq ($(call cc-option, -mstack-alignment=16),) +- cc_stack_align := -mstack-alignment=16 +-endif ++dml_ccflags := -mhard-float -msse + +-dml_ccflags := -mhard-float -msse $(cc_stack_align) ++ifdef CONFIG_CC_IS_GCC ++dml_ccflags += -mpreferred-stack-boundary=4 ++endif + + ifdef CONFIG_CC_IS_CLANG + dml_ccflags += -msse2 +diff --git a/drivers/gpu/drm/amd/display/dc/dsc/Makefile b/drivers/gpu/drm/amd/display/dc/dsc/Makefile +index 17db603f2d1f..4d18e2b60223 100644 +--- a/drivers/gpu/drm/amd/display/dc/dsc/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dsc/Makefile +@@ -1,13 +1,11 @@ + # + # Makefile for the 'dsc' sub-component of DAL. + +-ifneq ($(call cc-option, -mpreferred-stack-boundary=4),) +- cc_stack_align := -mpreferred-stack-boundary=4 +-else ifneq ($(call cc-option, -mstack-alignment=16),) +- cc_stack_align := -mstack-alignment=16 +-endif ++dsc_ccflags := -mhard-float -msse + +-dsc_ccflags := -mhard-float -msse $(cc_stack_align) ++ifdef CONFIG_CC_IS_GCC ++dsc_ccflags += -mpreferred-stack-boundary=4 ++endif + + ifdef CONFIG_CC_IS_CLANG + dsc_ccflags += -msse2 +-- +2.17.1 + |