• Chris Packham's avatar
    MIPS: Use unsigned int when reading CP0 registers · 82eb8f73
    Chris Packham authored
    Update __read_32bit_c0_register() and __read_32bit_c0_ctrl_register() to
    use "unsigned int res;" instead of "int res;". There is little reason to
    treat these register values as signed. They are either counters (which
    by definition are unsigned) or are made up of various bit fields to be
    interpreted as per the CPU datasheet.
    
    This has come up via u-boot[1] which sync's asm/mipsregs.h with the
    kernel. In u-boots case the value read from read_c0_count() is assigned
    to an unsigned long [2] which triggers a sign extension and causes a
    bug.
    
    U-boot should probably be more explicit about the types used for the
    timer_read_counter() API but that aside is there any reason to treat
    these values as signed integers? A quick grep around the arch/mips makes
    me thing that there may be some bugs lurking when read_c0_count() starts
    to yield a negative value but I haven't really explored any of them.
    
    [1] - http://lists.denx.de/pipermail/u-boot/2015-July/219086.html
    [2] - http://git.denx.de/?p=u-boot.git;a=blob;f=arch/mips/cpu/time.c#l11Signed-off-by: default avatarChris Packham <judge.packham@gmail.com>
    Cc: linux-mips@linux-mips.org
    Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
    Cc: Chris Packham <judge.packham@gmail.com>
    Cc: Steven J. Hill <Steven.Hill@imgtec.com>
    Cc: Maciej W. Rozycki <macro@linux-mips.org>
    Cc: linux-kernel@vger.kernel.org
    Cc: James Hogan <james.hogan@imgtec.com>
    Cc: Markos Chandras <markos.chandras@imgtec.com>
    Cc: Paul Burton <paul.burton@imgtec.com>
    Patchwork: https://patchwork.linux-mips.org/patch/10718/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    82eb8f73
mipsregs.h 59.6 KB