All of lore.kernel.org
 help / color / mirror / Atom feed
From: Helge Deller <deller@gmx.de>
To: Mikulas Patocka <mpatocka@redhat.com>
Cc: Al Viro <viro@ZenIV.linux.org.uk>,
	John David Anglin <dave.anglin@bell.net>,
	linux-parisc@vger.kernel.org
Subject: Re: [PATCH] parisc: fix bugs in pa_memcpy
Date: Sat, 15 Apr 2017 17:26:04 +0200	[thread overview]
Message-ID: <4eaf9f82-439d-039a-0951-362b9cfea577@gmx.de> (raw)
In-Reply-To: <alpine.LRH.2.02.1704141404470.3534@file01.intranet.prod.int.rdu2.redhat.com>

On 14.04.2017 20:15, Mikulas Patocka wrote:
> The patch 554bfeceb8a22d448cd986fc9efce25e833278a1 ("parisc: Fix access
> fault handling in pa_memcpy()") reimplements the pa_memcpy function.
> Unfortunatelly, it makes the kernel unbootable. The crash happens in the
> function ide_complete_cmd where memcpy is called with the same source and
> destination address.
> 
> This patch fixes a few bugs in pa_memcpy:
> 
> * When jumping to .Lcopy_loop_16 for the first time, don't skip the
>   instruction "ldi 31,t0" (this bug made the kernel unbootable)
> * Use the COND macro when comparing length, so that the comparison is
>   64-bit (a theoretical issue, in case the length is greater than
>   0xffffffff)
> * Don't use the COND macro after the "extru" instruction (the PA-RISC
>   specification says that the upper 32-bits of extru result are undefined,
>   although they are set to zero in practice)
> * Fix exception addresses in .Lcopy16_fault and .Lcopy8_fault
> * Rename .Lcopy_loop_4 to .Lcopy_loop_8 (so that it is consistent with
>   .Lcopy8_fault)
> 
> Cc: <stable@vger.kernel.org> # v4.9+
> Fixes: 554bfeceb8a2 ("parisc: Fix access fault handling in pa_memcpy()")
> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

Nice catch!
Thanks,
Helge



> 
> ---
>  arch/parisc/lib/lusercopy.S |   27 ++++++++++++++-------------
>  1 file changed, 14 insertions(+), 13 deletions(-)
> 
> Index: linux-4.11-rc6/arch/parisc/lib/lusercopy.S
> ===================================================================
> --- linux-4.11-rc6.orig/arch/parisc/lib/lusercopy.S
> +++ linux-4.11-rc6/arch/parisc/lib/lusercopy.S
> @@ -201,7 +201,7 @@ ENTRY_CFI(pa_memcpy)
>  	add	dst,len,end
>  
>  	/* short copy with less than 16 bytes? */
> -	cmpib,>>=,n 15,len,.Lbyte_loop
> +	cmpib,COND(>>=),n 15,len,.Lbyte_loop
>  
>  	/* same alignment? */
>  	xor	src,dst,t0
> @@ -216,7 +216,7 @@ ENTRY_CFI(pa_memcpy)
>  	/* loop until we are 64-bit aligned */
>  .Lalign_loop64:
>  	extru	dst,31,3,t1
> -	cmpib,=,n	0,t1,.Lcopy_loop_16
> +	cmpib,=,n	0,t1,.Lcopy_loop_16_start
>  20:	ldb,ma	1(srcspc,src),t1
>  21:	stb,ma	t1,1(dstspc,dst)
>  	b	.Lalign_loop64
> @@ -225,6 +225,7 @@ ENTRY_CFI(pa_memcpy)
>  	ASM_EXCEPTIONTABLE_ENTRY(20b,.Lcopy_done)
>  	ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
>  
> +.Lcopy_loop_16_start:
>  	ldi	31,t0
>  .Lcopy_loop_16:
>  	cmpb,COND(>>=),n t0,len,.Lword_loop
> @@ -267,7 +268,7 @@ ENTRY_CFI(pa_memcpy)
>  	/* loop until we are 32-bit aligned */
>  .Lalign_loop32:
>  	extru	dst,31,2,t1
> -	cmpib,=,n	0,t1,.Lcopy_loop_4
> +	cmpib,=,n	0,t1,.Lcopy_loop_8
>  20:	ldb,ma	1(srcspc,src),t1
>  21:	stb,ma	t1,1(dstspc,dst)
>  	b	.Lalign_loop32
> @@ -277,7 +278,7 @@ ENTRY_CFI(pa_memcpy)
>  	ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
>  
>  
> -.Lcopy_loop_4:
> +.Lcopy_loop_8:
>  	cmpib,COND(>>=),n 15,len,.Lbyte_loop
>  
>  10:	ldw	0(srcspc,src),t1
> @@ -299,7 +300,7 @@ ENTRY_CFI(pa_memcpy)
>  	ASM_EXCEPTIONTABLE_ENTRY(16b,.Lcopy_done)
>  	ASM_EXCEPTIONTABLE_ENTRY(17b,.Lcopy_done)
>  
> -	b	.Lcopy_loop_4
> +	b	.Lcopy_loop_8
>  	ldo	-16(len),len
>  
>  .Lbyte_loop:
> @@ -324,7 +325,7 @@ ENTRY_CFI(pa_memcpy)
>  .Lunaligned_copy:
>  	/* align until dst is 32bit-word-aligned */
>  	extru	dst,31,2,t1
> -	cmpib,COND(=),n	0,t1,.Lcopy_dstaligned
> +	cmpib,=,n	0,t1,.Lcopy_dstaligned
>  20:	ldb	0(srcspc,src),t1
>  	ldo	1(src),src
>  21:	stb,ma	t1,1(dstspc,dst)
> @@ -362,7 +363,7 @@ ENTRY_CFI(pa_memcpy)
>  	cmpiclr,<> 1,t0,%r0
>  	b,n .Lcase1
>  .Lcase0:
> -	cmpb,= %r0,len,.Lcda_finish
> +	cmpb,COND(=) %r0,len,.Lcda_finish
>  	nop
>  
>  1:	ldw,ma 4(srcspc,src), a3
> @@ -376,7 +377,7 @@ ENTRY_CFI(pa_memcpy)
>  1:	ldw,ma 4(srcspc,src), a3
>  	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
>  	ldo -1(len),len
> -	cmpb,=,n %r0,len,.Ldo0
> +	cmpb,COND(=),n %r0,len,.Ldo0
>  .Ldo4:
>  1:	ldw,ma 4(srcspc,src), a0
>  	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
> @@ -402,7 +403,7 @@ ENTRY_CFI(pa_memcpy)
>  1:	stw,ma t0, 4(dstspc,dst)
>  	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcopy_done)
>  	ldo -4(len),len
> -	cmpb,<> %r0,len,.Ldo4
> +	cmpb,COND(<>) %r0,len,.Ldo4
>  	nop
>  .Ldo0:
>  	shrpw a2, a3, %sar, t0
> @@ -436,14 +437,14 @@ ENTRY_CFI(pa_memcpy)
>  	/* fault exception fixup handlers: */
>  #ifdef CONFIG_64BIT
>  .Lcopy16_fault:
> -10:	b	.Lcopy_done
> -	std,ma	t1,8(dstspc,dst)
> +	b	.Lcopy_done
> +10:	std,ma	t1,8(dstspc,dst)
>  	ASM_EXCEPTIONTABLE_ENTRY(10b,.Lcopy_done)
>  #endif
>  
>  .Lcopy8_fault:
> -10:	b	.Lcopy_done
> -	stw,ma	t1,4(dstspc,dst)
> +	b	.Lcopy_done
> +10:	stw,ma	t1,4(dstspc,dst)
>  	ASM_EXCEPTIONTABLE_ENTRY(10b,.Lcopy_done)
>  
>  	.exit
> 


      reply	other threads:[~2017-04-15 15:26 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-14 18:15 [PATCH] parisc: fix bugs in pa_memcpy Mikulas Patocka
2017-04-15 15:26 ` Helge Deller [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4eaf9f82-439d-039a-0951-362b9cfea577@gmx.de \
    --to=deller@gmx.de \
    --cc=dave.anglin@bell.net \
    --cc=linux-parisc@vger.kernel.org \
    --cc=mpatocka@redhat.com \
    --cc=viro@ZenIV.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.