From: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
To: Christina Schimpe <christina.schimpe@intel.com>
Cc: gdb-patches@sourceware.org, tom@tromey.com
Subject: Re: [PATCH v4 10/13] gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64 linux.
Date: Thu, 03 Sep 2026 07:49:37 +0000 [thread overview]
Message-ID: <87v78mrcz2.fsf@linaro.org> (raw)
In-Reply-To: <20260708143639.2214689-11-christina.schimpe@intel.com> (Christina Schimpe's message of "Wed, 8 Jul 2026 14:36:36 +0000")
Christina Schimpe <christina.schimpe@intel.com> writes:
> diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
> index 42a62eaa975..d98415b8989 100644
> --- a/gdb/amd64-linux-tdep.c
> +++ b/gdb/amd64-linux-tdep.c
> @@ -1960,6 +1960,62 @@ amd64_linux_top_addr_empty_shadow_stack
> return addr == range.second;
> }
>
> +/* Return a shadow stack frame info, if the shadow stack pointer SSP
> + belongs to a valid shadow stack frame while the element on the shadow
> + stack VALUE does not refer to a return address. This can happen, for
> + instance, in case of signals. The old shadow stack pointer is pushed
> + in a special format with bit 63 set. In case this is true, a valid
> + shadow stack frame info is returned with its attributes frame_type and
> + non_return_description configured to ssp_frame_type::non_return_frame
> + and "<sigframe token>", respectively. */
> +
> +static std::optional<shadow_stack_frame_info>
> +amd64_linux_is_no_return_shadow_stack_address
> + (gdbarch *gdbarch, const CORE_ADDR ssp, const CORE_ADDR value,
> + const unsigned long level)
> +{
> + /* SSP must belong to the shadow stack memory range. */
> + std::pair<CORE_ADDR, CORE_ADDR> range;
> + gdb_assert (gdbarch_address_in_shadow_stack_memory_range (gdbarch,
> + ssp,
> + &range));
I made this comment at another assert in a previous version of this
series, but it's valid here too:
Won't this make GDB crash with a misbehaving inferior? It could indeed
mean an internal error (GDB somehow got the SSP or range wrong), but it
could also be (and probably more likely) an inconsistent state of the
inferior. This can happen in a program being debugged so GDB should be
able to handle it gracefully, and if possible provide useful information
to the user.
Maybe turn this into an error ()?
> +
> + /* In case bit 63 is not configured, the address on the shadow stack
> + should be a return address. */
> + constexpr CORE_ADDR mask = (CORE_ADDR) 1 << 63;
> + if ((value & mask) == 0)
> + return {};
> +
> + /* To compare the shadow stack pointer of the previous frame with the
> + value of FRAME, we must clear bit 63. */
> + CORE_ADDR shadow_stack_val_cleared = (value & (~mask));
> +
> + /* Compute the previous/old SSP. The shadow stack grows downwards. To
> + compute the previous shadow stack pointer, we need to increment
> + SSP. */
> + CORE_ADDR prev_ssp
> + = ssp + gdbarch_shadow_stack_element_size_aligned (gdbarch);
> +
> + /* We incremented SSP by one element to compute PREV_SSP before. In
> + case SSP points to the first element of the shadow stack, PREV_SSP
> + must point to the bottom of the shadow stack (RANGE.SECOND), but not
> + beyond that address. */
> + gdb_assert (prev_ssp > range.first && prev_ssp <= range.second);
> +
> + if (shadow_stack_val_cleared == prev_ssp)
> + {
> + /* Assign the current gdbarch to the new shadow stack frame. Since
> + the token is no PC value, do not assign a SAL object. */
> + return std::optional<shadow_stack_frame_info>
> + ({ssp, value, level, gdbarch, {},
> + ssp_frame_type::non_return_frame,
> + {"<sigframe token>"},
> + ssp_unwind_stop_reason::no_error});
> + }
> +
> + return {};
> +}
> +
--
Thiago
(he/him)
next prev parent reply other threads:[~2026-09-03 7:50 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-08 14:36 [PATCH v4 00/13] Add new command to print the shadow stack backtrace Christina Schimpe
2026-07-08 14:36 ` [PATCH v4 01/13] gdb: Generalize handling of the shadow stack pointer Christina Schimpe
2026-07-08 14:36 ` [PATCH v4 02/13] aarch64: Implement gdbarch function top_addr_empty_shadow_stack Christina Schimpe
2026-08-12 22:13 ` Luis
2026-08-25 9:01 ` Joos, Christina
2026-08-29 5:24 ` Thiago Jung Bauermann
2026-08-30 11:14 ` Joos, Christina
2026-09-03 6:49 ` Thiago Jung Bauermann
2026-09-12 6:02 ` Thiago Jung Bauermann
2026-07-08 14:36 ` [PATCH v4 03/13] gdb: Add get_main_func_start_pc to refactor frame.c:inside_main_func Christina Schimpe
2026-09-03 6:53 ` Thiago Jung Bauermann
2026-07-08 14:36 ` [PATCH v4 04/13] gdb: Refactor 'stack.c:print_frame' Christina Schimpe
2026-07-08 14:36 ` [PATCH v4 05/13] gdb: Introduce 'stack.c:print_pc' function without frame argument Christina Schimpe
2026-07-08 14:36 ` [PATCH v4 06/13] gdb: Refactor 'find_symbol_funname' and 'info_frame_command_core' in stack.c Christina Schimpe
2026-07-08 14:36 ` [PATCH v4 07/13] gdb: Refactor 'stack.c:print_frame_info' Christina Schimpe
2026-07-08 14:36 ` [PATCH v4 08/13] gdb: Add command option 'bt -shadow' to print the shadow stack backtrace Christina Schimpe
2026-09-03 7:37 ` Thiago Jung Bauermann
2026-09-10 19:36 ` Joos, Christina
2026-09-12 5:52 ` Thiago Jung Bauermann
2026-07-08 14:36 ` [PATCH v4 09/13] gdb: Provide gdbarch hook to distinguish shadow stack backtrace elements Christina Schimpe
2026-09-03 7:44 ` Thiago Jung Bauermann
2026-07-08 14:36 ` [PATCH v4 10/13] gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64 linux Christina Schimpe
2026-09-03 7:49 ` Thiago Jung Bauermann [this message]
2026-07-08 14:36 ` [PATCH v4 11/13] gdb: Enable inferior calls in the shadow stack backtrace Christina Schimpe
2026-09-03 7:51 ` Thiago Jung Bauermann
2026-07-08 14:36 ` [PATCH v4 12/13] gdb: Enable signal trampolines " Christina Schimpe
2026-09-03 7:53 ` Thiago Jung Bauermann
2026-07-08 14:36 ` [PATCH v4 13/13] gdb, mi: Add -shadow-stack-list-frames command Christina Schimpe
2026-09-03 8:10 ` Thiago Jung Bauermann
2026-08-04 7:45 ` RE:[PATCH v4 00/13] Add new command to print the shadow stack backtrace Joos, Christina
2026-09-03 6:44 ` [PATCH " Thiago Jung Bauermann
2026-09-10 19:42 ` Joos, Christina
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87v78mrcz2.fsf@linaro.org \
--to=thiago.bauermann@linaro.org \
--cc=christina.schimpe@intel.com \
--cc=gdb-patches@sourceware.org \
--cc=tom@tromey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox