• Xiangyu Lu's avatar
    ARM: 8027/1: fix do_div() bug in big-endian systems · 80bb3ef1
    Xiangyu Lu authored
    In big-endian systems, "%1" get the most significant part of the value, cause the instruction to get the wrong result.
    
    When viewing ftrace record in big-endian ARM systems, we found that
    the timestamp errors:
    
    swapper-0   [001] 1325.970000:   0:120:R ==> [001]    16:120:R events/1
    events/1-16 [001] 1325.970000:   16:120:S ==> [001]    0:120:R swapper
    swapper-0   [000] 1325.1000000:  0:120:R   + [000]    15:120:R events/0
    swapper-0   [000] 1325.1000000:  0:120:R ==> [000]    15:120:R events/0
    swapper-0   [000] 1326.030000:   0:120:R   + [000]  1150:120:R sshd
    swapper-0   [000] 1326.030000:   0:120:R ==> [000]  1150:120:R sshd
    
    When viewed ftrace records, it will call the do_div(n, base) function, which achieved arch/arm/include/asm/div64.h in. When n = 10000000, base = 1000000, in do_div(n, base) will execute "umull %Q0, %R0, %1, %Q2".
    Reviewed-by: default avatarDave Martin <Dave.Martin@arm.com>
    Reviewed-by: default avatarNicolas Pitre <nico@linaro.org>
    Cc: <stable@vger.kernel.org> # 2.6.20+
    Signed-off-by: default avatarAlex Wu <wuquanming@huawei.com>
    Signed-off-by: default avatarXiangyu Lu <luxiangyu@huawei.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    80bb3ef1
div64.h 7.57 KB