Commit 37318a3c authored by Grant Grundler's avatar Grant Grundler Committed by Kyle McMartin

[PARISC] Fix copy_user_page_asm to NOT access past end of page

2.6.12-rc2-pa3 fix copy_user_page_asm to NOT access past end of page.

My bad. /o\
Lamont confirmed that instructions following a conditional
branch are *alway* executed regardless if the branch is taken or not.
Unless they are nullified (which was missing in this case).

He also noted:
Conditional branches nullify on forward taken branch, and on
non-taken backward branch. Note that .+4 is a backwards branch.

This makes alot more sense than the giberish in the PA20 arch book.

Compiles and boots on both 64-bit (a500) and 32-bit (j6k).
Signed-off-by: default avatarGrant Grundler <grundler@parisc-linux.org>
Signed-off-by: default avatarKyle McMartin <kyle@parisc-linux.org>
parent c2709020
...@@ -351,7 +351,11 @@ copy_user_page_asm: ...@@ -351,7 +351,11 @@ copy_user_page_asm:
std %r22, 120(%r26) std %r22, 120(%r26)
ldo 128(%r26), %r26 ldo 128(%r26), %r26
ADDIB> -1, %r1, 1b /* bundle 10 */ /* conditional branches nullify on forward taken branch, and on
* non-taken backward branch. Note that .+4 is a backwards branch.
* The ldd should only get executed if the branch is taken.
*/
ADDIB>,n -1, %r1, 1b /* bundle 10 */
ldd 0(%r25), %r19 /* start next loads */ ldd 0(%r25), %r19 /* start next loads */
#else #else
...@@ -363,10 +367,10 @@ copy_user_page_asm: ...@@ -363,10 +367,10 @@ copy_user_page_asm:
* the full 64 bit register values on interrupt, we can't * the full 64 bit register values on interrupt, we can't
* use ldd/std on a 32 bit kernel. * use ldd/std on a 32 bit kernel.
*/ */
ldw 0(%r25), %r19
ldi 64, %r1 /* PAGE_SIZE/64 == 64 */ ldi 64, %r1 /* PAGE_SIZE/64 == 64 */
1: 1:
ldw 0(%r25), %r19
ldw 4(%r25), %r20 ldw 4(%r25), %r20
ldw 8(%r25), %r21 ldw 8(%r25), %r21
ldw 12(%r25), %r22 ldw 12(%r25), %r22
...@@ -396,11 +400,12 @@ copy_user_page_asm: ...@@ -396,11 +400,12 @@ copy_user_page_asm:
ldw 60(%r25), %r22 ldw 60(%r25), %r22
stw %r19, 48(%r26) stw %r19, 48(%r26)
stw %r20, 52(%r26) stw %r20, 52(%r26)
ldo 64(%r25), %r25
stw %r21, 56(%r26) stw %r21, 56(%r26)
stw %r22, 60(%r26) stw %r22, 60(%r26)
ldo 64(%r26), %r26 ldo 64(%r26), %r26
ADDIB> -1, %r1, 1b ADDIB>,n -1, %r1, 1b
ldo 64(%r25), %r25 ldw 0(%r25), %r19
#endif #endif
bv %r0(%r2) bv %r0(%r2)
nop nop
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment