[PATCH] powerpc: Fix crash during static key init on ppc32
Christian Kujau
lists at nerdbynature.de
Wed Aug 10 18:17:55 AEST 2016
On Wed, 10 Aug 2016, Benjamin Herrenschmidt wrote:
> We cannot do those initializations from apply_feature_fixups() as
> this function runs in a very restricted environment in 32-bit where
> the kernel isn't running at its linked address and the PTRRELOC()
> macro must be used for any global accesss.
>
> Instead, split them into a separtate steup_feature_keys() function
> which is called in a more suitable spot on ppc32.
Wow, cool. With that applied (on top of mainline from some minutes ago),
this PowerPC G4 boots again. Thanks!
Tested-by: Christian Kujau <lists at nerdbynature.de>
@Michael: thanks for the git-bisect tutorial, although I'm glad that I was
able to skip it this time.
Christian.
>
> Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> ---
>
> diff --git a/arch/powerpc/include/asm/feature-fixups.h b/arch/powerpc/include/asm/feature-fixups.h
> index 57fec8a..ddf54f5 100644
> --- a/arch/powerpc/include/asm/feature-fixups.h
> +++ b/arch/powerpc/include/asm/feature-fixups.h
> @@ -186,6 +186,7 @@ label##3: \
>
> #ifndef __ASSEMBLY__
> void apply_feature_fixups(void);
> +void setup_feature_keys(void);
> #endif
>
> #endif /* __ASM_POWERPC_FEATURE_FIXUPS_H */
> diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
> index c3e861d..9a2ae96 100644
> --- a/arch/powerpc/kernel/setup_32.c
> +++ b/arch/powerpc/kernel/setup_32.c
> @@ -102,6 +102,9 @@ extern unsigned int memset_nocache_branch; /* Insn to be replaced by NOP */
>
> notrace void __init machine_init(u64 dt_ptr)
> {
> + /* Configure static keys first */
> + setup_feature_keys();
> +
> /* Enable early debugging if any specified (see udbg.h) */
> udbg_early_init();
>
> diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
> index eafb9a7..7ac8e6e 100644
> --- a/arch/powerpc/kernel/setup_64.c
> +++ b/arch/powerpc/kernel/setup_64.c
> @@ -300,6 +300,7 @@ void __init early_setup(unsigned long dt_ptr)
>
> /* Apply all the dynamic patching */
> apply_feature_fixups();
> + setup_feature_keys();
>
> /* Initialize the hash table or TLB handling */
> early_init_mmu();
> diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c
> index 74145f0..043415f 100644
> --- a/arch/powerpc/lib/feature-fixups.c
> +++ b/arch/powerpc/lib/feature-fixups.c
> @@ -188,7 +188,10 @@ void __init apply_feature_fixups(void)
> &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup);
> #endif
> do_final_fixups();
> +}
>
> +void __init setup_feature_keys(void)
> +{
> /*
> * Initialise jump label. This causes all the cpu/mmu_has_feature()
> * checks to take on their correct polarity based on the current set of
>
--
BOFH excuse #135:
You put the disk in upside down.
More information about the Linuxppc-dev
mailing list