[PATCH] [RFC] Emulate "lwsync" to run standard user land on e500 cores

Kumar Gala galak at kernel.crashing.org
Wed Oct 23 16:07:48 EST 2013


On Oct 18, 2013, at 2:38 AM, Wolfgang Denk wrote:

> Default Debian PowerPC doesn't work on e500 because the code contains
> "lwsync" instructions, which are unsupported on this core.  As a
> result, applications using this will crash with an "unhandled signal 4"
> "Illegal instruction" error.
> 
> As a work around we add code to emulate this insn.  This is expensive
> performance-wise, but allows to run standard user land code.
> 
> Signed-off-by: Wolfgang Denk <wd at denx.de>
> Cc: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> Cc: Scott Wood <scottwood at freescale.com>
> ---
> I am aware that the clean solution to the problem is to build user
> space with compiler options that match the target architecture.
> However, sometimes this is just too much effort.
> 
> Also, of course the performance of such an emulation sucks. But the
> the occurrence of such instructions is so rare that no significant
> slowdown can be oserved.
> 
> I'm not sure if this should / could go into mainline.  I'm posting it
> primarily so it can be found should anybody else need this.
> - wd
> 
> arch/powerpc/kernel/traps.c | 7 +++++++
> 1 file changed, 7 insertions(+)
> 
> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
> index f783c93..f330374 100644
> --- a/arch/powerpc/kernel/traps.c
> +++ b/arch/powerpc/kernel/traps.c
> @@ -986,6 +986,13 @@ static int emulate_instruction(struct pt_regs *regs)
> 		return 0;
> 	}
> 
> +	/* Emulating the lwsync insn as a sync insn */
> +	if (instword == PPC_INST_LWSYNC) {
> +		PPC_WARN_EMULATED(lwsync, regs);
> +		asm volatile("sync" : : : "memory");

Do we really need the inline asm?  Doesn't the fact of just taking an exception and returning from it equate to a sync.

> +		return 0;
> +	}
> +
> 	/* Emulate the mcrxr insn.  */
> 	if ((instword & PPC_INST_MCRXR_MASK) == PPC_INST_MCRXR) {
> 		int shift = (instword >> 21) & 0x1c;
> -- 
> 1.8.3.1
> 
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev



More information about the Linuxppc-dev mailing list