| From 4fa81ed27781a12f6303b9263056635ae74e3e21 Mon Sep 17 00:00:00 2001 |
| From: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Date: Wed, 18 Mar 2009 13:27:32 +0100 |
| Subject: S390: __div64_31 broken for CONFIG_MARCH_G5 |
| |
| From: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| |
| commit 4fa81ed27781a12f6303b9263056635ae74e3e21 upstream. |
| |
| 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. |
| |
| Reported-by: Frans Pop <elendil@planet.nl> |
| Tested-by: Frans Pop <elendil@planet.nl> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/s390/lib/div64.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/s390/lib/div64.c |
| +++ b/arch/s390/lib/div64.c |
| @@ -61,7 +61,7 @@ static uint32_t __div64_31(uint64_t *n, |
| " clr %0,%3\n" |
| " jl 0f\n" |
| " slr %0,%3\n" |
| - " alr %1,%2\n" |
| + " ahi %1,1\n" |
| "0:\n" |
| : "+d" (reg2), "+d" (reg3), "=d" (tmp) |
| : "d" (base), "2" (1UL) : "cc" ); |