Re: jump_label: move 'asm goto' support test to Kconfig
From: Sedat Dilek
Date: Fri Jan 04 2019 - 04:57:03 EST
On Thu, Jan 3, 2019 at 1:36 AM Masahiro Yamada
<yamada.masahiro@xxxxxxxxxxxxx> wrote:
>
> On Wed, Jan 2, 2019 at 9:14 PM Sedat Dilek <sedat.dilek@xxxxxxxxx> wrote:
> >
> > Hi,
> >
> > I was not aware that CONFIG_JUMP_LABEL Kconfig setting depends on the
> > support of asm-goto.
> >
> > Currently, I am doing experiments with clang-7 and a snapshot of
> > clang-8 on Linux/x86.
> > These compilers have no asm-goto support.
> >
> > What is your recommendation for Linux >= v4.20?
> > I am asking as it is possible to set CONFIG_JUMP_LABEL=y when
> > compiling with clang - which has no effect.
> > This is confusing.
> >
> > Thanks, this patch makes things clearer and protects users from
> > setting "wrong" in the sense of non-functional settings.
> >
> > I have tested this against recent Linus tree where kbuild/kconfig Git
> > pulls were latest commits.
> >
> > Tested-by: Sedat Dilek <sedat.dilek@xxxxxxxxx> [ x86 with LLVM/Clang
> > v7 and v8 (snapshot) ]
>
>
> Which part was tested?
>
> x86 kernel cannot be compiled with Clang
> since it lacks the asm-goto support.
>
>
> $ make CC=clang
> Compiler lacks asm-goto support.
> arch/x86/Makefile:293: recipe for target 'checkbin' failed
> make: *** [checkbin] Error 1
>
Yes, this needs a workaround (see attachment).
As a base I took kbuid.git#for-next on top of Linux v4.20...
$ git log --oneline -2
58609f06cfb6 (HEAD -> 4.20.0-2-amd64-cbl) x86: Workaround clang does
not support asm-goto
68af7c873957 (for-4.20/kbuild-next-20190103) kbuild: remove
unnecessary stubs for archheader and archscripts
...and includes:
f44251005047 jump_label: move 'asm goto' support test to Kconfig
My compiler is clang-7 from Debian/testing.
$ git log --oneline -2
58609f06cfb6 (HEAD -> 4.20.0-2-amd64-cbl) x86: Workaround clang does
not support asm-goto
68af7c873957 (for-4.20/kbuild-next-20190103) kbuild: remove
unnecessary stubs for archheader and archscripts
It's compile-tested only on Debian/testing AMD64.
I cannot boot into bare metal.
This might have other root causes.
- Sedat -
P.S.: Additional informations
Booting in QEMU 3.1 shows...
$ ./run_qemu.sh
Probing EDD (edd=off to disable)... ok
XZ-compressed data is corrupt
-- System haltedqemu-system-x86_64: terminating on signal 2
$ cat run_qemu.sh
KPATH=$(pwd)
qemu-system-x86_64 -enable-kvm -M pc -kernel $KPATH/bzImage -initrd
$KPATH/initrd.img -m 512 -net none -serial stdio -append
"root=/dev/ram0 console=ttyS0 hung_task_panic=1
earlyprintk=ttyS0,115200"
NOTE: I can boot a Linux v4.20 kernel with this QEMU version.
From 53727072385d3e9327e2f7c466b49078b09286ae Mon Sep 17 00:00:00 2001
From: Sedat Dilek <sedat.dilek@xxxxxxxxxxx>
Date: Thu, 3 Jan 2019 15:03:12 +0100
Subject: [PATCH] x86: Workaround clang does not support asm-goto
Only warn once that Clang does not support asm-goto (see LLVM bug #9295).
Avoid and thus reduce warnings by adding '-D__BPF_TRACING__' argument to KBUILD_CFLAGS where needed (inspired by [1]).
Testing: The patch "jump_label: move 'asm goto' support test to Kconfig" from [2].
[1] https://github.com/ClangBuiltLinux/continuous-integration/blob/master/patches/linux/x86_64/0001-DO-NOT-UPSTREAM-x86-Avoid-warnings-errors-due-to-lac.patch
[2] https://lore.kernel.org/patchwork/patch/1028282/
[3] https://github.com/ClangBuiltLinux/linux/issues/6
---
arch/x86/Makefile | 5 +++--
arch/x86/boot/compressed/Makefile | 4 ++++
arch/x86/include/asm/cpufeature.h | 8 --------
drivers/firmware/efi/libstub/Makefile | 4 ++++
4 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 9c5a67d1b9c1..ba8ee0de0397 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -290,8 +290,9 @@ vdso_install:
archprepare: checkbin
checkbin:
ifndef CONFIG_CC_HAS_ASM_GOTO
- @echo Compiler lacks asm-goto support.
- @exit 1
+ @echo Warning: Compiler lacks asm-goto support.
+ @exit 0
+KBUILD_CFLAGS += -D__BPF_TRACING__
endif
ifdef CONFIG_RETPOLINE
ifeq ($(RETPOLINE_CFLAGS),)
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
index 466f66c8a7f8..bc8991fede60 100644
--- a/arch/x86/boot/compressed/Makefile
+++ b/arch/x86/boot/compressed/Makefile
@@ -39,6 +39,10 @@ KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
KBUILD_CFLAGS += -Wno-pointer-sign
+ifndef CONFIG_CC_HAS_ASM_GOTO
+KBUILD_CFLAGS += -D__BPF_TRACING__
+endif
+
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
GCOV_PROFILE := n
UBSAN_SANITIZE :=n
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index ce95b8cbd229..4774fafee82b 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -142,14 +142,6 @@ extern void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int bit);
#if defined(__clang__) && !defined(CONFIG_CC_HAS_ASM_GOTO)
-/*
- * Workaround for the sake of BPF compilation which utilizes kernel
- * headers, but clang does not support ASM GOTO and fails the build.
- */
-#ifndef __BPF_TRACING__
-#warning "Compiler lacks ASM_GOTO support. Add -D __BPF_TRACING__ to your compiler arguments"
-#endif
-
#define static_cpu_has(bit) boot_cpu_has(bit)
#else
diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile
index d9845099635e..68ff33dc075d 100644
--- a/drivers/firmware/efi/libstub/Makefile
+++ b/drivers/firmware/efi/libstub/Makefile
@@ -24,6 +24,10 @@ cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) \
cflags-$(CONFIG_EFI_ARMSTUB) += -I$(srctree)/scripts/dtc/libfdt
+ifndef CONFIG_CC_HAS_ASM_GOTO
+cflags-$(CONFIG_X86) += -D__BPF_TRACING__
+endif
+
KBUILD_CFLAGS := $(cflags-y) -DDISABLE_BRANCH_PROFILING \
-D__NO_FORTIFY \
$(call cc-option,-ffreestanding) \
--
2.20.1
Attachment:
config-4.20.0-2-amd64-cbl
Description: Binary data