]> git.karo-electronics.de Git - karo-tx-linux.git/commit
ia64: Fix unaligned handler for floating point instructions with base update
authorLuck, Tony <tony.luck@intel.com>
Wed, 16 Jan 2008 19:04:16 +0000 (11:04 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 8 Feb 2008 20:01:46 +0000 (12:01 -0800)
commit30f7ec38c20ec15019fd9a4566391253f139843c
treebf2fc6e6e5d3c15d62147064947dde0be9a60e39
parentd7dc95b98ebadd96b511ca0d1155778e16543f85
ia64: Fix unaligned handler for floating point instructions with base update

commit 1a499150e4ec1299232e24389f648d059ce5617a in mainline.

[IA64] Fix unaligned handler for floating point instructions with base update

The compiler team did the hard work for this distilling a problem in
large fortran application which showed up when applied to a 290MB input
data set down to this instruction:

ldfd f34=[r17],-8

Which they noticed incremented r17 by 0x10 rather than decrementing it
by 8 when the value in r17 caused an unaligned data fault.  I tracked
it down to some bad instruction decoding in unaligned.c. The code
assumes that the 'x' bit can determine whether the instruction is
an "ldf" or "ldfp" ... which it is for opcode=6 (see table 4-29 on
page 3:302 of the SDM).  But for opcode=7 the 'x' bit is irrelevent,
all variants are "ldf" instructions (see table 4-36 on page 3:306).

Note also that interpreting the instruction as "ldfp" means that the
"paired" floating point register (f35 in the example here) will also
be corrupted.

Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/ia64/kernel/unaligned.c