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 | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 938c990854..091a517a93 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -734,6 +734,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 d41da414b3..416fe1b7be 100644 --- a/target/arm/machine.c +++ b/target/arm/machine.c @@ -320,6 +320,26 @@ static const VMStateDescription vmstate_za = { VMSTATE_END_OF_LIST() } }; + +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() + } +}; + #endif /* AARCH64 */ static bool serror_needed(void *opaque) @@ -1104,6 +1124,7 @@ const VMStateDescription vmstate_arm_cpu = { #ifdef TARGET_AARCH64 &vmstate_sve, &vmstate_za, + &vmstate_zt0, #endif &vmstate_serror, &vmstate_irq_line_state, -- 2.43.0