RFR: 8287325: AArch64: fix virtual threads with -XX:UseBranchProtection=pac-ret [v6]
Hao Sun
haosun at openjdk.org
Tue Sep 12 06:21:13 UTC 2023
On Mon, 11 Sep 2023 12:34:02 GMT, Andrew Haley <aph at openjdk.org> wrote:
>> I guess the following pseudo-code is what you want:
>>
>>
>> /*
>> * file ContinuationHelper.hpp
>> */
>>
>> class BaseContinuationHelper {
>> public:
>> inline void patch_return_address_at(intptr_t* sp, address pc) {
>> // the default implementation
>> }
>> }
>>
>> class ContinuationHelper : public BaseContinuationHelper {
>> public:
>> inline void patch_return_address_at(intptr_t* sp, address pc) {} // declare here
>> }
>>
>> /*
>> * file ContinuationHelper_aarch64.inline.hpp
>> */
>>
>> inline void ContinuationHelper::patch_return_address_at(intptr_t* sp, address pc) {
>> // override here for AArch64
>> }
>>
>> /*
>> * file ContinuationHelper_x86.inline.hpp
>> */
>>
>> // no need to define patch_return_address_at().
>> // use the default BaseContinuationHelper::patch_return_address_at().
>>
>>
>> However, it doesn't work because we have to define `ContinuationHelper::patch_return_address_at()` for x86 since we declare it.
>>
>> Please let me know if I misunderstood something.
>
> I see the problem. I'd do this:
>
>
> diff --git a/src/hotspot/cpu/aarch64/continuationHelper_aarch64.inline.hpp b/src/hotspot/cpu/aarch64/continuationHelper_aarch64.inline.hpp
> index 25e83e7e4b9..e1bd855dddf 100644
> --- a/src/hotspot/cpu/aarch64/continuationHelper_aarch64.inline.hpp
> +++ b/src/hotspot/cpu/aarch64/continuationHelper_aarch64.inline.hpp
> @@ -68,6 +68,8 @@ inline void ContinuationHelper::push_pd(const frame& f) {
> *(intptr_t**)(f.sp() - frame::sender_sp_offset) = f.fp();
> }
>
> +#define CPU_OVERRIDES_RETURN_ADDRESS_ACCESSORS
> +
> inline address ContinuationHelper::return_address_at(intptr_t* sp) {
> return pauth_strip_verifiable(*(address*)sp);
> }
> diff --git a/src/hotspot/cpu/x86/continuationHelper_x86.inline.hpp b/src/hotspot/cpu/x86/continuationHelper_x86.inline.hpp
> index ce88dd6dbba..55794f9ac7e 100644
> --- a/src/hotspot/cpu/x86/continuationHelper_x86.inline.hpp
> +++ b/src/hotspot/cpu/x86/continuationHelper_x86.inline.hpp
> @@ -68,14 +68,6 @@ inline void ContinuationHelper::push_pd(const frame& f) {
> *(intptr_t**)(f.sp() - frame::sender_sp_offset) = f.fp();
> }
>
> -inline address ContinuationHelper::return_address_at(intptr_t* sp) {
> - return *(address*)sp;
> -}
> -
> -inline void ContinuationHelper::patch_return_address_at(intptr_t* sp, address pc) {
> - *(address*)sp = pc;
> -}
> -
> inline void ContinuationHelper::set_anchor_to_entry_pd(JavaFrameAnchor* anchor, ContinuationEntry* entry) {
> anchor->set_last_Java_fp(entry->entry_fp());
> }
> diff --git a/src/hotspot/share/runtime/continuationHelper.inline.hpp b/src/hotspot/share/runtime/continuationHelper.inline.hpp
> index 7c6ab7ee76b..6d4d739f219 100644
> --- a/src/hotspot/share/runtime/continuationHelper.inline.hpp
> +++ b/src/hotspot/share/runtime/continuationHelper.inline.hpp
> @@ -37,6 +37,15 @@
>
> #include CPU_HEADER_INLINE(continuationHelper)
>
> +#ifndef CPU_OVERRIDES_RETURN_ADDRESS_ACCESSORS
> +inline address ContinuationHelper::return_address_at(intptr_t* sp) {
> + return *(address*)sp;
> +}
> +inline void ContinuationHelper::patch_return_address_at(intptr_t* sp, address pc) {
> + *(address*)sp = pc;
> +}
> +#endif
> +
> inline bool ContinuationHelper::NonInterpretedUnknownFrame::is_instance(const frame& f) {
> return !f.is_interpreted_frame();
> }
Thanks for your suggestion. Updated in the latest commit.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/13322#discussion_r1322474996
More information about the hotspot-dev
mailing list