OSDN Git Service

ppc: Fix the bad exception NIP value and the range check in LSWX
authorThomas Huth <thuth@redhat.com>
Thu, 14 Apr 2016 15:14:53 +0000 (17:14 +0200)
committerDavid Gibson <david@gibson.dropbear.id.au>
Mon, 18 Apr 2016 05:14:38 +0000 (15:14 +1000)
commit537d3e8e6beea9a0fbd6469eb38450e718244dad
tree89b8bd2b951197ebc8d5500168518422f41cb6ae
parentafbee7128c2399b6fca7b744ee560e3a1851118e
ppc: Fix the bad exception NIP value and the range check in LSWX

The range checks in the LSWX instruction are completely insufficient:
They do not take the wrap-around case into account, and the check
"reg < rx" should be "reg <= rx" instead. Fix it by using the new
lsw_reg_in_range() helper function that is already used for LSWI, too.

Then there is a second problem: In case the INVAL exception is generated,
the NIP value is wrong, it currently points to the instruction before
the LSWX instruction. This is because gen_lswx() already decreases the
NIP value by 4 (to be prepared for page fault exceptions), and
powerpc_excp() later decreases it again by 4 while handling the program
exception. So to get this right, we've got to undo the "- 4" from
gen_lswx() here before calling helper_raise_exception_err().

Signed-off-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
target-ppc/mem_helper.c