Benjamin Herrenschmidt <b...@kernel.crashing.org> writes: > On Mon, 2018-10-08 at 17:04 +1000, Nicholas Piggin wrote: >> On Mon, 08 Oct 2018 15:08:31 +1100 >> Benjamin Herrenschmidt <b...@kernel.crashing.org> wrote: >> >> > HMIs will crash the kernel due to >> > >> > BRANCH_LINK_TO_FAR(hmi_exception_realmode) >> > >> > Calling into the OPD instead of the actual code. >> > >> > Signed-off-by: Benjamin Herrenschmidt <b...@kernel.crashing.org> >> > --- >> > >> > This hack fixes it for me, but it's not great. Nick, any better idea ? >> >> Is it a hack because the ifdef gunk, or because there's something >> deeper wrong with using the .sym? > > I'd say ifdef gunk, also the KVM use doesn't need it bcs the kvm entry > isn't an OPD. > >> I guess all those handlers that load label address by hand could have >> the bug silently creep in. Can we have them use the DOTSYM() macro? > > The KVM one doesnt have a dotsym does it ? > > Also should we load the TOC from the OPD ?
Technically yes. But I thought because we build with mcmodel=medium we'll never actually get multiple TOCs in the kernel itself, so it doesn't actually matter. So this seems to work for now: diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 301a6a86a20f..e5566e248a02 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -1149,7 +1149,7 @@ TRAMP_REAL_BEGIN(hmi_exception_early) EXCEPTION_PROLOG_COMMON_2(PACA_EXGEN) EXCEPTION_PROLOG_COMMON_3(0xe60) addi r3,r1,STACK_FRAME_OVERHEAD - BRANCH_LINK_TO_FAR(hmi_exception_realmode) /* Function call ABI */ + BRANCH_LINK_TO_FAR(DOTSYM(hmi_exception_realmode)) /* Function call ABI */ cmpdi cr0,r3,0 /* Windup the stack. */ cheers