diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2023-10-22 19:34:28 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2023-11-02 09:35:32 +0100 |
commit | 65e5a9890e03cfe9379275d1aa561643cbd62629 (patch) | |
tree | f7b3bd948201fd9257936a818c9cc517fbbb4731 | |
parent | 8b8cde8ebb872a6b62aee81869ad235a5eb251d9 (diff) | |
download | linux-stable-65e5a9890e03cfe9379275d1aa561643cbd62629.tar.gz linux-stable-65e5a9890e03cfe9379275d1aa561643cbd62629.tar.bz2 linux-stable-65e5a9890e03cfe9379275d1aa561643cbd62629.zip |
sparc32: fix a braino in fault handling in csum_and_copy_..._user()
commit 1f36cd05e0081f2c75769a551d584c4ffb2a5660 upstream.
Fault handler used to make non-trivial calls, so it needed
to set a stack frame up. Used to be
save ... - grab a stack frame, old %o... become %i...
....
ret - go back to address originally in %o7, currently %i7
restore - switch to previous stack frame, in delay slot
Non-trivial calls had been gone since ab5e8b331244 and that code should
have become
retl - go back to address in %o7
clr %o0 - have return value set to 0
What it had become instead was
ret - go back to address in %i7 - return address of *caller*
clr %o0 - have return value set to 0
which is not good, to put it mildly - we forcibly return 0 from
csum_and_copy_{from,to}_iter() (which is what the call of that
thing had been inlined into) and do that without dropping the
stack frame of said csum_and_copy_..._iter(). Confuses the
hell out of the caller of csum_and_copy_..._iter(), obviously...
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Fixes: ab5e8b331244 "sparc32: propagate the calling conventions change down to __csum_partial_copy_sparc_generic()"
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | arch/sparc/lib/checksum_32.S | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/sparc/lib/checksum_32.S b/arch/sparc/lib/checksum_32.S index 781e39b3c009..481e94e1f685 100644 --- a/arch/sparc/lib/checksum_32.S +++ b/arch/sparc/lib/checksum_32.S @@ -453,5 +453,5 @@ ccslow: cmp %g1, 0 * we only bother with faults on loads... */ cc_fault: - ret + retl clr %o0 |