[15] RFR(S): 8244433: Remove saving of RSP in Assembler::pusha_uncached()
Christian Hagedorn
christian.hagedorn at oracle.com
Thu May 14 09:38:55 UTC 2020
Hi
Please review the following enhancement for x86:
https://bugs.openjdk.java.net/browse/JDK-8244433
http://cr.openjdk.java.net/~chagedorn/8244433/webrev.00/
This removes the move instruction for saving the actual value of RSP in
Assembler::pusha_uncached()/pusha(). The original value of RSP is
normally not used on the stack as the value of RSP will automatically be
restored after popa to the same value before doing pusha. There are two
locations, however, where we need to know the original value of RSP in
order to print it. But these places can also compute the correct value
of RSP by using the new value of RSP after pusha and adding 16 *
wordSize to it. I fixed those.
We still keep the same alignment by subtracting 16 * wordSize from RSP
in pusha. Does anybody see any potential problems by not saving the
value of RSP on the stack with pusha?
Either way, as Erik Ö. has pointed out, the Windows x64 ABI does not
specify a red zone of 128 bytes. If we are unlucky and get an interrupt
between saving RSP and decrementing RSP in the current code, we could
end up with a corrupt value for RSP on Windows. Therefore, we do need to
fix pusha_uncached() if we still want to save the old value of RSP. For
example, we could first subtract 16 * wordSize and then calculate the
correct value:
subq(rsp, 16 * wordSize);
movq(Address(rsp, 11 * wordSize), rsp);
addq(Address(rsp, 11 * wordSize), 16 * wordSize);
Thank you!
Best regards,
Christian
More information about the hotspot-dev
mailing list