On Sun, 22 Jun 2025 at 00:55, Richard Henderson <richard.hender...@linaro.org> wrote: > > This is a 512-bit array introduced with SME2. > Save it only when ZA is in use. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > target/arm/cpu.h | 3 +++ > target/arm/machine.c | 20 ++++++++++++++++++++ > 2 files changed, 23 insertions(+) > > diff --git a/target/arm/cpu.h b/target/arm/cpu.h > index 052ca20283..465fc188d0 100644 > --- a/target/arm/cpu.h > +++ b/target/arm/cpu.h > @@ -715,6 +715,9 @@ typedef struct CPUArchState { > uint64_t scxtnum_el[4]; > > struct { > + /* SME2 ZT0 -- 512 bit array, with data ordered like ARMVectorReg. */ > + uint64_t zt0[512 / 64] QEMU_ALIGNED(16); > + > /* > * SME ZA storage -- 256 x 256 byte array, with bytes in host > * word order, as we do with vfp.zregs[]. This corresponds to > diff --git a/target/arm/machine.c b/target/arm/machine.c > index 6e73368ef9..6986915bee 100644 > --- a/target/arm/machine.c > +++ b/target/arm/machine.c > @@ -321,6 +321,25 @@ static const VMStateDescription vmstate_za = { > } > }; > > +static bool zt0_needed(void *opaque) > +{ > + ARMCPU *cpu = opaque; > + > + return za_needed(cpu) && cpu_isar_feature(aa64_sme2, cpu); > +} > + > +static const VMStateDescription vmstate_zt0 = { > + .name = "cpu/zt0", > + .version_id = 1, > + .minimum_version_id = 1, > + .needed = zt0_needed, > + .fields = (VMStateField[]) { > + VMSTATE_UINT64_ARRAY(env.za_state.zt0, ARMCPU, > + ARRAY_SIZE(((CPUARMState *)0)->za_state.zt0)), > + VMSTATE_END_OF_LIST() > + } > +};
I wonder if we should have an ARRAY_FIELD_SIZE(), to do the equivalent of sizeof_field()... Though we have no uses of the written-out form currently, so it might be a bit too niche. Anyway Reviewed-by: Peter Maydell <peter.mayd...@linaro.org> thanks -- PMM