pckbd: adding new fields to vmstate
This patch adds outport to VMState to allow correct saving and restoring the state of PC keyboard controller. Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
0b102153e0
commit
a28fe7e3f6
@ -131,6 +131,7 @@ typedef struct KBDState {
|
|||||||
uint8_t status;
|
uint8_t status;
|
||||||
uint8_t mode;
|
uint8_t mode;
|
||||||
uint8_t outport;
|
uint8_t outport;
|
||||||
|
bool outport_present;
|
||||||
/* Bitmask of devices with data available. */
|
/* Bitmask of devices with data available. */
|
||||||
uint8_t pending;
|
uint8_t pending;
|
||||||
void *kbd;
|
void *kbd;
|
||||||
@ -367,18 +368,68 @@ static void kbd_reset(void *opaque)
|
|||||||
s->mode = KBD_MODE_KBD_INT | KBD_MODE_MOUSE_INT;
|
s->mode = KBD_MODE_KBD_INT | KBD_MODE_MOUSE_INT;
|
||||||
s->status = KBD_STAT_CMD | KBD_STAT_UNLOCKED;
|
s->status = KBD_STAT_CMD | KBD_STAT_UNLOCKED;
|
||||||
s->outport = KBD_OUT_RESET | KBD_OUT_A20;
|
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 = {
|
static const VMStateDescription vmstate_kbd = {
|
||||||
.name = "pckbd",
|
.name = "pckbd",
|
||||||
.version_id = 3,
|
.version_id = 3,
|
||||||
.minimum_version_id = 3,
|
.minimum_version_id = 3,
|
||||||
|
.post_load = kbd_post_load,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_UINT8(write_cmd, KBDState),
|
VMSTATE_UINT8(write_cmd, KBDState),
|
||||||
VMSTATE_UINT8(status, KBDState),
|
VMSTATE_UINT8(status, KBDState),
|
||||||
VMSTATE_UINT8(mode, KBDState),
|
VMSTATE_UINT8(mode, KBDState),
|
||||||
VMSTATE_UINT8(pending, KBDState),
|
VMSTATE_UINT8(pending, KBDState),
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
|
},
|
||||||
|
.subsections = (VMStateSubsection[]) {
|
||||||
|
{
|
||||||
|
.vmsd = &vmstate_kbd_outport,
|
||||||
|
.needed = kbd_outport_needed,
|
||||||
|
},
|
||||||
|
VMSTATE_END_OF_LIST()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user