diff options
author | Helge Deller <deller@gmx.de> | 2022-02-18 09:25:20 +0100 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2022-02-23 18:01:06 +0100 |
commit | dd2288f4a020d693360e3e8d72f8b9d9c25f5ef6 (patch) | |
tree | 75573c24c1acf1a9fcb8cb72d9b4e4342c4b02ce /kernel/softirq.c | |
parent | 8b97cae315cafd7debf3601f88621e2aa8956ef3 (diff) |
parisc/unaligned: Fix fldd and fstd unaligned handlers on 32-bit kernel
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: Helge Deller <deller@gmx.de>
Cc: stable@vger.kernel.org
Diffstat (limited to 'kernel/softirq.c')
0 files changed, 0 insertions, 0 deletions