diff options
| author | Paul Mackerras <paulus@samba.org> | 2005-05-20 02:50:55 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-20 10:54:10 -0400 |
| commit | 72480ef863740c3dc301b0803c9ed6d10716aa11 (patch) | |
| tree | 958a49f87b40c6a208d95f85e5e93f2f39b77d3d | |
| parent | 3207a80a6e11c7ceff7e46d5ec6bfcc03c14e729 (diff) | |
[PATCH] ppc32: Fix __copy_tofrom_user return value
Recently the __copy_tofrom_user routine was modified to avoid doing
prefetches past the end of the source array. However, in doing so we
introduced a bug in that it now returns the wrong value for the number
of bytes not copied when a fault is encountered. This fixes it to
return the correct number.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | arch/ppc/lib/string.S | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/ppc/lib/string.S b/arch/ppc/lib/string.S index 8d08a2eb225e..36c9b97fd92a 100644 --- a/arch/ppc/lib/string.S +++ b/arch/ppc/lib/string.S | |||
| @@ -446,6 +446,7 @@ _GLOBAL(__copy_tofrom_user) | |||
| 446 | #ifdef CONFIG_8xx | 446 | #ifdef CONFIG_8xx |
| 447 | /* Don't use prefetch on 8xx */ | 447 | /* Don't use prefetch on 8xx */ |
| 448 | mtctr r0 | 448 | mtctr r0 |
| 449 | li r0,0 | ||
| 449 | 53: COPY_16_BYTES_WITHEX(0) | 450 | 53: COPY_16_BYTES_WITHEX(0) |
| 450 | bdnz 53b | 451 | bdnz 53b |
| 451 | 452 | ||
| @@ -564,7 +565,9 @@ _GLOBAL(__copy_tofrom_user) | |||
| 564 | /* or write fault in cacheline loop */ | 565 | /* or write fault in cacheline loop */ |
| 565 | 105: li r9,1 | 566 | 105: li r9,1 |
| 566 | 92: li r3,LG_CACHELINE_BYTES | 567 | 92: li r3,LG_CACHELINE_BYTES |
| 567 | b 99f | 568 | mfctr r8 |
| 569 | add r0,r0,r8 | ||
| 570 | b 106f | ||
| 568 | /* read fault in final word loop */ | 571 | /* read fault in final word loop */ |
| 569 | 108: li r9,0 | 572 | 108: li r9,0 |
| 570 | b 93f | 573 | b 93f |
| @@ -585,7 +588,7 @@ _GLOBAL(__copy_tofrom_user) | |||
| 585 | * r5 + (ctr << r3), and r9 is 0 for read or 1 for write. | 588 | * r5 + (ctr << r3), and r9 is 0 for read or 1 for write. |
| 586 | */ | 589 | */ |
| 587 | 99: mfctr r0 | 590 | 99: mfctr r0 |
| 588 | slw r3,r0,r3 | 591 | 106: slw r3,r0,r3 |
| 589 | add. r3,r3,r5 | 592 | add. r3,r3,r5 |
| 590 | beq 120f /* shouldn't happen */ | 593 | beq 120f /* shouldn't happen */ |
| 591 | cmpwi 0,r9,0 | 594 | cmpwi 0,r9,0 |
