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 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,
|
||||
.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()
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user