Commit 4ab7674f authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Peter Zijlstra
Browse files

objtool: Make jump label hack optional



Objtool secretly does a jump label hack to overcome the limitations of
the toolchain.  Make the hack explicit (and optional for other arches)
by turning it into a cmdline option and kernel config option.

Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarMiroslav Benes <mbenes@suse.cz>
Link: https://lkml.kernel.org/r/3bdcbfdd27ecb01ddec13c04bdf756a583b13d24.1650300597.git.jpoimboe@redhat.com
parent 26e17689
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ config JUMP_LABEL
	bool "Optimize very unlikely/likely branches"
	depends on HAVE_ARCH_JUMP_LABEL
	depends on CC_HAS_ASM_GOTO
	select OBJTOOL if HAVE_JUMP_LABEL_HACK
	help
	 This option enables a transparent branch optimization that
	 makes certain almost-always-true or almost-always-false branch
@@ -1031,6 +1032,9 @@ config ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
config HAVE_OBJTOOL
	bool

config HAVE_JUMP_LABEL_HACK
	bool

config HAVE_STACK_VALIDATION
	bool
	help
+1 −0
Original line number Diff line number Diff line
@@ -212,6 +212,7 @@ config X86
	select HAVE_IOREMAP_PROT
	select HAVE_IRQ_EXIT_ON_IRQ_STACK	if X86_64
	select HAVE_IRQ_TIME_ACCOUNTING
	select HAVE_JUMP_LABEL_HACK		if HAVE_OBJTOOL
	select HAVE_KERNEL_BZIP2
	select HAVE_KERNEL_GZIP
	select HAVE_KERNEL_LZ4
+3 −3
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@
	_ASM_PTR "%c0 + %c1 - .\n\t"			\
	".popsection \n\t"

#ifdef CONFIG_OBJTOOL
#ifdef CONFIG_HAVE_JUMP_LABEL_HACK

static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
{
@@ -34,7 +34,7 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
	return true;
}

#else /* !CONFIG_OBJTOOL */
#else /* !CONFIG_HAVE_JUMP_LABEL_HACK */

static __always_inline bool arch_static_branch(struct static_key * const key, const bool branch)
{
@@ -48,7 +48,7 @@ static __always_inline bool arch_static_branch(struct static_key * const key, co
	return true;
}

#endif /* CONFIG_OBJTOOL */
#endif /* CONFIG_HAVE_JUMP_LABEL_HACK */

static __always_inline bool arch_static_branch_jump(struct static_key * const key, const bool branch)
{
+1 −0
Original line number Diff line number Diff line
@@ -227,6 +227,7 @@ ifdef CONFIG_OBJTOOL
objtool := $(objtree)/tools/objtool/objtool

objtool_args =								\
	$(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label)	\
	$(if $(CONFIG_X86_KERNEL_IBT), --lto --ibt)			\
	$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount)		\
	$(if $(CONFIG_UNWINDER_ORC), --orc)				\
+4 −0
Original line number Diff line number Diff line
@@ -117,6 +117,10 @@ objtool_link()
		# Don't perform vmlinux validation unless explicitly requested,
		# but run objtool on vmlinux.o now that we have an object file.

		if is_enabled CONFIG_HAVE_JUMP_LABEL_HACK; then
			objtoolopt="${objtoolopt} --hacks=jump_label"
		fi

		if is_enabled CONFIG_X86_KERNEL_IBT; then
			objtoolopt="${objtoolopt} --ibt"
		fi
Loading