LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] powerpc: handle unaligned ldbrx/stdbrx
@ 2013-07-31  5:05 Anton Blanchard
  2013-07-31  8:19 ` Stephen Rothwell
  0 siblings, 1 reply; 2+ messages in thread
From: Anton Blanchard @ 2013-07-31  5:05 UTC (permalink / raw)
  To: benh, paulus, mikey; +Cc: linuxppc-dev


Normally when we haven't implemented an alignment handler for
a load or store instruction the process will be terminated.

The alignment handler uses the DSISR (or a pseudo one) to locate
the right handler. Unfortunately ldbrx and stdbrx overlap lfs and
stfs so we incorrectly think ldbrx is an lfs and stdbrx is an
stfs.

This bug is particularly nasty - instead of terminating the
process we apply an incorrect fixup and continue on.

With more and more overlapping instructions we should stop
creating a pseudo DSISR and index using the instruction directly,
but for now add a special case to catch ldbrx/stdbrx.

Signed-off-by: Anton Blanchard <anton@samba.org>
Cc: <stable@kernel.org>
---

Index: b/arch/powerpc/kernel/align.c
===================================================================
--- a/arch/powerpc/kernel/align.c
+++ b/arch/powerpc/kernel/align.c
@@ -764,6 +764,16 @@ int fix_alignment(struct pt_regs *regs)
 	nb = aligninfo[instr].len;
 	flags = aligninfo[instr].flags;
 
+	/* ldbrx/stdbrx overlap lfs/stfs in the DSISR unfortunately */
+	if (IS_XFORM(instruction) && ((instruction >> 1) & 0x3ff) == 532) {
+		nb = 8;
+		flags = LD+SW;
+	} else if (IS_XFORM(instruction) &&
+		   ((instruction >> 1) & 0x3ff) == 660) {
+		nb = 8;
+		flags = ST+SW;
+	}
+
 	/* Byteswap little endian loads and stores */
 	swiz = 0;
 	if (regs->msr & MSR_LE) {

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] powerpc: handle unaligned ldbrx/stdbrx
  2013-07-31  5:05 [PATCH] powerpc: handle unaligned ldbrx/stdbrx Anton Blanchard
@ 2013-07-31  8:19 ` Stephen Rothwell
  0 siblings, 0 replies; 2+ messages in thread
From: Stephen Rothwell @ 2013-07-31  8:19 UTC (permalink / raw)
  To: Anton Blanchard; +Cc: mikey, paulus, linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 747 bytes --]

Hi Anton,

On Wed, 31 Jul 2013 15:05:21 +1000 Anton Blanchard <anton@samba.org> wrote:
>
> +++ b/arch/powerpc/kernel/align.c
> @@ -764,6 +764,16 @@ int fix_alignment(struct pt_regs *regs)
>  	nb = aligninfo[instr].len;
>  	flags = aligninfo[instr].flags;
>  
> +	/* ldbrx/stdbrx overlap lfs/stfs in the DSISR unfortunately */
> +	if (IS_XFORM(instruction) && ((instruction >> 1) & 0x3ff) == 532) {

We have get_xop() in asm/disassemble.h (which is unfortunately not
included by this file) ...

> +		nb = 8;
> +		flags = LD+SW;
> +	} else if (IS_XFORM(instruction) &&
> +		   ((instruction >> 1) & 0x3ff) == 660) {

ditto

/me points at a bike shed :-)
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-07-31  8:19 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-31  5:05 [PATCH] powerpc: handle unaligned ldbrx/stdbrx Anton Blanchard
2013-07-31  8:19 ` Stephen Rothwell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox