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.