RFR(S): 8153892: Handle unsafe access error directly in signal handler instead of going through a stub
David Holmes
david.holmes at oracle.com
Tue Apr 12 00:03:26 UTC 2016
On 11/04/2016 7:15 PM, Thomas Stüfe wrote:
>
>
> On Mon, Apr 11, 2016 at 11:05 AM, Thomas Stüfe <thomas.stuefe at gmail.com
> <mailto:thomas.stuefe at gmail.com>> wrote:
>
> Hi David,
>
> On Mon, Apr 11, 2016 at 2:57 AM, David Holmes
> <david.holmes at oracle.com <mailto:david.holmes at oracle.com>> wrote:
>
> Hi Mikael,
>
> I think we need to be able to answer the question as to why the
> stubbed and stubless forms of this code exist to ensure that
> converting all platforms to the same form is appropriate.
>
> I'm still going through this but my initial reaction is to
> wonder why we don't use the same form of handle_unsafe_access on
> all platforms and always pass in npc? (That seems to be the only
> difference in code that otherwise seems platform independent.)
>
>
> On Solaris we get the npc for free in the signal ucontext. On x86 it
> has to be calculated. But yes, this could be moved out of the handle
> functions and just passed in.
>
> I also saw that we apparently miss handling for ppc. No one seemed
> to miss it until now, but it may make sense to add handling anyway.
>
>
> Oh, we do not miss it. Volker just showed me that it is done directly
> in the signal handlers for AIX and Linux ppc.
So is there more scope to refactor this out of the platform specific
code altogether?
David
>
> Kind Regards, Thomas
>
>
> Thanks,
> David
>
>
> On 9/04/2016 8:33 AM, Mikael Vidstedt wrote:
>
>
> 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