From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Huth Date: Fri, 22 Apr 2016 14:12:20 +0000 Subject: Re: [kvm-unit-tests PATCH v2] powerpc: restore TOC pointer Message-Id: <571A3144.2020406@redhat.com> List-Id: References: <1461323527-20148-1-git-send-email-lvivier@redhat.com> In-Reply-To: <1461323527-20148-1-git-send-email-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Laurent Vivier , kvm@vger.kernel.org, kvm-ppc@vger.kernel.org Cc: drjones@redhat.com, dgibson@redhat.com, pbonzini@redhat.com 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 > Signed-off-by: Laurent Vivier > --- > 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 > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Huth Subject: Re: [kvm-unit-tests PATCH v2] powerpc: restore TOC pointer Date: Fri, 22 Apr 2016 16:12:20 +0200 Message-ID: <571A3144.2020406@redhat.com> References: <1461323527-20148-1-git-send-email-lvivier@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Cc: drjones@redhat.com, dgibson@redhat.com, pbonzini@redhat.com To: Laurent Vivier , kvm@vger.kernel.org, kvm-ppc@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:37290 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752244AbcDVOMY (ORCPT ); Fri, 22 Apr 2016 10:12:24 -0400 In-Reply-To: <1461323527-20148-1-git-send-email-lvivier@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 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 > Signed-off-by: Laurent Vivier > --- > 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 >