[OpenBIOS] [PATCH] ppc: fix mtmsr for SF setting
Andreas Färber
andreas.faerber at web.de
Fri Jun 17 21:43:33 CEST 2011
Am 17.06.2011 um 00:14 schrieb Alexander Graf:
> When running openbios-ppc32 on a ppc64 VM, we need to unset SF on
> every
> interrupt to ensure that things still work.
>
> So far we've been using mtmsr for this operation, but according to the
> spec mtmsr doesn't set any bit above 32bit, so we were merely
> exploiting
> a bug in qemu before.
>
> This patch adds a runtime check on PVR to see if we're running on a
> 64-bit
> capable CPU. If so, we use mtmsrd, which can set the high 32bits of
> MSR.
>
> CC: Andreas Färber <andreas.faerber at web.de>
> Signed-off-by: Alexander Graf <agraf at suse.de>
> ---
> arch/ppc/qemu/start.S | 50 ++++++++++++++++++++++++++++++++++++++++
> +-------
> 1 files changed, 42 insertions(+), 8 deletions(-)
I don't spot the difference? Was this a resend by mistake?
You seem to have committed a different version incorporating Segher's
suggestion without posting it first and waiting for Acks.
Andreas
> diff --git a/arch/ppc/qemu/start.S b/arch/ppc/qemu/start.S
> index 0d64568..70a4f92 100644
> --- a/arch/ppc/qemu/start.S
> +++ b/arch/ppc/qemu/start.S
> @@ -37,9 +37,21 @@
>
> #define EXCEPTION_PREAMBLE_TEMPLATE \
> mtsprg1 r1 ; /* scratch */ \
> + mfcr r1 ; \
> + mtsprg2 r1 ; /* scratch */ \
> + mtsprg3 r2 ; /* scratch */ \
> + mfpvr r1 ; \
> + lis r2, 0x330000 at h ; /* lowest 64-bit PVR */ \
> + cmplw r1, r2 ; \
> + blt 1f; \
> + oris r2, r2, 0x70000000 at h ; /* highest 64-bit PVR */ \
> + cmplw r1, r2 ; \
> + bge 1f; \
> + \
> mfmsr r1 ; /* unset MSR_SF */ \
> clrlwi r1,r1,0 ; \
> - mtmsr r1 ; \
> + mtmsrd r1 ; \
> +1: \
> mfsprg0 r1 ; /* exception stack in sprg0 */ \
> .ifc ULONG_SIZE, 8 ; \
> addi r1,r1,-(40 * ULONG_SIZE) ; /* push exception frame */ \
> @@ -50,6 +62,7 @@
> stl r0,(0 * ULONG_SIZE)(r1) ; /* save r0 */ \
> mfsprg1 r0 ; \
> stl r0,(1 * ULONG_SIZE)(r1) ; /* save r1 */ \
> + mfsprg3 r2 ; \
> stl r2,(2 * ULONG_SIZE)(r1) ; /* save r2 */ \
> stl r3,(3 * ULONG_SIZE)(r1) ; /* save r3 */ \
> stl r4,(4 * ULONG_SIZE)(r1) ; \
> @@ -85,7 +98,7 @@
> \
> mflr r0 ; \
> stl r0,(13 * ULONG_SIZE)(r1) ; \
> - mfcr r0 ; \
> + mfsprg2 r0 ; \
> stl r0,(14 * ULONG_SIZE)(r1) ; \
> mfctr r0 ; \
> stl r0,(15 * ULONG_SIZE)(r1) ; \
> @@ -301,14 +314,12 @@ VECTOR( 0x100, "SRE" ):
> ILLEGAL_VECTOR( 0x200 )
>
> VECTOR( 0x300, "DSI" ):
> - EXCEPTION_PREAMBLE
> - b call_dsi_exception
> + b real_dsi
>
> ILLEGAL_VECTOR( 0x380 )
>
> VECTOR( 0x400, "ISI" ):
> - EXCEPTION_PREAMBLE
> - b call_isi_exception
> + b real_isi
>
> ILLEGAL_VECTOR( 0x480 )
>
> @@ -359,6 +370,14 @@ VECTOR( 0x2200, "ISI_64" ):
>
> #endif
>
> +real_dsi:
> + EXCEPTION_PREAMBLE
> + b call_dsi_exception
> +
> +real_isi:
> + EXCEPTION_PREAMBLE
> + b call_isi_exception
> +
> GLOBL(__vectors_end):
>
> /
> ************************************************************************/
> @@ -368,10 +387,25 @@ GLOBL(__vectors_end):
> GLOBL(_entry):
>
> #ifdef CONFIG_PPC_64BITSUPPORT
> - /* clear MSR, disable MMU */
> -
> li r0,0
> +
> + mfpvr r3
> + lis r4, 0x330000 at h /* lowest 64-bit PVR */
> + cmplw r3, r4
> + blt no_64bit
> + oris r4, r4, 0x70000000 at h /* highest 64-bit PVR */
> + cmplw r3, r4
> + bge no_64bit
> +
> + /* clear MSR, disable MMU, SF */
> + mtmsrd r0
> + b real_entry
> +
> +no_64bit:
> + /* clear MSR, disable MMU */
> mtmsr r0
> +
> +real_entry:
> #endif
>
> /* copy exception vectors */
> --
> 1.6.0.2
>
>
> --
> OpenBIOS http://openbios.org/
> Mailinglist: http://lists.openbios.org/mailman/listinfo
> Free your System - May the Forth be with you
More information about the OpenBIOS
mailing list