[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v3 09/49] pckbd: adding new fields to vmstate
From: |
Pavel Dovgalyuk |
Subject: |
[Qemu-devel] [RFC PATCH v3 09/49] pckbd: adding new fields to vmstate |
Date: |
Thu, 31 Jul 2014 16:54:18 +0400 |
User-agent: |
StGit/0.16 |
This patch adds outport to VMState to allow correct saving and restoring
the state of PC keyboard controller.
Signed-off-by: Pavel Dovgalyuk <address@hidden>
---
hw/input/pckbd.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 52 insertions(+), 1 deletions(-)
diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
index ca1cffc..821f6f9 100644
--- a/hw/input/pckbd.c
+++ b/hw/input/pckbd.c
@@ -131,6 +131,7 @@ typedef struct KBDState {
uint8_t status;
uint8_t mode;
uint8_t outport;
+ bool outport_present;
/* Bitmask of devices with data available. */
uint8_t pending;
void *kbd;
@@ -367,18 +368,68 @@ static void kbd_reset(void *opaque)
s->mode = KBD_MODE_KBD_INT | KBD_MODE_MOUSE_INT;
s->status = KBD_STAT_CMD | KBD_STAT_UNLOCKED;
s->outport = KBD_OUT_RESET | KBD_OUT_A20;
+ s->outport_present = false;
+}
+
+static uint8_t kbd_outport_default(KBDState *s)
+{
+ return KBD_OUT_RESET | KBD_OUT_A20
+ | (s->status & KBD_STAT_OBF ? KBD_OUT_OBF : 0)
+ | (s->status & KBD_STAT_MOUSE_OBF ? KBD_OUT_MOUSE_OBF : 0);
+}
+
+static int kbd_outport_post_load(void *opaque, int version_id)
+{
+ KBDState *s = opaque;
+ s->outport_present = true;
+ return 0;
+}
+
+static const VMStateDescription vmstate_kbd_outport = {
+ .name = "pckbd_outport",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .post_load = kbd_outport_post_load,
+ .fields = (VMStateField[]) {
+ VMSTATE_UINT8(outport, KBDState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
+static bool kbd_outport_needed(void *opaque)
+{
+ KBDState *s = opaque;
+ return s->outport != kbd_outport_default(s);
+}
+
+static int kbd_post_load(void *opaque, int version_id)
+{
+ KBDState *s = opaque;
+ if (!s->outport_present) {
+ s->outport = kbd_outport_default(s);
+ }
+ s->outport_present = false;
+ return 0;
}
static const VMStateDescription vmstate_kbd = {
.name = "pckbd",
- .version_id = 3,
+ .version_id = 4,
.minimum_version_id = 3,
+ .post_load = kbd_post_load,
.fields = (VMStateField[]) {
VMSTATE_UINT8(write_cmd, KBDState),
VMSTATE_UINT8(status, KBDState),
VMSTATE_UINT8(mode, KBDState),
VMSTATE_UINT8(pending, KBDState),
VMSTATE_END_OF_LIST()
+ },
+ .subsections = (VMStateSubsection[]) {
+ {
+ .vmsd = &vmstate_kbd_outport,
+ .needed = kbd_outport_needed,
+ },
+ VMSTATE_END_OF_LIST()
}
};
- [Qemu-devel] [RFC PATCH v3 02/49] integratorcp: adding vmstate for save/restore, (continued)
- [Qemu-devel] [RFC PATCH v3 02/49] integratorcp: adding vmstate for save/restore, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 03/49] pcspk: adding vmstate for save/restore, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 04/49] fdc: adding vmstate for save/restore, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 05/49] parallel: adding vmstate for save/restore, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 06/49] serial: fixing vmstate for save/restore, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 07/49] kvmapic: fixing loading vmstate, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 08/49] hpet: fixing saving and loading process, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 09/49] pckbd: adding new fields to vmstate,
Pavel Dovgalyuk <=
- [Qemu-devel] [RFC PATCH v3 10/49] rtl8139: adding new fields to vmstate, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 11/49] piix: do not raise irq while loading vmstate, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 12/49] mc146818rtc: add missed field to vmstate, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 13/49] pl031: add missed field to vmstate, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 14/49] ide pci: reset status field before loading the vmstate, Pavel Dovgalyuk, 2014/07/31
- [Qemu-devel] [RFC PATCH v3 15/49] softmmu: fixing usage of cpu_st/ld* from helpers, Pavel Dovgalyuk, 2014/07/31