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

Cédric Le Goater clg at kaod.org
Mon Jun 20 09:41:39 CEST 2016


On 06/20/2016 09:39 AM, Alexander Graf wrote:
> 
> 
> 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.

I will try that. It would look better anyhow.

Thanks,

C.

> 
> 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