On 16/11/23 16:48, Juan Quintela wrote:
Richard Henderson <richard.hender...@linaro.org> wrote:
On 11/9/23 11:28, Philippe Mathieu-Daudé wrote:
@@ -436,6 +438,24 @@ static const VMStateDescription vmstate_pl011_clock = {
       }
   };
   +static bool pl011_xmit_fifo_state_needed(void *opaque)
+{
+    PL011State* s = opaque;
+
+    return !fifo8_is_empty(&s->xmit_fifo);
+}
+
+static const VMStateDescription vmstate_pl011_xmit_fifo = {
+    .name = "pl011/xmit_fifo",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .needed = pl011_xmit_fifo_state_needed,
+    .fields = (VMStateField[]) {
+        VMSTATE_FIFO8(xmit_fifo, PL011State),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
   static int pl011_post_load(void *opaque, int version_id)
   {
       PL011State* s = opaque;
@@ -487,7 +507,11 @@ static const VMStateDescription vmstate_pl011 = {
       .subsections = (const VMStateDescription * []) {
           &vmstate_pl011_clock,
           NULL
-    }
+    },
+    .subsections = (const VMStateDescription * []) {
+        &vmstate_pl011_xmit_fifo,
+        NULL
+    },
   };

It just occurred to me that you may need a vmstate_pl011 pre_load() to
empty the FIFO, which will then be filled if and only if the saved
vmstate_pl011_xmit_fifo subsection is present.

Juan, have I got this correct about how migration would or should handle a 
missing subsection?

I hav'nt looked about how the device is created. But if it is created
with the fifo empty you don't need the pre_load().

This is indeed the case. Thank you Juan!


Reply via email to