mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 08:34:20 +08:00
parisc: Fix exception handler for fldw and fstw instructions
The exception handler is broken for unaligned memory acceses with fldw and fstw instructions, because it trashes or uses randomly some other floating point register than the one specified in the instruction word on loads and stores. The instruction "fldw 0(addr),%fr22L" (and the other fldw/fstw instructions) encode the target register (%fr22) in the rightmost 5 bits of the instruction word. The 7th rightmost bit of the instruction word defines if the left or right half of %fr22 should be used. While processing unaligned address accesses, the FR3() define is used to extract the offset into the local floating-point register set. But the calculation in FR3() was buggy, so that for example instead of %fr22, register %fr12 [((22 * 2) & 0x1f) = 12] was used. This bug has been since forever in the parisc kernel and I wonder why it wasn't detected earlier. Interestingly I noticed this bug just because the libime debian package failed to build on *native* hardware, while it successfully built in qemu. This patch corrects the bitshift and masking calculation in FR3(). Signed-off-by: Helge Deller <deller@gmx.de> Cc: <stable@vger.kernel.org>
This commit is contained in:
parent
568035b01c
commit
7ae1f5508d
@ -93,7 +93,7 @@
|
|||||||
#define R1(i) (((i)>>21)&0x1f)
|
#define R1(i) (((i)>>21)&0x1f)
|
||||||
#define R2(i) (((i)>>16)&0x1f)
|
#define R2(i) (((i)>>16)&0x1f)
|
||||||
#define R3(i) ((i)&0x1f)
|
#define R3(i) ((i)&0x1f)
|
||||||
#define FR3(i) ((((i)<<1)&0x1f)|(((i)>>6)&1))
|
#define FR3(i) ((((i)&0x1f)<<1)|(((i)>>6)&1))
|
||||||
#define IM(i,n) (((i)>>1&((1<<(n-1))-1))|((i)&1?((0-1L)<<(n-1)):0))
|
#define IM(i,n) (((i)>>1&((1<<(n-1))-1))|((i)&1?((0-1L)<<(n-1)):0))
|
||||||
#define IM5_2(i) IM((i)>>16,5)
|
#define IM5_2(i) IM((i)>>16,5)
|
||||||
#define IM5_3(i) IM((i),5)
|
#define IM5_3(i) IM((i),5)
|
||||||
|
Loading…
Reference in New Issue
Block a user