Loading hw/input/pckbd.c +51 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
hw/input/pckbd.c +51 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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