[PATCH v1] gdb/linux: add helpers to read AT_HWCAP3 and AT_HWCAP4
Matthieu Longo <[email protected]> Mon, 27 Jul 2026 18:28:31 +0100
| Newsgroups | gmane.comp.gdb.patches |
|---|---|
| Message-ID | <[email protected]> |
Add linux_get_hwcap3 and linux_get_hwcap4 helpers to GDB and gdbserver, mirroring the existing linux_get_hwcap and linux_get_hwcap2 interfaces. The new helpers retrieve the AT_HWCAP3 and AT_HWCAP4 auxiliary vector entry either from explicitly supplied auxv data or from the current inferior. This prepares for future features that depend on HWCAP3 and HWCAP4 capability bits. Reviewed-by: Thiago Jung Bauermann <[email protected]> --- gdb/linux-tdep.c | 38 ++++++++++++++++++++++++++++++++++++++ gdb/linux-tdep.h | 22 ++++++++++++++++++++++ gdbserver/linux-low.cc | 28 ++++++++++++++++++++++++++++ gdbserver/linux-low.h | 8 ++++++++ 4 files changed, 96 insertions(+) diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index 30a279248ec..a11427edf61 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -3215,6 +3215,44 @@ linux_get_hwcap2 () current_inferior ()->arch ()); } +/* See linux-tdep.h. */ + +CORE_ADDR +linux_get_hwcap3 (const std::optional<gdb::byte_vector> &auxv, + target_ops *target, gdbarch *gdbarch) +{ + return linux_get_hwcap_helper (auxv, target, gdbarch, AT_HWCAP3); +} + +/* See linux-tdep.h. */ + +CORE_ADDR +linux_get_hwcap3 () +{ + return linux_get_hwcap3 (target_read_auxv (), + current_inferior ()->top_target (), + current_inferior ()->arch ()); +} + +/* See linux-tdep.h. */ + +CORE_ADDR +linux_get_hwcap4 (const std::optional<gdb::byte_vector> &auxv, + target_ops *target, gdbarch *gdbarch) +{ + return linux_get_hwcap_helper (auxv, target, gdbarch, AT_HWCAP4); +} + +/* See linux-tdep.h. */ + +CORE_ADDR +linux_get_hwcap4 () +{ + return linux_get_hwcap4 (target_read_auxv (), + current_inferior ()->top_target (), + current_inferior ()->arch ()); +} + /* Display whether the gcore command is using the /proc/PID/coredump_filter file. */ diff --git a/gdb/linux-tdep.h b/gdb/linux-tdep.h index 1dd0b3d2a17..8f7e7aafbd0 100644 --- a/gdb/linux-tdep.h +++ b/gdb/linux-tdep.h @@ -91,6 +91,28 @@ extern CORE_ADDR linux_get_hwcap2 (const std::optional<gdb::byte_vector> &auxv, extern CORE_ADDR linux_get_hwcap2 (); +/* Fetch the AT_HWCAP3 entry from auxv data AUXV. Use TARGET and GDBARCH to + parse auxv entries. + + On error, 0 is returned. */ +extern CORE_ADDR linux_get_hwcap3 (const std::optional<gdb::byte_vector> &auxv, + struct target_ops *target, gdbarch *gdbarch); + +/* Same as the above, but obtain all the inputs from the current inferior. */ + +extern CORE_ADDR linux_get_hwcap3 (); + +/* Fetch the AT_HWCAP4 entry from auxv data AUXV. Use TARGET and GDBARCH to + parse auxv entries. + + On error, 0 is returned. */ +extern CORE_ADDR linux_get_hwcap4 (const std::optional<gdb::byte_vector> &auxv, + struct target_ops *target, gdbarch *gdbarch); + +/* Same as the above, but obtain all the inputs from the current inferior. */ + +extern CORE_ADDR linux_get_hwcap4 (); + /* Returns true if ADDR belongs to a shadow stack memory range. If this is the case, assign the shadow stack memory range to RANGE [start_address, end_address). */ diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index f1be62225e2..c4daba0bf40 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -70,6 +70,14 @@ #define AT_HWCAP2 26 #endif +#ifndef AT_HWCAP3 +#define AT_HWCAP3 29 +#endif + +#ifndef AT_HWCAP4 +#define AT_HWCAP4 30 +#endif + /* Some targets did not define these ptrace constants from the start, so gdbserver defines them locally here. In the future, these may be removed after they are added to asm/ptrace.h. */ @@ -7235,6 +7243,26 @@ linux_get_hwcap2 (int pid, int wordsize) return hwcap2; } +/* See linux-low.h. */ + +CORE_ADDR +linux_get_hwcap3 (int pid, int wordsize) +{ + CORE_ADDR hwcap3 = 0; + linux_get_auxv (pid, wordsize, AT_HWCAP3, &hwcap3); + return hwcap3; +} + +/* See linux-low.h. */ + +CORE_ADDR +linux_get_hwcap4 (int pid, int wordsize) +{ + CORE_ADDR hwcap4 = 0; + linux_get_auxv (pid, wordsize, AT_HWCAP4, &hwcap4); + return hwcap4; +} + #ifdef HAVE_LINUX_REGSETS void initialize_regsets_info (struct regsets_info *info) diff --git a/gdbserver/linux-low.h b/gdbserver/linux-low.h index 60154240ddd..b274d3cb370 100644 --- a/gdbserver/linux-low.h +++ b/gdbserver/linux-low.h @@ -977,4 +977,12 @@ CORE_ADDR linux_get_hwcap (int pid, int wordsize); CORE_ADDR linux_get_hwcap2 (int pid, int wordsize); +/* Fetch the AT_HWCAP3 entry from the auxv vector, where entries are length + WORDSIZE, of process with pid PID. If no entry was found, return 0. */ +CORE_ADDR linux_get_hwcap3 (int pid, int wordsize); + +/* Fetch the AT_HWCAP4 entry from the auxv vector, where entries are length + WORDSIZE, of process with pid PID. If no entry was found, return 0. */ +CORE_ADDR linux_get_hwcap4 (int pid, int wordsize); + #endif /* GDBSERVER_LINUX_LOW_H */ -- 2.55.0