[lkml]   [2009]   [Mar]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    SubjectRe: [BUG,2.6.28,s390] Fails to boot in Hercules S/390 emulator - hang traced
    On Tue, 17 Mar 2009 19:54:57 -0700
    john stultz <> wrote:

    > Martin: I'm not sure if the problem here is the __div64_32
    > implementation or if the emulator is doing something wrong here. Might
    > need some help from you in sorting this out.

    __div64_31 is incorrect. Patch and description see below.

    How long did you debug this until you finally got down to div64 as the
    cause of this? It must have taken you hours!

    blue skies,

    "Reality continues to ruin my life." - Calvin.

    Subject: [PATCH] __div64_31 broken for CONFIG_MARCH_G5

    From: Martin Schwidefsky <>

    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.

    Signed-off-by: Martin Schwidefsky <>

    diff -urpN linux-2.6/arch/s390/lib/div64.c linux-2.6-patched/arch/s390/lib/div64.c
    --- linux-2.6/arch/s390/lib/div64.c 2008-12-25 00:26:37.000000000 +0100
    +++ linux-2.6-patched/arch/s390/lib/div64.c 2009-03-18 10:06:42.000000000 +0100
    @@ -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"
    : "+d" (reg2), "+d" (reg3), "=d" (tmp)
    : "d" (base), "2" (1UL) : "cc" );

     \ /
      Last update: 2009-03-18 10:37    [W:0.023 / U:2.496 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site