2023-03-18 04:16:23

by David Gow

[permalink] [raw]
Subject: [PATCH] arch:um: Only disable SSE on clang to work around old GCC bugs

As part of the Rust support for UML, we disable SSE (and similar flags)
to match the normal x86 builds. This both makes sense (we ideally want a
similar configuration to x86), and works around a crash bug with SSE
generation under Rust with LLVM.

However, this breaks compiling stdlib.h under gcc < 11, as the x86_64
ABI requires floating-point return values be stored in an SSE register.
gcc 11 fixes this by only doing register allocation when a function is
actually used, and since we never use atof(), it shouldn't be a problem:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99652

Nevertheless, only disable SSE on clang setups, as that's a simple way
of working around everyone's bugs.

Fixes: 884981867947 ("rust: arch/um: Disable FP/SIMD instruction to match x86")
Reported-by: Roberto Sassu <[email protected]>
Link: https://lore.kernel.org/linux-um/[email protected]/
Tested-by: Roberto Sassu <[email protected]>
Tested-by: SeongJae Park <[email protected]>
Signed-off-by: David Gow <[email protected]>
---
arch/x86/Makefile.um | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/arch/x86/Makefile.um b/arch/x86/Makefile.um
index b70559b821df..2106a2bd152b 100644
--- a/arch/x86/Makefile.um
+++ b/arch/x86/Makefile.um
@@ -3,9 +3,14 @@ core-y += arch/x86/crypto/

#
# Disable SSE and other FP/SIMD instructions to match normal x86
+# This is required to work around issues in older LLVM versions, but breaks
+# GCC versions < 11. See:
+# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99652
#
+ifeq ($(CONFIG_CC_IS_CLANG),y)
KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2
+endif

ifeq ($(CONFIG_X86_32),y)
START := 0x8048000
--
2.40.0.rc1.284.g88254d51c5-goog



2023-03-20 17:27:35

by Vincenzo Palazzo

[permalink] [raw]
Subject: Re: [PATCH] arch:um: Only disable SSE on clang to work around old GCC bugs

> As part of the Rust support for UML, we disable SSE (and similar flags)
> to match the normal x86 builds. This both makes sense (we ideally want a
> similar configuration to x86), and works around a crash bug with SSE
> generation under Rust with LLVM.
>
> However, this breaks compiling stdlib.h under gcc < 11, as the x86_64
> ABI requires floating-point return values be stored in an SSE register.
> gcc 11 fixes this by only doing register allocation when a function is
> actually used, and since we never use atof(), it shouldn't be a problem:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99652
>
> Nevertheless, only disable SSE on clang setups, as that's a simple way
> of working around everyone's bugs.
>
> Fixes: 884981867947 ("rust: arch/um: Disable FP/SIMD instruction to match x86")
> Reported-by: Roberto Sassu <[email protected]>
> Link: https://lore.kernel.org/linux-um/[email protected]/
> Tested-by: Roberto Sassu <[email protected]>
> Tested-by: SeongJae Park <[email protected]>
> Signed-off-by: David Gow <[email protected]>
> ---
> arch/x86/Makefile.um | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/arch/x86/Makefile.um b/arch/x86/Makefile.um
> index b70559b821df..2106a2bd152b 100644
> --- a/arch/x86/Makefile.um
> +++ b/arch/x86/Makefile.um
> @@ -3,9 +3,14 @@ core-y += arch/x86/crypto/
>
> #
> # Disable SSE and other FP/SIMD instructions to match normal x86
> +# This is required to work around issues in older LLVM versions, but breaks
> +# GCC versions < 11. See:
> +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99652
> #
> +ifeq ($(CONFIG_CC_IS_CLANG),y)
> KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
> KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2
> +endif
>
> ifeq ($(CONFIG_X86_32),y)
> START := 0x8048000
> --
> 2.40.0.rc1.284.g88254d51c5-goog


Reviewed-by: Vincenzo Palazzo <[email protected]>

2023-03-21 20:13:11

by Arthur Grillo

[permalink] [raw]
Subject: Re: [PATCH] arch:um: Only disable SSE on clang to work around old GCC bugs



On 18/03/23 01:15, 'David Gow' via KUnit Development wrote:
> As part of the Rust support for UML, we disable SSE (and similar flags)
> to match the normal x86 builds. This both makes sense (we ideally want a
> similar configuration to x86), and works around a crash bug with SSE
> generation under Rust with LLVM.
>
> However, this breaks compiling stdlib.h under gcc < 11, as the x86_64
> ABI requires floating-point return values be stored in an SSE register.
> gcc 11 fixes this by only doing register allocation when a function is
> actually used, and since we never use atof(), it shouldn't be a problem:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99652
>
> Nevertheless, only disable SSE on clang setups, as that's a simple way
> of working around everyone's bugs.
>
> Fixes: 884981867947 ("rust: arch/um: Disable FP/SIMD instruction to match x86")
> Reported-by: Roberto Sassu <[email protected]>
> Link: https://lore.kernel.org/linux-um/[email protected]/
> Tested-by: Roberto Sassu <[email protected]>
> Tested-by: SeongJae Park <[email protected]>
> Signed-off-by: David Gow <[email protected]>
> ---
> arch/x86/Makefile.um | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/arch/x86/Makefile.um b/arch/x86/Makefile.um
> index b70559b821df..2106a2bd152b 100644
> --- a/arch/x86/Makefile.um
> +++ b/arch/x86/Makefile.um
> @@ -3,9 +3,14 @@ core-y += arch/x86/crypto/
>
> #
> # Disable SSE and other FP/SIMD instructions to match normal x86
> +# This is required to work around issues in older LLVM versions, but breaks
> +# GCC versions < 11. See:
> +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99652
> #
> +ifeq ($(CONFIG_CC_IS_CLANG),y)
> KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
> KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2
> +endif
>
> ifeq ($(CONFIG_X86_32),y)
> START := 0x8048000

Tested-by: Arthur Grillo <[email protected]>

2023-03-31 08:33:59

by David Gow

[permalink] [raw]
Subject: Re: [PATCH] arch:um: Only disable SSE on clang to work around old GCC bugs

On Sat, 18 Mar 2023 at 12:16, David Gow <[email protected]> wrote:
>
> As part of the Rust support for UML, we disable SSE (and similar flags)
> to match the normal x86 builds. This both makes sense (we ideally want a
> similar configuration to x86), and works around a crash bug with SSE
> generation under Rust with LLVM.
>
> However, this breaks compiling stdlib.h under gcc < 11, as the x86_64
> ABI requires floating-point return values be stored in an SSE register.
> gcc 11 fixes this by only doing register allocation when a function is
> actually used, and since we never use atof(), it shouldn't be a problem:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99652
>
> Nevertheless, only disable SSE on clang setups, as that's a simple way
> of working around everyone's bugs.
>
> Fixes: 884981867947 ("rust: arch/um: Disable FP/SIMD instruction to match x86")
> Reported-by: Roberto Sassu <[email protected]>
> Link: https://lore.kernel.org/linux-um/[email protected]/
> Tested-by: Roberto Sassu <[email protected]>
> Tested-by: SeongJae Park <[email protected]>
> Signed-off-by: David Gow <[email protected]>
> ---

Any chance we could get this picked up as a fix for 6.3? The UML build
is still broken with older gcc versions.

Cheers,
-- David


Attachments:
smime.p7s (3.91 kB)
S/MIME Cryptographic Signature

2023-03-31 08:59:23

by Richard Weinberger

[permalink] [raw]
Subject: Re: [PATCH] arch:um: Only disable SSE on clang to work around old GCC bugs

----- Ursprüngliche Mail -----
> Von: "davidgow" <[email protected]>
> An: "richard" <[email protected]>, "anton ivanov" <[email protected]>, "Johannes Berg"
> Any chance we could get this picked up as a fix for 6.3? The UML build
> is still broken with older gcc versions.

Sure. Just got flooded with other stuff. :-S

Thanks,
//richard

2023-03-31 13:46:24

by Miguel Ojeda

[permalink] [raw]
Subject: Re: [PATCH] arch:um: Only disable SSE on clang to work around old GCC bugs

On Sat, Mar 18, 2023 at 5:16 AM David Gow <[email protected]> wrote:
>
> Nevertheless, only disable SSE on clang setups, as that's a simple way
> of working around everyone's bugs.

Sounds good to me. If GCC >= 11 has fixed it, should we instead test
for GCC < 11, i.e. it could help catching future new regressions like
the linked GCC bug, if I understand correctly, right? Of course, that
could be done for the next cycle, since this one minimizes the
original change w.r.t. v6.2.

By the way, missing space on the title (`arch:um`).

Cheers,
Miguel

2023-04-04 08:03:00

by Richard Weinberger

[permalink] [raw]
Subject: Re: [PATCH] arch:um: Only disable SSE on clang to work around old GCC bugs

----- Ursprüngliche Mail -----
>> Von: "davidgow" <[email protected]>
>> An: "richard" <[email protected]>, "anton ivanov"
>> <[email protected]>, "Johannes Berg"
>> Any chance we could get this picked up as a fix for 6.3? The UML build
>> is still broken with older gcc versions.
>
> Sure. Just got flooded with other stuff. :-S

Patch applied to fixes branch. PR will happen soon.

Thanks everyone and sorry for the delay on my side!

--
Thanks,
//richard