On 22.04.2016 13:12, Laurent Vivier wrote: > As the TOC pointer can be corrupted by the main program, > we must restore it in the exception handler. > > As we know where we are loaded, we can now compute it easily. > > To compute it only in the common part of the exception handler > (call_handler), store the address of call_handler at an absolute > address in memory to be able to call the handler from the exception > table (as SLOF does). > > Reported-by: Thomas Huth <thuth@xxxxxxxxxx> > Signed-off-by: Laurent Vivier <lvivier@xxxxxxxxxx> > --- > v2: don't add SPAPR_KERNEL_LOAD_ADDR to r2 as > the TOC has been relocated and have directly the good > value. The problem has been reported by Thomas. This seems to fix the issue with the emulator invalid-instruction test. Thanks! Thomas > powerpc/cstart64.S | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/powerpc/cstart64.S b/powerpc/cstart64.S > index c47b67d..2d66032 100644 > --- a/powerpc/cstart64.S > +++ b/powerpc/cstart64.S > @@ -13,6 +13,8 @@ > > #include "spapr.h" > > +#define P_HANDLER 0x2ff8 > + > .section .init > > /* > @@ -46,6 +48,11 @@ start: > add r4, r4, r31 > bl relocate > > + /* compute address of call_handler */ > + > + LOAD_REG_ADDR(r4, call_handler) > + std r4, P_HANDLER(0) > + > /* relocate vector table to base address 0x0 (MSR_IP = 0) */ > > /* source: r4, dest end: r5, destination: r6 */ > @@ -166,6 +173,11 @@ call_handler: > mfsrr1 r0 > std r0, _MSR(r1) > > + /* restore TOC pointer */ > + > + LOAD_REG_IMMEDIATE(r31, SPAPR_KERNEL_LOAD_ADDR) > + ld r2, (p_toc - start)(r31) > + > /* FIXME: build stack frame */ > > /* call generic handler */ > @@ -221,7 +233,7 @@ call_handler: > mfctr r0 > std r0,_CTR(r1) > > - LOAD_REG_ADDR(r0, call_handler) > + ld r0, P_HANDLER(0) > mtctr r0 > > li r0,\vec > @@ -245,3 +257,5 @@ VECTOR(0x900) > .align 7 > .globl __end_interrupts > __end_interrupts: > + .org P_HANDLER > + .llong 0 > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html