Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c812c7d8 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman
Browse files

powerpc/mm: Catch usage of cpu/mmu_has_feature() before jump label init



This allows us to catch incorrect usage of cpu_has_feature() and
mmu_has_feature() prior to jump labels being initialised.

mpe: Use printk() and dump_stack() rather than WARN_ON(), because
WARN_ON() may not work this early in boot. Rename the Kconfig.

Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent c12e6f24
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -69,6 +69,16 @@ config JUMP_LABEL_FEATURE_CHECKS
	  feature checks. This should generate more optimal code for those
	  checks.

config JUMP_LABEL_FEATURE_CHECK_DEBUG
	bool "Do extra check on feature fixup calls"
	depends on DEBUG_KERNEL && JUMP_LABEL_FEATURE_CHECKS
	default n
	help
	  This tries to catch incorrect usage of cpu_has_feature() and
	  mmu_has_feature() in the code.

	  If you don't know what this means, say N.

config FTR_FIXUP_SELFTEST
	bool "Run self-tests of the feature-fixup code"
	depends on DEBUG_KERNEL
+8 −0
Original line number Diff line number Diff line
@@ -25,6 +25,14 @@ static __always_inline bool cpu_has_feature(unsigned long feature)

	BUILD_BUG_ON(!__builtin_constant_p(feature));

#ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG
	if (!static_key_initialized) {
		printk("Warning! cpu_has_feature() used prior to jump label init!\n");
		dump_stack();
		return early_cpu_has_feature(feature);
	}
#endif

	if (CPU_FTRS_ALWAYS & feature)
		return true;

+8 −0
Original line number Diff line number Diff line
@@ -156,6 +156,14 @@ static __always_inline bool mmu_has_feature(unsigned long feature)

	BUILD_BUG_ON(!__builtin_constant_p(feature));

#ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG
	if (!static_key_initialized) {
		printk("Warning! mmu_has_feature() used prior to jump label init!\n");
		dump_stack();
		return early_mmu_has_feature(feature);
	}
#endif

	if (!(MMU_FTRS_POSSIBLE & feature))
		return false;