> This patch rewrites the code in the Windows port of HotSpot for detecting,
> handling, and reporting stack overflows. This patch is motivated by
> documented
> failures in JDK-8152598, JDK-8156538, JDK-8157521, JDK-8157924, JDK-8335362,
> and
> in JDK-8067946.
>
> The key result of this patch is that in addition to preventing the crashes
> that
> can be reproduced using the information in the above JBS issues, HotSpot on
> Windows now supports far-access stack bangs in compiled code while continuing
> to leverage Windows' incremental stack growth based on guard pages, ensuring
> that we don't sacrifice performance that would have been lost to page-by-page
> stack bangs. The Red and Yellow page counts now change the actual page
> permissions and HotSpot Guard Zone size, thus impacting the page that triggers
> the stack overflow error after stack banging. This patch also makes HotSpot's
> semantics for stack overflows for native and VM threads on Windows to match
> with
> those for Linux and macOS, in turn paving the way for supporting Reserved
> Stack
> pages on Windows.
>
> This is a non-trivial change, so I have documented the key ideas
> [here](https://cr.openjdk.org/~arane/windows-stack). The
> commits in this patch are organized (so far) to match the section headings in
> the document:
>
> - ed824007: [Section
> 4.1](https://cr.openjdk.org/~arane/windows-stack#growing-the-stack-on-demand)
> - f765e79d: [Section
> 4.2](https://cr.openjdk.org/~arane/windows-stack#matching-hotspots-guard-zone-with-windows-stack-guarantee)
> - 9d694f5c: [Section
> 4.3](https://cr.openjdk.org/~arane/windows-stack#handling-windows-stack-overflow-exceptions)
> - edf58c4f: [Section
> 4.4](https://cr.openjdk.org/~arane/windows-stack#handling-subsequent-stack-overflows)
> - ff9b65f6: [Section
> 4.5.1](https://cr.openjdk.org/~arane/windows-stack#miscellaneous-supporting-changes)
> - b3e146e9: [Section
> 4.5.2](https://cr.openjdk.org/~arane/windows-stack#miscellaneous-supporting-changes)
> - 8189a507: [Section
> 4.6](https://cr.openjdk.org/~arane/windows-stack#validation)
>
> I've validated this patch by running through all tier 1, 2, and 3 JDK,
> HotSpot,
> and LangTools tests on Windows/x64 and Windows/ARM64 in FastDebug config.
>
> ---------
> - [x] I confirm that I make this contribution in accordance with the [OpenJDK
> Interim AI Policy](https://openjdk.org/legal/ai).
Ashay Rane has updated the pull request with a new target base due to a merge
or a rebase. The pull request now contains 19 commits:
- Merge branch 'master' into JDK-8067946-setthreadstackguarantee
- Bringing back the change to `DEFAULT_STACK_SHADOW_PAGES`
This makes Windows use the same number of stack shadow pages by default
as other OSes.
- Merge branch 'master' into JDK-8067946-setthreadstackguarantee
- [Section 4.6] Add supporting tests
- TestWindowsStackOverflow.java tests both recoverable and unrecoverable
overflows.
- In particular, since recoverable overflow handling has two entry
points (first overflow using EXCEPTION_STACK_OVERFLOW and subsequent
overflows using EXCEPTION_ACCESS_VIOLATION), this test induces
multiple recoverable stack overflows.
- The unrecoverable overflow test triggers a separate JVM execution that
executes native code that bangs into the red zone. The triggering JVM
then checks the return code and the output message.
- TestWindowsStackPages.java makes the older TestWindowsStackYellowPages
test more broad, by checking the default and configurable values for
both Red and Yellow pages.
- [Section 4.5.2] Match default stack size across OSes on AArch64
Both Linux and macOS on AArch64 use a 2MB stack. Without this patch,
the SOEDeeplyNestedBlockTest.java test fails on Windows/ARM64.
- [Section 4.5.1] Include the allocated frame in the stack bang
- [Section 4.4] Handle Subsequent Stack Overflows
Update handler for EXCEPTION_ACCESS_VIOLATION to report fatal versus
recoverable overflow errors depending on red zone or yellow zone memory
access
- [Section 4.3] Handle Windows' Stack Overflow Exceptions
- Change protection of guard zone to use PAGE_NOACCESS instead of
PAGE_GUARD
- Update handler for EXCEPTION_STACK_OVERFLOW to detect nested overflow
exceptions
- Protect the red zone with PAGE_NOACCESS to detect runaway stack usage
- If thread is executing Java code, report a StackOverflowError
exception; for native or VM threads, continue execution
- [Section 4.2] Match HotSpot's Guard Zone with Windows' Stack Guarantee
- Set the (logical) yellow zone size to be the same for Windows as all
other OSes
- Request the stack guarantee based on the red page count and the
logical yellow page count
- If the actual stack guarantee is larger than the requested value, then
expand the yellow zone (see `stack_yellow_reserved_zone_size()`)
- Update the TestWindowsStackYellowPages.java test to reflect the
updated minimum yellow page count
- [Section 4.1] Grow stack on demand
- Update handler for EXCEPTION_ACCESS_VIOLATION to detect memory
accesses in the usable stack but beyond `StackLimit`
- Sequentially touch pages until `StackLimit` grows to include the page
that corresponds to the faulting memory access.
- ... and 9 more: https://git.openjdk.org/jdk/compare/dfe4e046...b60dadfe
-------------
Changes: https://git.openjdk.org/jdk/pull/32365/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=32365&range=10
Stats: 496 lines in 16 files changed: 391 ins; 76 del; 29 mod
Patch: https://git.openjdk.org/jdk/pull/32365.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/32365/head:pull/32365
PR: https://git.openjdk.org/jdk/pull/32365