Commit 4fa81ed2 authored by Martin Schwidefsky's avatar Martin Schwidefsky

[S390] __div64_31 broken for CONFIG_MARCH_G5

The implementation of __div64_31 for G5 machines is broken. The comments
in __div64_31 are correct, only the code does not do what the comments
say. The part "If the remainder has overflown subtract base and increase
the quotient" is only partially realized, the base is subtracted correctly
but the quotient is only increased if the dividend had the last bit set.
Using the correct instruction fixes the problem.

Cc: stable@kernel.org
Reported-by: default avatarFrans Pop <elendil@planet.nl>
Tested-by: default avatarFrans Pop <elendil@planet.nl>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent ee568b25
...@@ -61,7 +61,7 @@ static uint32_t __div64_31(uint64_t *n, uint32_t base) ...@@ -61,7 +61,7 @@ static uint32_t __div64_31(uint64_t *n, uint32_t base)
" clr %0,%3\n" " clr %0,%3\n"
" jl 0f\n" " jl 0f\n"
" slr %0,%3\n" " slr %0,%3\n"
" alr %1,%2\n" " ahi %1,1\n"
"0:\n" "0:\n"
: "+d" (reg2), "+d" (reg3), "=d" (tmp) : "+d" (reg2), "+d" (reg3), "=d" (tmp)
: "d" (base), "2" (1UL) : "cc" ); : "d" (base), "2" (1UL) : "cc" );
......
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