Re: Question about gdb expectations on SME ZA storage

Luis via Gdb <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
Hi Vacha,

On 8/5/25 22:23, Vacha Bhavsar via Gdb wrote:
> Hi,
> 
> I am developing a patch for QEMU which would allow QEMU to expose
> SME registers, such as the ZA storage, via is gdbstub to a remote
> gdb client session.
> 
> The change that I have suggested and the discussion regarding it
> can be found here:
> 
> https://lists.gnu.org/archive/html/qemu-devel/2025-08/msg00716.html
> https://lists.gnu.org/archive/html/qemu-devel/2025-08/msg00733.html
> https://lists.gnu.org/archive/html/qemu-devel/2025-08/msg00748.html
> https://lists.gnu.org/archive/html/qemu-devel/2025-08/msg00749.html

That's a good addition. Thanks for pursuing it.

> 
> The main issue I was facing was that when we attempt to set the
> value of the za register, and the gdb client sends out a P packet
> as large as the entire za register, the gdb client gets stuck and
> doesn't return a prompt, until the timeout is hit.
> 
> My understanding is that the current implementation of QEMU, which is
> similar to the sample stub code provided in sparc-stub.c, has too small
> a value for MAX_PACKET_LENGTH (analogous to BUFMAX from sparc-stub.c).
> Due to this, when the stub has read MAX_PACKET_LENGTH bytes without
> having hit a checksum, it resets the state machine and begins waiting
> for the beginning of a command again, as is the case in the sparc
> example provided in gdb. Thus, I have found that appropriately increasing
> the value of MAX_PACKET_LENGTH to encompass the full size of the za storage
> resolves this issue.

Right, there is a similar change that has been done to gdbserver to 
handle such a large register. In the following commit, you can see where 
the PBUFSIZ constant was bumped to a much bigger value:

https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=b816042e88583f280ad186ff124ab84d31fb592b

> 
> However, there is discussion as to whether there is an underlying issue
> of something like not indicating to the gdb client that there is more data
> and it must be requested. This discussion can be found at the link provided
> above.
> 
> So, I was hoping to get some guidance on how gdb expects the SME ZA storage
> to be handled and if any of the above mentioned approaches would be
> appropriate for a gdbstub to handle the SME ZA storage.

The problem here is that the register fetch/store packets (G/g or P/p) 
don't support partial transfers. With register increasing in size (in 
particular vector registers), it might be sensible to handle this in the 
future and have register fetch/store packets that support partial transfers.

For now, I think the correct solution for your SME implementation for 
the QEMU gdbstub is to increase the buffer size for the G/g P/p packets. 
And you've done that.

It is worth mentioning two things...

1 - Make sure you check the gdb documentation here 
(https://sourceware.org/gdb/current/onlinedocs/gdb#AArch64-SME-registers-feature) 
and report the correct SME/SME2 feature XML. That way gdb can spot the 
XML features and enable additional features internally.

2 - Please be aware that gdb does not support changing the SVE/SME 
vector length mid-execution when connected to a remote gdbstub, so that 
includes QEMU's gdbstub. If the vector length changes mid-execution, gdb 
will not notice the change and gdb and the gdbstub will have differing 
ideas of what the SVE/SME register sizes are.

A fix for this is being pursued by the community, but it is not yet ready.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.