This change (now commit 06fd39e4) fixes a bug in a commit that
is in the 11.0.0 release. Unfortunately I forgot to mark it
as Cc: stable when committing it.

Could we cherry-pick 06fd39e4 into the 11.0.x stable branch,
please?

(This just got re-reported as
https://gitlab.com/qemu-project/qemu/-/work_items/3565 )

thanks
-- PMM


On Fri, 15 May 2026 at 11:49, Peter Maydell <[email protected]> wrote:
>
> From: "Scott J. Goldman" <[email protected]>
>
> Commit ab2ddc7b66 ("target/arm/machine: Use VMSTATE_VARRAY_INT32_ALLOC
> for cpreg arrays") moved cpreg_vmstate_indexes / cpreg_vmstate_values
> to be allocated by VMSTATE_VARRAY_INT32_ALLOC and added an assertion
> in cpu_pre_load() that they are NULL on entry. The same commit dropped
> the redundant g_renew()/array_len assignments from the kvm, whpx and
> helper.c cpu init paths, but the hvf cpu init path still pre-allocates
> them.
>
> The result is that loading a snapshot or migration stream into an HVF
> guest immediately aborts:
>
>     ERROR:target/arm/machine.c:1043:cpu_pre_load:
>         assertion failed: (!cpu->cpreg_vmstate_indexes)
>
> Drop the leftover cpreg_vmstate_indexes / cpreg_vmstate_values
> allocations and the cpreg_vmstate_array_len assignment from
> hvf_arch_init_vcpu(), matching what was already done for the other
> arm accelerators.
>
> Signed-off-by: Scott J. Goldman <[email protected]>
> Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
> Signed-off-by: Peter Maydell <[email protected]>
> ---
>  target/arm/hvf/hvf.c | 7 -------
>  1 file changed, 7 deletions(-)
>
> diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
> index 5a1718f7f9..9312607001 100644
> --- a/target/arm/hvf/hvf.c
> +++ b/target/arm/hvf/hvf.c
> @@ -1412,12 +1412,6 @@ int hvf_arch_init_vcpu(CPUState *cpu)
>                                       sregs_match_len);
>      arm_cpu->cpreg_values = g_renew(uint64_t, arm_cpu->cpreg_values,
>                                      sregs_match_len);
> -    arm_cpu->cpreg_vmstate_indexes = g_renew(uint64_t,
> -                                             arm_cpu->cpreg_vmstate_indexes,
> -                                             sregs_match_len);
> -    arm_cpu->cpreg_vmstate_values = g_renew(uint64_t,
> -                                            arm_cpu->cpreg_vmstate_values,
> -                                            sregs_match_len);
>
>      memset(arm_cpu->cpreg_values, 0, sregs_match_len * sizeof(uint64_t));
>
> @@ -1462,7 +1456,6 @@ int hvf_arch_init_vcpu(CPUState *cpu)
>          }
>      }
>      arm_cpu->cpreg_array_len = sregs_cnt;
> -    arm_cpu->cpreg_vmstate_array_len = sregs_cnt;
>
>      /* cpreg tuples must be in strictly ascending order */
>      qsort(arm_cpu->cpreg_indexes, sregs_cnt, sizeof(uint64_t), compare_u64);
> --
> 2.43.0

Reply via email to