• Helge Deller's avatar
    parisc/unaligned: Fix fldd and fstd unaligned handlers on 32-bit kernel · dd2288f4
    Helge Deller authored
    
    
    Usually the kernel provides fixup routines to emulate the fldd and fstd
    floating-point instructions if they load or store 8-byte from/to a not
    natuarally aligned memory location.
    
    On a 32-bit kernel I noticed that those unaligned handlers didn't worked and
    instead the application got a SEGV.
    While checking the code I found two problems:
    
    First, the OPCODE_FLDD_L and OPCODE_FSTD_L cases were ifdef'ed out by the
    CONFIG_PA20 option, and as such those weren't built on a pure 32-bit kernel.
    This is now fixed by moving the CONFIG_PA20 #ifdef to prevent the compilation
    of OPCODE_LDD_L and OPCODE_FSTD_L only, and handling the fldd and fstd
    instructions.
    
    The second problem are two bugs in the 32-bit inline assembly code, where the
    wrong registers where used. The calculation of the natural alignment used %2
    (vall) instead of %3 (ior), and the first word was stored back to address %1
    (valh) instead of %3 (ior).
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    Cc: stable@vger.kernel.org
    dd2288f4
unaligned.c 16.7 KB