RFR(L): 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
Vladimir Kozlov
vladimir.kozlov at oracle.com
Wed Apr 2 16:03:45 UTC 2014
I tried to tell about this during review ;) I thought using (<=StackShadowPages) from 8026775 changes should touch it.
Can you spend sometime and write down in bug report about all places where we do stack bang and how much pages we bang
so we can see whole picture?
I think we should bang all sequential pages and do the same in all places. Banging StackShadowPages or
StackShadowPages+1 is secondary if we do the same in all places.
Thanks,
Vladimir
On 4/2/14 1:46 AM, Roland Westrelin wrote:
>> The question is why you got EXCEPTION_ACCESS_VIOLATION for normal stack bang? May be it is 8026775 again when one page is skipped during banging. Windows requires sequential pages touche.
>
> I wasn’t aware of this requirement on windows. Thanks, Vladimir.
> The interpreter bangs up to and including sp + StackShadowPages while the compiled code, with this change, bangs at sp + StackShadowPages + 1. So a page can be skipped and the requirement that all pages be touched sequentially cannot be guaranteed. So we either have to go back to banging at sp + StackShadowPages for the compiled code or enable the code that I pointed to in the signal on 32 bit. What do you think?
>
> Roland.
>
>>
>> Thanks,
>> Vladimir
>>
>> On 4/1/14 8:00 AM, Roland Westrelin wrote:
>>> I tried to push that change and couldn’t because of a crash on windows 32 bit. The VM crashes at a stack banging instruction in compiled code but the sp looks to be perfectly valid (not in the yellow zone or red zone, within the stack bounds). I noticed this code in the windows signal handler:
>>>
>>> #ifdef _WIN64
>>> //
>>> // If it's a legal stack address map the entire region in
>>> //
>>> PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
>>> address addr = (address) exceptionRecord->ExceptionInformation[1];
>>> if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) {
>>> addr = (address)((uintptr_t)addr &
>>> (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
>>> os::commit_memory((char *)addr, thread->stack_base() - addr,
>>> !ExecMem);
>>> return EXCEPTION_CONTINUE_EXECUTION;
>>> }
>>> else
>>> #endif
>>>
>>> If I enable it on 32 bit, the jprt tests pass. Does anybody know why this is needed? Why this is WIN64 only?
>>>
>>> Roland.
>>>
>
More information about the hotspot-compiler-dev
mailing list