Aw: [RFC] MIPS: R5900: Workaround for CACHE instruction near branch delay slot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Fredrik,

> Gesendet: Sonntag, 11. Februar 2018 um 09:01 Uhr
> Von: "Fredrik Noring" <noring@xxxxxxxxxx>
> An: "Maciej W. Rozycki" <macro@xxxxxxxx>, "Jürgen Urban" <JuergenUrban@xxxxxx>
> Cc: linux-mips@xxxxxxxxxxxxxx
> Betreff: [RFC] MIPS: R5900: Workaround for CACHE instruction near branch delay slot
>
> Signed-off-by: Fredrik Noring <noring@xxxxxxxxxx>
> ---
> This change has been ported from v2.6 patches. I have not found any note
> describing this in the TX79 manual.

The 5 NOPs are because of restri_e.pdf (2) Arrangement of Program Code and Data.

> diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S
> index 4008298c1880..a0b0fbedad8c 100644
> --- a/arch/mips/kernel/genex.S
> +++ b/arch/mips/kernel/genex.S
> @@ -52,6 +52,14 @@ NESTED(except_vec3_generic, 0, sp)
>  #endif
>  	PTR_L	k0, exception_handlers(k1)
>  	jr	k0
> +#ifdef CONFIG_CPU_R5900
> +	/* There should be nothing which looks like a cache instruction. */
> +	nop
> +	nop
> +	nop
> +	nop
> +	nop
> +#endif
>  	.set	pop
>  	END(except_vec3_generic)
>  
> @@ -709,6 +717,14 @@ isrdhwr:
>  	.set	arch=r4000
>  	eret
>  	.set	mips0
> +#ifdef CONFIG_CPU_R5900
> +	/* There should be nothing which looks like cache instruction. */
> +	nop
> +	nop
> +	nop
> +	nop
> +	nop
> +#endif
>  #endif
>  	.set	pop
>  	END(handle_ri_rdhwr)
> diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
> index 761b6c369321..795c490a429f 100644
> --- a/arch/mips/kernel/traps.c
> +++ b/arch/mips/kernel/traps.c
> @@ -1950,12 +1950,36 @@ void __init *set_except_vector(int n, void *addr)
>  		u32 *buf = (u32 *)(ebase + 0x200);
>  		unsigned int k0 = 26;
>  		if ((handler & jump_mask) == ((ebase + 0x200) & jump_mask)) {
> +#ifdef CONFIG_CPU_R5900
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +#endif

The 2 nops are because of FLX05 in tx79architecture.pdf.

>  			uasm_i_j(&buf, handler & ~jump_mask);
>  			uasm_i_nop(&buf);
> +#ifdef CONFIG_CPU_R5900
> +			/* There are no data allowed which could be interpreted as cache instruction. */
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +#endif
>  		} else {
> +#ifdef CONFIG_CPU_R5900
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +#endif

Same here.

Best regards
Jürgen

>  			UASM_i_LA(&buf, k0, handler);
>  			uasm_i_jr(&buf, k0);
>  			uasm_i_nop(&buf);
> +#ifdef CONFIG_CPU_R5900
> +			/* There are no data allowed which could be interpreted as cache instruction. */
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +			uasm_i_nop(&buf);
> +#endif
>  		}
>  		local_flush_icache_range(ebase + 0x200, (unsigned long)buf);
>  	}
>


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux