[OpenBIOS] [PATCH] ppc: use rfid when running under a CPU from the 970 family.

Alexander Graf agraf at suse.de
Mon Jun 20 09:39:16 CEST 2016



On 20.06.16 09:34, Cédric Le Goater wrote:
> A recent attempt to restrict the use of rfi to 64bit cpus in qemu
> broke 32bit OpenBIOS when run under a 970.
> 
> This is adding a dynamic check on the pvr to choose between rfi and
> rfid. Only the 970 family is supported.
> 
> Signed-off-by: Cédric Le Goater <clg at kaod.org>
> ---
> 
>  Tested on qemu.
> 
>  arch/ppc/qemu/start.S |   25 +++++++++++++++++++++++--
>  arch/ppc/start.S      |   25 +++++++++++++++++++++++--
>  2 files changed, 46 insertions(+), 4 deletions(-)
> 
> Index: openbios.git/arch/ppc/qemu/start.S
> ===================================================================
> --- openbios.git.orig/arch/ppc/qemu/start.S
> +++ openbios.git/arch/ppc/qemu/start.S
> @@ -27,6 +27,27 @@
>  
>  #ifdef CONFIG_PPC_64BITSUPPORT
>  
> +/* When running on ppc64, we cannot use rfi anymore. Let's try to
> + * catch which cpu we are running on and act accordingly. This is
> + * for 970s only.

Do you think you could move the check into the cpu init function and use
a global variable / live patching instead? I don't remember if we need
to handle any faults before we reach that path.


Alex

> + */
> +.macro do_rfi
> +	mtsprg1	r3
> +	mfpvr r3
> +	rlwinm	r3,r3,16,16,31
> +	cmplwi	cr1,r3,0x0039 	/* 970 CPUs */
> +	beq- cr1,0f
> +	cmplwi	cr1,r3,0x003C 	/* 970fx CPUs */
> +	beq- cr1,0f
> +	cmplwi	cr1,r3,0x0044 	/* 970mp CPUs */
> +	beq- cr1,0f
> +	mfsprg1	r3
> +	rfi
> +0:
> +	mfsprg1	r3
> +	rfid
> +.endm
> +
>  /* We're trying to use the same code for the ppc32 and ppc64 handlers here.
>   * On ppc32 we only save/restore the registers, C considers volatile.
>   *
> @@ -148,7 +169,7 @@
>  	ll	r31,(35 * ULONG_SIZE)(r1) ; \
>  .endif ; \
>  	ll	r1,(1 * ULONG_SIZE)(r1) ;	/* restore stack at last */ \
> -	rfi
> +	do_rfi
>  
>  // PPC32
>  
> @@ -319,7 +340,7 @@ VECTOR( 0x800, "FPU" ):
>  	ori	r3,r3,0x2000
>  	mtsrr1	r3
>  	mfsprg1	r3
> -	RFI
> +	do_rfi
>  
>  ILLEGAL_VECTOR( 0x900 )
>  ILLEGAL_VECTOR( 0xa00 )
> Index: openbios.git/arch/ppc/start.S
> ===================================================================
> --- openbios.git.orig/arch/ppc/start.S
> +++ openbios.git/arch/ppc/start.S
> @@ -25,6 +25,27 @@
>  #define ILLEGAL_VECTOR( v )	.org __vectors + v ; bl trap_error ;
>  #define VECTOR( v, dummystr )	.org __vectors + v ; vector__##v
>  
> +/* When running on ppc64, we cannot use rfi anymore. Let's try to
> + * catch which cpu we are running on and act accordingly. This is
> + * for 970s only.
> + */
> +.macro do_rfi
> +	mtsprg1	r3
> +	mfpvr r3
> +	rlwinm	r3,r3,16,16,31
> +	cmplwi	cr1,r3,0x0039 	/* 970 CPUs */
> +	beq- cr1,0f
> +	cmplwi	cr1,r3,0x003C 	/* 970fx CPUs */
> +	beq- cr1,0f
> +	cmplwi	cr1,r3,0x0044 	/* 970mp CPUs */
> +	beq- cr1,0f
> +	mfsprg1	r3
> +	rfi
> +0:
> +	mfsprg1	r3
> +	rfid
> +.endm
> +
>  #define EXCEPTION_PREAMBLE \
>  	mtsprg1	r1 ;		/* scratch */ \
>  	mfsprg0	r1 ;		/* exception stack in sprg0 */ \
> @@ -252,7 +273,7 @@ exception_return:
>  	lwz	r11,44(r1)
>  	lwz	r12,48(r1)
>  	lwz	r1,4(r1)	// restore r1
> -	rfi
> +	do_rfi
>  
>  trap_error:
>  	mflr	r3
> @@ -287,7 +308,7 @@ VECTOR( 0x800, "FPU" ):
>  	ori	r3,r3,0x2000
>  	mtsrr1	r3
>  	mfsprg1	r3
> -	rfi
> +	do_rfi
>  
>  ILLEGAL_VECTOR( 0x900 )
>  ILLEGAL_VECTOR( 0xa00 )
> 



More information about the OpenBIOS mailing list