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