Manos Pitsidianakis <manos.pitsidiana...@linaro.org> writes: > On Fri, Aug 1, 2025 at 4:33 PM Peter Maydell <peter.mayd...@linaro.org> wrote: >> >> On Thu, 31 Jul 2025 at 21:34, Pierrick Bouvier >> <pierrick.bouv...@linaro.org> wrote: >> > >> > On 7/27/25 1:02 AM, Richard Henderson wrote: >> > > diff --git a/target/arm/gdbstub64.c b/target/arm/gdbstub64.c >> > > index 64ee9b3b56..3cef47281a 100644 >> > > --- a/target/arm/gdbstub64.c >> > > +++ b/target/arm/gdbstub64.c >> > > @@ -47,6 +47,7 @@ int aarch64_cpu_gdb_read_register(CPUState *cs, >> > > GByteArray *mem_buf, int n) >> > > case 32: >> > > return gdb_get_reg64(mem_buf, env->pc); >> > > case 33: >> > > + /* pstate is now a 64-bit value; can we simply adjust the xml? >> > > */ >> > > return gdb_get_reg32(mem_buf, pstate_read(env)); >> > > } >> > >> > If I'm correct, we currently don't expose PSTATE through gdbstub, but >> > only CPSR. This was a bit confusing for me, considering that CPSR is not >> > even supposed to exist in Aarch64. >> > Maybe it's a good opportunity to expose PSTATE instead, which could have >> > a 64 bits size. This way, we don't break any workflow. >> >> Architecturally, PSTATE is simply an abstract bundling together of >> different information: it is not a particular format of a value, >> whether 32 or 64 bit or otherwise. (This makes it different to >> AArch32 CPSR, which really is a guest-visible register.) >> >> The thing that *is* defined architecturally is the SPSR_ELx format, which >> is where various bits of PSTATE get saved when reporting an exception up >> to a higher exception level (and which is pretty much the AArch32 CPSR >> format when the lower EL is AArch32). (Note that not *all* of PSTATE >> appears in the SPSR_ELx: for example the SME SM and ZA bits are >> considered part of PSTATE but they aren't saved into SPSR_ELx.) >> >> For convenience, various pieces of software pass around information >> in that SPSR_ELx format. Calling this either "CPSR" or "PSTATE" >> is not really correct, but either is perhaps less confusing than >> calling it SPSR when the context is that of the code running at the >> lower EL rather than the higher. >> >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/include/asm/kgdb.h#n41 >> suggests that expanding the existing pstate to 64 bits is probably >> likely to produce problems. Perhaps we should define a pstate_high >> or something for the top 32 bits? >> > > IIUC, this is only a problem if you use the default gdb architecture > register map, but QEMU ships its own as part of gdbstub, so it's free > to change register definition of cspr. Or add a new PSTATE register.
That is correct. The kgdb.h comment also mentions this: * Note that if you are using one of the versions of gdb that supports * the gdb-7.7 version of the protocol you cannot use kgdb directly * without providing a custom register description (gdb can load new * protocol descriptions at runtime). "providing a custom register description" is the manual procedure the user can perform that is equivalent to the gdbstub sending its own register map XML ("target description" in GDB parlance) to GDB, as the QEMU gdbstub does. I checked and the only places where GDB hardcodes the CPSR size is in Linux and FreeBSD specific code, when reading or writing a core file because in that case the size is defined by the OS. Note that the CPSR position in the register map is hardcoded, defining its register number as 33. -- Thiago