diff mbox

Save/load PC speaker internal state

Message ID 000001cd844e$7747c480$65d74d80$@Dovgaluk@ispras.ru
State New
Headers show

Commit Message

Pavel Dovgalyuk Aug. 27, 2012, 12:21 p.m. UTC
Save PC speaker state to remove differences between system
states after saving the snapshot and after loading it again.
This patch is needed for deterministic replay of the execution.

Signed-off-by: Pavel Dovgalyuk<pavel.dovgaluk@gmail.com>
---
 hw/pcspk.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

Comments

Andreas Färber Aug. 27, 2012, 4:39 p.m. UTC | #1
Am 27.08.2012 14:21, schrieb Pavel Dovgaluk:
> Save PC speaker state to remove differences between system
> states after saving the snapshot and after loading it again.
> This patch is needed for deterministic replay of the execution.
> 
> Signed-off-by: Pavel Dovgalyuk<pavel.dovgaluk@gmail.com>
> ---
>  hw/pcspk.c |   18 ++++++++++++++++++
>  1 files changed, 18 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/pcspk.c b/hw/pcspk.c
> index e430324..3fb3dd1 100644
> --- a/hw/pcspk.c
> +++ b/hw/pcspk.c
> @@ -159,10 +159,28 @@ static const MemoryRegionOps pcspk_io_ops = {
>      },
>  };
>  
> +static const VMStateDescription vmstate_spk = {
> +    .name = "pcspk",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .minimum_version_id_old = 1,
> +    .fields      = (VMStateField[]) {
> +        VMSTATE_UINT8_ARRAY(sample_buf, PCSpkState, PCSPK_BUF_LEN),
> +        VMSTATE_UINT32(pit_count, PCSpkState),
> +        VMSTATE_UINT32(samples, PCSpkState),
> +        VMSTATE_UINT32(play_pos, PCSpkState),
> +        VMSTATE_INT32(data_on, PCSpkState),
> +        VMSTATE_INT32(dummy_refresh_clock, PCSpkState),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
>  static int pcspk_initfn(ISADevice *dev)
>  {
>      PCSpkState *s = DO_UPCAST(PCSpkState, dev, dev);
>  
> +    vmstate_register(NULL, 0, &vmstate_spk, s);
> +
>      memory_region_init_io(&s->ioport, &pcspk_io_ops, s, "elcr", 1);
>      isa_register_ioport(dev, &s->ioport, s->iobase);
> 

What about pc-1.0 etc. machines? Does this need to be backported to
stable branches first for migration from v1.2 to work? Or is such
incoming excess data silently ignored? Or any compat magic required on top?

Andreas
Juan Quintela Aug. 28, 2012, 11:23 a.m. UTC | #2
Andreas Färber <afaerber@suse.de> wrote:
> Am 27.08.2012 14:21, schrieb Pavel Dovgaluk:
>> Save PC speaker state to remove differences between system
>> states after saving the snapshot and after loading it again.
>> This patch is needed for deterministic replay of the execution.
>> 
>
> What about pc-1.0 etc. machines? Does this need to be backported to
> stable branches first for migration from v1.2 to work? Or is such
> incoming excess data silently ignored? Or any compat magic required on top?

Is there a way to detect if we have ever used the speaker?  Otherwise,
it is difficult to know if we should sent it or not.

Later, Juan.
diff mbox

Patch

diff --git a/hw/pcspk.c b/hw/pcspk.c
index e430324..3fb3dd1 100644
--- a/hw/pcspk.c
+++ b/hw/pcspk.c
@@ -159,10 +159,28 @@  static const MemoryRegionOps pcspk_io_ops = {
     },
 };
 
+static const VMStateDescription vmstate_spk = {
+    .name = "pcspk",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields      = (VMStateField[]) {
+        VMSTATE_UINT8_ARRAY(sample_buf, PCSpkState, PCSPK_BUF_LEN),
+        VMSTATE_UINT32(pit_count, PCSpkState),
+        VMSTATE_UINT32(samples, PCSpkState),
+        VMSTATE_UINT32(play_pos, PCSpkState),
+        VMSTATE_INT32(data_on, PCSpkState),
+        VMSTATE_INT32(dummy_refresh_clock, PCSpkState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 static int pcspk_initfn(ISADevice *dev)
 {
     PCSpkState *s = DO_UPCAST(PCSpkState, dev, dev);
 
+    vmstate_register(NULL, 0, &vmstate_spk, s);
+
     memory_region_init_io(&s->ioport, &pcspk_io_ops, s, "elcr", 1);
     isa_register_ioport(dev, &s->ioport, s->iobase);