From: Andrew Burgess <aburgess@redhat.com>
To: Christina Joos <christina.joos@intel.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH 1/2] gdb: Enable OS generated corefiles on systems with Intel AMX support.
Date: Mon, 07 Sep 2026 11:05:42 +0100 [thread overview]
Message-ID: <87tso1qsuh.fsf@redhat.com> (raw)
In-Reply-To: <20260904100648.1705702-2-christina.joos@intel.com>
Thanks for addressing this issue. I have some style issues, and one
deeper though about the test, see below.
Christina Joos <christina.joos@intel.com> writes:
> This patch addresses the issue described in
> https://sourceware.org/bugzilla/show_bug.cgi?id=34561.
Bugs should be linked using a line at the end of the commit message
(see gdb/MAINTAINERS) like:
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34561
Given the link always gets added at the end like this, in the commit
message body you can just write:
This patch addresses the issue described in PR gdb/34561. On systems
with Intel AMX support the .... etc ...
anyone who wants a direct link to the bug can find it in the 'Bug: '
line at the end of the commit message.
>
> On Systems with Intel AMX support the xsave size is 11008. This xsave
lower case 's' on 'Systems' please.
> size is not handled by gdb/i387-tdep.c:i387_guess_xsave_layout and is
> causing problems for corefiles generated by the linux kernel.
>
> ~~~
> $ gdb
> GNU gdb (GDB) 19.0.50.20260814-git
> Copyright (C) 2026 Free Software Foundation, Inc.
> [...]
> (gdb) core core_main_SEGV
> [New LWP 2162880 (id 1)]
> [...]
> Core was generated by `./main'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> 4 *pointer = 3;
> (gdb) p $ymm0
> $1 = void
> ~~~
>
> We should be able to print the register $ymm0 (or any other register
> belonging to a feature higher than SSE).
>
> For a live debug session we can print it:
> ~~~
> Reading symbols from main...
> (gdb) start
> Temporary breakpoint 1 at 0x1131: file main.c, line 3.
> Starting program: /tmp/main
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
>
> Temporary breakpoint 1, main () at main.c:3
> 3 int *pointer = 0;
> (gdb) p $ymm0
> $1 = {v16_bfloat16 = {0, 2.342e-38, 0 <repeats 14 times>}, v16_half = {0, 1.5199e-05, 0 <repeats 14 times>}, v8_float = {
> 2.34180515e-38, 0, 0, 0, 0, 0, 0, 0}, v4_double = {8.256666972292243e-317, 0, 0, 0}, v32_int8 = {0, 0, -1,
> 0 <repeats 29 times>}, v16_int16 = {0, 255, 0 <repeats 14 times>}, v8_int32 = {16711680, 0, 0, 0, 0, 0, 0, 0}, v4_int64 = {
> 16711680, 0, 0, 0}, v2_int128 = {16711680, 0}}
> [...]
> ~~~
>
> Note, that this is not reproducible for corefiles generated by the gcore
Drop the comma after 'Note'.
> command, since in such corefiles the GDB target description is
> available and gdb/i387-tdep.c:i387_fallback_xsave_layout configures
> the xsave_layout based on xcr0 derived from the target description.
>
> This patch fixes this issue by handling the new xsave size in
> i387_guess_xsave_layout. It is necessary even though GDB does not
> support AMX yet, since we still pass the full xsave_size (11008)
> extracted from the corefile to i387_guess_xsave_layout.
> The patch does not fix i387_fallback_xsave_layout to configure the new xsave
> size. Configuring sizeof_xsave to 2696 is fine at this point, since
> truncating to 2696 drops only the parts GDB doesn't model yet.
>
> As a quick solution for the upcoming release and CPUs supporting
> Intel AMX this patch should be sufficient.
>
> Testing:
>
> I noticed that we don't have tests for corefiles for the features AVX,
> AVX512 and PKRU in the GDB testsuite. So this commit adds corefile tests
> for AVX, AVX512 and PKRU registers.
>
> It further fixes the tests gdb.base/coredump-filter.exp and
> gdb.arch/i386-tls-regs.exp on systems with Intel AMX support.
> With my patch the warning
> "warning: Unexpected size of section `.reg-xstate/1373786' in core file.^M"
> disappears and the tests are passing again.
Can you clean up the ^M artefact please.
Also, as you're touching the commit message anyway, I think this would
be better written as:
As a result of this patch, the warning:
warning: Unexpected size of section `.reg-xstate/1373786' in core file.
which was causing failure in gdb.base/coredump-filter.exp and
gdb.arch/i386-tls-regs.exp on AMX systems disappears, these tests now
pass.
> ---
> gdb/i387-tdep.c | 9 +++-
> gdb/testsuite/gdb.arch/i386-avx.c | 6 +++
> gdb/testsuite/gdb.arch/i386-avx.exp | 61 ++++++++++++++++++++++----
> gdb/testsuite/gdb.arch/i386-avx512.c | 6 +++
> gdb/testsuite/gdb.arch/i386-avx512.exp | 56 +++++++++++++++++++++++
> gdb/testsuite/gdb.arch/i386-pkru.c | 6 +++
> gdb/testsuite/gdb.arch/i386-pkru.exp | 39 ++++++++++++++++
> 7 files changed, 173 insertions(+), 10 deletions(-)
>
> diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
> index f22a5e02bbb..19429536537 100644
> --- a/gdb/i387-tdep.c
> +++ b/gdb/i387-tdep.c
> @@ -918,9 +918,14 @@ bool
> i387_guess_xsave_layout (uint64_t xcr0, size_t xsave_size,
> x86_xsave_layout &layout)
> {
> - if (HAS_PKRU (xcr0) && xsave_size == 2696)
> + if (HAS_PKRU (xcr0) && (xsave_size == 2696 || xsave_size == 11008))
> {
> - /* Intel CPUs supporting PKRU. */
> + /* Intel CPUs supporting PKRU.
> + Note that in this case 2 possible xsave_sizes have to be handled,
The 'Note' here is not really needed. The comment is by definition a
note. Also, variables should be capitalised, or avoid using the
variable name maybe, like:
In this case two possible XSAVE_SIZE values have to be handled. As
GDB does not yet support Intel AMX and CPUs that support this feature
will have a different XSAVE_SIZE (11008). If we don't handle this
size then we will not be able to handle any xsave registers from OS
generated core files on AMX systems.
> + since GDB does not support Intel AMX yet and CPUs that support
> + this feature still have a different xsave size (xsave_size == 11008).
> + Otherwise, we are not able to read xsave registers in OS generated
> + corefiles. */
> layout.avx_offset = 576;
> layout.k_offset = 1088;
> layout.zmm_h_offset = 1152;
> diff --git a/gdb/testsuite/gdb.arch/i386-avx.c b/gdb/testsuite/gdb.arch/i386-avx.c
> index b6cd89e5bea..7edcabcec8c 100644
> --- a/gdb/testsuite/gdb.arch/i386-avx.c
> +++ b/gdb/testsuite/gdb.arch/i386-avx.c
> @@ -18,11 +18,14 @@
> along with this program. If not, see <http://www.gnu.org/licenses/>. */
>
> #include <stdio.h>
> +#include <stdlib.h>
> #include "nat/x86-cpuid.h"
>
> /* Align sufficient to be able to use vmovaps. */
> #define ALIGN 32
>
> +volatile int should_dump_core_p = 1;
> +
> typedef struct {
> _Alignas (ALIGN) float f[8];
> } v8sf_t;
> @@ -87,6 +90,9 @@ main (int argc, char **argv)
>
> asm ("nop"); /* first breakpoint here */
>
> + if (should_dump_core_p) /* Crash for OS corefile. */
> + abort ();
We should still follow GDB/GNU style as much as possible in tests, which
means avoiding trailing comments. Please move the comment above the
`if` line. The exception in tests is when we use a comment to tag a
line on which we wish to place a breakpoint, e.g. the 'first breakpoint
here' line above.
I also wonder if using `abort()` here is the right approach.
You want to check the register values in the generated core file, not
just C level variables. Making a function call runs the risk that the
callee might touch some or all of these registers. I guess it's
unlikely for something as simple as abort(), but I wonder maybe, if
that's what's causing the problem your second patch is addressing?
Maybe it would be better to trigger the core file by reading from
address zero? We have a testsuite proc `is_address_zero_readable` which
can be used to gate such a test. I think it might be worth testing this
on the problematic machines you mention in the second patch to see if
this fixes the issue.
> +
> asm (
> "vmovaps %%ymm0, 0(%0)\n\t"
> "vmovaps %%ymm1, 32(%0)\n\t"
> diff --git a/gdb/testsuite/gdb.arch/i386-avx.exp b/gdb/testsuite/gdb.arch/i386-avx.exp
> index 1a786ee8a51..1740045427a 100644
> --- a/gdb/testsuite/gdb.arch/i386-avx.exp
> +++ b/gdb/testsuite/gdb.arch/i386-avx.exp
> @@ -42,12 +42,26 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \
> return
> }
>
> +# Check reading registers after the first breakpoint for ymm int8 and
> +# float types.
> +proc test_regs_first_bp {} {
> + for { set r 0 } { $r < $::nr_regs } { incr r } {
> + gdb_test "print \$ymm$r.v8_float" \
> + ".. = \\{$r, $r.125, $r.25, $r.375, $r.5, $r.625, $r.75, $r.875\\}.*" \
> + "check float contents of %ymm$r"
> + gdb_test "print \$ymm$r.v32_int8" \
> + ".. = \\{(-?${::decimal}, ){31}-?${::decimal}\\}.*" \
> + "check int8 contents of %ymm$r"
> + }
> +}
> clean_restart ${::testfile}
Add a blank line before the clean_restart line please.
>
> if {![runto_main]} {
> return
> }
>
> +gdb_test_no_output "set should_dump_core_p=0"
> +
> gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
> "Breakpoint .* at .*i386-avx.c.*" \
> "set first breakpoint in main"
> @@ -59,14 +73,7 @@ if {[is_amd64_regs_target]} {
> set nr_regs 8
> }
>
> -for { set r 0 } { $r < $nr_regs } { incr r } {
> - gdb_test "print \$ymm$r.v8_float" \
> - ".. = \\{$r, $r.125, $r.25, $r.375, $r.5, $r.625, $r.75, $r.875\\}.*" \
> - "check float contents of %ymm$r"
> - gdb_test "print \$ymm$r.v32_int8" \
> - ".. = \\{(-?${::decimal}, ){31}-?${::decimal}\\}.*" \
> - "check int8 contents of %ymm$r"
> -}
> +test_regs_first_bp
>
> for { set r 0 } { $r < $nr_regs } { incr r } {
> gdb_test "set var \$ymm$r.v8_float\[0\] = $r + 10" "" "set %ymm$r"
> @@ -100,9 +107,47 @@ with_test_prefix "force-disable xml descriptions" {
> return
> }
>
> + gdb_test_no_output "set should_dump_core_p=0"
> +
> # With qXfer:features:read disabled, we won't know anything
> # about YMM registers.
> gdb_test "print \$ymm0" " = void"
> gdb_test "print \$xmm0" "v4_float.*"
> }
> }
> +
> +# Restart gdb, load the corefile generated by gcore or the OS
> +# and check reading registers from the corefile.
> +proc test_corefile {core_filename} {
> + clean_restart $::testfile
> +
> + gdb_test "core $core_filename" "Core was generated by .*" \
> + "load corefile"
> +
> + test_regs_first_bp
> +}
> +
> +with_test_prefix "OS generated corefile" {
> + set corefile [core_find $binfile]
> + if { $corefile eq "" } {
> + unsupported "unable to generate core file"
> + } else {
> + test_corefile $corefile
> + }
> +}
> +
> +with_test_prefix "gcore corefile" {
> + clean_restart ${::testfile}
> + if { ![runto_main] } {
> + return
> + }
> +
> + set line [gdb_get_line_number "first breakpoint here"]
> + gdb_breakpoint $line
> + gdb_continue_to_breakpoint "first breakpoint here" ".*$srcfile:$line.*"
> +
> + set gcorefile $binfile.gcore
> + if { [gdb_gcore_cmd $gcorefile "save a corefile"] } {
> + test_corefile $gcorefile
> + }
> +}
> diff --git a/gdb/testsuite/gdb.arch/i386-avx512.c b/gdb/testsuite/gdb.arch/i386-avx512.c
> index b1e023ce4d4..d935fab50bc 100644
> --- a/gdb/testsuite/gdb.arch/i386-avx512.c
> +++ b/gdb/testsuite/gdb.arch/i386-avx512.c
> @@ -17,8 +17,11 @@
> You should have received a copy of the GNU General Public License
> along with this program. If not, see <http://www.gnu.org/licenses/>. */
>
> +#include <stdlib.h>
> #include "x86-cpuid.h"
>
> +volatile int should_dump_core_p = 1;
> +
> typedef struct
> {
> double f[8];
> @@ -233,6 +236,9 @@ main (int argc, char **argv)
> move_zmm_data_to_reg ();
> asm ("nop"); /* third breakpoint here */
>
> + if (should_dump_core_p) /* Crash for OS corefile. */
> + abort ();
Trailing comment again.
> +
> /* Test script incremented values,
> move back to array and check values. */
> move_zmm_data_to_memory ();
> diff --git a/gdb/testsuite/gdb.arch/i386-avx512.exp b/gdb/testsuite/gdb.arch/i386-avx512.exp
> index c79563366dc..6984c2280e9 100644
> --- a/gdb/testsuite/gdb.arch/i386-avx512.exp
> +++ b/gdb/testsuite/gdb.arch/i386-avx512.exp
> @@ -35,6 +35,8 @@ if {![runto_main]} {
> return
> }
>
> +gdb_test_no_output "set should_dump_core_p=0"
> +
> set supports_avx512 0
>
> set test "probe AVX512 support"
> @@ -181,3 +183,57 @@ gdb_test "print \$zmm0.v16_int32" "= {-1, -1, -1, -1, 0 <repeats 12 times>}"
> if { $nr_regs >= 16 } {
> gdb_test "print \$zmm16.v16_int32" "= {-1 <repeats 16 times>}"
> }
> +
> +# Test reading k and zmm registers and for double and int16 types.
> +proc test_regs_corefile {} {
> + for { set r 1 } { $r < 8 } { incr r } {
> + gdb_test "print/x \$k$r" \
> + ".. = 0x[format %x $r]2[format %x $r]1" \
> + "check contents of %k$r"
> + }
> +
> + for { set r 0 } { $r < $::nr_regs } { incr r } {
> + gdb_test "print \$zmm$r.v8_double" \
> + ".. = \\{$r, $r.125, $r.25, $r.375, $r.5, $r.625, $r.75, $r.875\\}.*" \
> + "check double contents of %zmm$r"
> + gdb_test "print \$zmm$r.v32_int16" \
> + ".. = \\{(-?${::decimal}, ){31}-?${::decimal}\\}.*" \
> + "check int16 contents of %zmm$r"
> + }
> +}
> +
> +# Restart gdb, load the corefile generated by gcore or the OS
> +# and check reading registers from the corefile.
> +proc test_corefile {core_filename} {
> + clean_restart $::testfile
> +
> + gdb_test "core $core_filename" "Core was generated by .*" \
> + "load corefile"
> +
> + test_regs_corefile
> +}
> +
> +with_test_prefix "OS generated corefile" {
> + set corefile [core_find $binfile]
> + if { $corefile eq "" } {
> + unsupported "unable to generate core file"
> + } else {
> + test_corefile $corefile
> + }
> +}
> +
> +with_test_prefix "gcore corefile" {
> + clean_restart ${::testfile}
> + if { ![runto_main] } {
> + return
> + }
> +
> + set line [gdb_get_line_number "third breakpoint here"]
> + gdb_breakpoint $line
> + gdb_continue_to_breakpoint "third breakpoint here" ".*$srcfile:$line.*"
> +
> + set gcorefile $binfile.gcore
> + if { [gdb_gcore_cmd $gcorefile "save a corefile"] } {
> + test_corefile $gcorefile
> + }
> +}
> diff --git a/gdb/testsuite/gdb.arch/i386-pkru.c b/gdb/testsuite/gdb.arch/i386-pkru.c
> index 9561d1e923a..e316ca90bba 100644
> --- a/gdb/testsuite/gdb.arch/i386-pkru.c
> +++ b/gdb/testsuite/gdb.arch/i386-pkru.c
> @@ -18,12 +18,15 @@
> along with this program. If not, see <http://www.gnu.org/licenses/>. */
>
> #include <stddef.h>
> +#include <stdlib.h>
> #include "x86-cpuid.h"
>
> #ifndef NOINLINE
> #define NOINLINE __attribute__ ((noinline))
> #endif
>
> +volatile int should_dump_core_p = 1;
> +
> unsigned int have_pkru (void) NOINLINE;
>
> static inline unsigned long
> @@ -83,6 +86,9 @@ main (int argc, char **argv)
> wrpkru (wr_value);
> asm ("nop\n\t"); /* break here 1. */
>
> + if (should_dump_core_p) /* Crash for OS corefile. */
> + abort ();
Trailing comment again.
Thanks,
Andrew
next prev parent reply other threads:[~2026-09-07 10:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-04 10:06 [PATCH 0/2] Problem with linux corefiles for CPUs " Christina Joos
2026-09-04 10:06 ` [PATCH 1/2] gdb: Enable OS generated corefiles on systems " Christina Joos
2026-09-07 10:05 ` Andrew Burgess [this message]
2026-09-08 13:28 ` Joos, Christina
2026-09-11 16:45 ` Joos, Christina
2026-09-04 10:06 ` [PATCH 2/2] gdb, testsuite: Handle unexpected PRKU value in linux corefiles Christina Joos
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=87tso1qsuh.fsf@redhat.com \
--to=aburgess@redhat.com \
--cc=christina.joos@intel.com \
--cc=gdb-patches@sourceware.org \
/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