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 <li...@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 <b...@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.

Reply via email to