X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fcga.c;h=00816095dad23e49629feed59b0fb773d0fa4495;hp=79978189269f99972398ca6a3c07b7553ae527ad;hb=5d1bbcc86de011e3f0d115b6f10fd8645cdf855e;hpb=a9a6c3664c8fdbdb9841a55d1a2fca7f4fa8f5de diff --git a/palacios/src/devices/cga.c b/palacios/src/devices/cga.c index 7997818..0081609 100644 --- a/palacios/src/devices/cga.c +++ b/palacios/src/devices/cga.c @@ -1097,7 +1097,7 @@ int v3_cons_get_fb(struct vm_device * frontend_dev, uint8_t * dst, uint_t offset } } -static int free_cga(struct video_internal * video_state) { +static int cga_free(struct video_internal * video_state) { if (video_state->framebuf_pa) { PrintError("Freeing framebuffer PA %p\n", (void *)(video_state->framebuf_pa)); @@ -1112,8 +1112,89 @@ static int free_cga(struct video_internal * video_state) { } +#ifdef V3_CONFIG_CHECKPOINT +static int cga_save(struct v3_chkpt_ctx * ctx, void * private_data) { + struct video_internal * cga = (struct video_internal *)private_data; + + V3_CHKPT_STD_SAVE(ctx, cga->misc_outp_reg); + V3_CHKPT_STD_SAVE(ctx, cga->seq_index_reg); + V3_CHKPT_STD_SAVE(ctx, cga->seq_data_regs[SEQ_REG_COUNT]); + V3_CHKPT_STD_SAVE(ctx, cga->crtc_index_reg); + V3_CHKPT_STD_SAVE(ctx, cga->crtc_data_regs[CRTC_REG_COUNT]); + V3_CHKPT_STD_SAVE(ctx, cga->graphc_index_reg); + V3_CHKPT_STD_SAVE(ctx, cga->graphc_data_regs[GRAPHC_REG_COUNT]); + V3_CHKPT_STD_SAVE(ctx, cga->attrc_index_flipflop); + V3_CHKPT_STD_SAVE(ctx, cga->attrc_index_reg); + V3_CHKPT_STD_SAVE(ctx, cga->attrc_data_regs[ATTRC_REG_COUNT]); + V3_CHKPT_STD_SAVE(ctx, cga->dac_indexr_reg); + V3_CHKPT_STD_SAVE(ctx, cga->dac_indexr_color); + V3_CHKPT_STD_SAVE(ctx, cga->dac_indexw_reg); + V3_CHKPT_STD_SAVE(ctx, cga->dac_indexw_color); + V3_CHKPT_STD_SAVE(ctx, cga->dac_data_regs[DAC_REG_COUNT]); + + V3_CHKPT_STD_SAVE(ctx, cga->activefb_addr); + V3_CHKPT_STD_SAVE(ctx, cga->activefb_len); + V3_CHKPT_STD_SAVE(ctx, cga->iorange); + V3_CHKPT_STD_SAVE(ctx, cga->vres); + V3_CHKPT_STD_SAVE(ctx, cga->hres); + V3_CHKPT_STD_SAVE(ctx, cga->vchars); + V3_CHKPT_STD_SAVE(ctx, cga->hchars); + V3_CHKPT_STD_SAVE(ctx, cga->graphmode); + + V3_CHKPT_STD_SAVE(ctx, cga->dirty); + V3_CHKPT_STD_SAVE(ctx, cga->reschanged); + + V3_CHKPT_STD_SAVE(ctx, cga->passthrough); + + return 0; +} + +static int cga_load(struct v3_chkpt_ctx * ctx, void * private_data) { + struct video_internal * cga = (struct video_internal *)private_data; + + V3_CHKPT_STD_LOAD(ctx, cga->misc_outp_reg); + V3_CHKPT_STD_LOAD(ctx, cga->seq_index_reg); + V3_CHKPT_STD_LOAD(ctx, cga->seq_data_regs[SEQ_REG_COUNT]); + V3_CHKPT_STD_LOAD(ctx, cga->crtc_index_reg); + V3_CHKPT_STD_LOAD(ctx, cga->crtc_data_regs[CRTC_REG_COUNT]); + V3_CHKPT_STD_LOAD(ctx, cga->graphc_index_reg); + V3_CHKPT_STD_LOAD(ctx, cga->graphc_data_regs[GRAPHC_REG_COUNT]); + V3_CHKPT_STD_LOAD(ctx, cga->attrc_index_flipflop); + V3_CHKPT_STD_LOAD(ctx, cga->attrc_index_reg); + V3_CHKPT_STD_LOAD(ctx, cga->attrc_data_regs[ATTRC_REG_COUNT]); + V3_CHKPT_STD_LOAD(ctx, cga->dac_indexr_reg); + V3_CHKPT_STD_LOAD(ctx, cga->dac_indexr_color); + V3_CHKPT_STD_LOAD(ctx, cga->dac_indexw_reg); + V3_CHKPT_STD_LOAD(ctx, cga->dac_indexw_color); + V3_CHKPT_STD_LOAD(ctx, cga->dac_data_regs[DAC_REG_COUNT]); + + V3_CHKPT_STD_LOAD(ctx, cga->activefb_addr); + V3_CHKPT_STD_LOAD(ctx, cga->activefb_len); + V3_CHKPT_STD_LOAD(ctx, cga->iorange); + V3_CHKPT_STD_LOAD(ctx, cga->vres); + V3_CHKPT_STD_LOAD(ctx, cga->hres); + V3_CHKPT_STD_LOAD(ctx, cga->vchars); + V3_CHKPT_STD_LOAD(ctx, cga->hchars); + V3_CHKPT_STD_LOAD(ctx, cga->graphmode); + + V3_CHKPT_STD_LOAD(ctx, cga->dirty); + V3_CHKPT_STD_LOAD(ctx, cga->reschanged); + + V3_CHKPT_STD_LOAD(ctx, cga->passthrough); + + return 0; +} + +#endif + + static struct v3_device_ops dev_ops = { - .free = (int (*)(void *))free_cga, + .free = (int (*)(void *))cga_free, +#ifdef V3_CONFIG_CHECKPOINT + .save = cga_save, + .load = cga_load +#endif + }; static int cga_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {