RFR(S): 8153892: Handle unsafe access error directly in signal handler instead of going through a stub
Mikael Vidstedt
mikael.vidstedt at oracle.com
Fri Apr 8 22:33:33 UTC 2016
Please review:
Bug: https://bugs.openjdk.java.net/browse/JDK-8153892
Webrev:
http://cr.openjdk.java.net/~mikael/webrevs/8153892/webrev.01/hotspot/webrev/
* Note: this is patch 2 in a set of 3 all aiming to clean up and unify
the unsafe memory getters/setters, along with the handling of unsafe
access errors. The other two issues are:
https://bugs.openjdk.java.net/browse/JDK-8153890 - Handle unsafe access
error as an asynchronous exception
https://bugs.openjdk.java.net/browse/JDK-8150921 - Update Unsafe
getters/setters to use double-register variants
* Summary (copied from the bug description)
In certain cases, such as accessing a region of a memory mapped file
which has been truncated on unix-style operating systems, a SIGBUS
signal will be raised and the VM will process it in the signal handler.
How the signal is processed differs depending on the operating system
and/or CPU architecture, with two major alternatives:
* "stubless"
Do the necessary thread state updates directly in the signal handler,
and modify the context so that the signal handler returns to the place
where the execution should continue
* Using a stub
Update the context so that when the signal handler returns the thread
will continue execution in a generated stub, which in turn will call
some native code in the VM to update the thread state and figure out
where execution should continue. The stub will then jump to that new place.
It should be noted that the work of updating the thread state is very
small - it's setting a flag or two in the thread structure, and figures
out where the next instruction starts. It should also be noted that the
generated stubs today are broken, because they do not preserve all the
live registers over the call into the VM. There are two ways to address
this:
* Preserve all the necessary registers
This would mean implementing, in macro assembly, the necessary logic for
preserving all the live registers, including, but not limited to,
floating point registers, flag registers, etc. It quickly becomes
obvious that this platform specific and error prone.
* Leverage the fact that the operating system already does this as part
of the signal handling
Do the necessary work in the signal handler instead, removing the need
for the stub alltogether
As mentioned, on some platforms the latter model is already in use. It
is dramatically easier and all platforms should be updated to do it the
same way.
* Testing
Just as mentioned in the RFR for JDK-8153890, a new test was developed
to test this code path:
http://cr.openjdk.java.net/~mikael/webrevs/8150921/MappedTruncated.java
In fact, it was when running this test I found the register preservation
issue. JPRT also passes. Much like JDK-8153890 I wanted to get some
feedback on this before running additional tests.
Cheers,
Mikael
More information about the ppc-aix-port-dev
mailing list