On 21/05/2018 16:03, Peter Maydell wrote: > + * VMState array; devices with more inputs than this need to > + * migrate the extra lines via a subsection. > + * The subsection migrates as much of the levels[] array as is needed > + * (including repeating the first 16 elements), to avoid the awkwardness > + * of splitting it in two to meet the requirements of VMSTATE_VARRAY_UINT16. > + */ > +#define OLD_MAX_OR_LINES 16 > +#if MAX_OR_LINES < OLD_MAX_OR_LINES > +#error MAX_OR_LINES must be at least 16 for migration compatibility > +#endif > + > +static bool vmstate_extras_needed(void *opaque) > +{ > + qemu_or_irq *s = OR_IRQ(opaque); > + > + return s->num_lines >= OLD_MAX_OR_LINES; > +} > + > +static const VMStateDescription vmstate_or_irq_extras = { > + .name = "or-irq-extras", > + .version_id = 1, > + .minimum_version_id = 1, > + .needed = vmstate_extras_needed, > + .fields = (VMStateField[]) { > + VMSTATE_VARRAY_UINT16_UNSAFE(levels, qemu_or_irq, num_lines, 0, > + vmstate_info_bool, bool), > + VMSTATE_END_OF_LIST(), > + }, > +}; > +
Why do the levels have to be migrated at all? It should be enough if the IRQ level is either migrated manually, or restored (e.g. in post_save callbacks) through other data that is migrated. Paolo