X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8259a.c;h=51037917fbd9df465fcd87d6c96a4d3e16d6374d;hp=69707b901522115e36efdf0c84d8ac80a8c3719a;hb=5d1bbcc86de011e3f0d115b6f10fd8645cdf855e;hpb=6d6988cc9c8bac21d96afd800076afe0915cf2cd diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index 69707b9..5103791 100644 --- a/palacios/src/devices/8259a.c +++ b/palacios/src/devices/8259a.c @@ -23,8 +23,9 @@ #include #include #include +#include -#ifndef CONFIG_DEBUG_PIC +#ifndef V3_CONFIG_DEBUG_PIC #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -155,6 +156,12 @@ struct pic_internal { pic_state_t master_state; pic_state_t slave_state; + + struct guest_info * core; + + + void * router_handle; + void * controller_handle; }; @@ -209,7 +216,9 @@ static int pic_raise_intr(struct v3_vm_info * vm, void * private_data, int irq) return -1; } +#ifdef V3_CONFIG_MULTITHREAD_OS v3_interrupt_cpu(vm, 0, 0); +#endif return 0; } @@ -718,33 +727,111 @@ static int write_elcr_port(struct guest_info * core, ushort_t port, void * src, +static int pic_free(struct pic_internal * state) { + struct guest_info * core = state->core; + v3_remove_intr_controller(core, state->controller_handle); + v3_remove_intr_router(core->vm_info, state->router_handle); + V3_Free(state); + return 0; +} -static int pic_free(struct pic_internal * state) { +#ifdef V3_CONFIG_CHECKPOINT +static int pic_save(struct v3_chkpt_ctx * ctx, void * private_data) { + struct pic_internal * pic = (struct pic_internal *)private_data; + + V3_CHKPT_STD_SAVE(ctx, pic->master_irr); + V3_CHKPT_STD_SAVE(ctx, pic->slave_irr); + + V3_CHKPT_STD_SAVE(ctx, pic->master_isr); + V3_CHKPT_STD_SAVE(ctx, pic->slave_isr); + V3_CHKPT_STD_SAVE(ctx, pic->master_elcr); + V3_CHKPT_STD_SAVE(ctx, pic->slave_elcr); + V3_CHKPT_STD_SAVE(ctx, pic->master_elcr_mask); + V3_CHKPT_STD_SAVE(ctx, pic->slave_elcr_mask); - // unregister intr_controller - // unregister intr router + V3_CHKPT_STD_SAVE(ctx, pic->master_icw1); + V3_CHKPT_STD_SAVE(ctx, pic->master_icw2); + V3_CHKPT_STD_SAVE(ctx, pic->master_icw3); + V3_CHKPT_STD_SAVE(ctx, pic->master_icw4); - V3_Free(state); + + V3_CHKPT_STD_SAVE(ctx, pic->slave_icw1); + V3_CHKPT_STD_SAVE(ctx, pic->slave_icw2); + V3_CHKPT_STD_SAVE(ctx, pic->slave_icw3); + V3_CHKPT_STD_SAVE(ctx, pic->slave_icw4); + + + V3_CHKPT_STD_SAVE(ctx, pic->master_imr); + V3_CHKPT_STD_SAVE(ctx, pic->slave_imr); + V3_CHKPT_STD_SAVE(ctx, pic->master_ocw2); + V3_CHKPT_STD_SAVE(ctx, pic->master_ocw3); + V3_CHKPT_STD_SAVE(ctx, pic->slave_ocw2); + V3_CHKPT_STD_SAVE(ctx, pic->slave_ocw3); + + V3_CHKPT_STD_SAVE(ctx, pic->master_state); + V3_CHKPT_STD_SAVE(ctx, pic->slave_state); + + return 0; + } +static int pic_load(struct v3_chkpt_ctx * ctx, void * private_data) { + struct pic_internal * pic = (struct pic_internal *)private_data; + + V3_CHKPT_STD_LOAD(ctx, pic->master_irr); + V3_CHKPT_STD_LOAD(ctx, pic->slave_irr); + + V3_CHKPT_STD_LOAD(ctx, pic->master_isr); + V3_CHKPT_STD_LOAD(ctx, pic->slave_isr); + V3_CHKPT_STD_LOAD(ctx, pic->master_elcr); + V3_CHKPT_STD_LOAD(ctx, pic->slave_elcr); + V3_CHKPT_STD_LOAD(ctx, pic->master_elcr_mask); + V3_CHKPT_STD_LOAD(ctx, pic->slave_elcr_mask); + V3_CHKPT_STD_LOAD(ctx, pic->master_icw1); + V3_CHKPT_STD_LOAD(ctx, pic->master_icw2); + V3_CHKPT_STD_LOAD(ctx, pic->master_icw3); + V3_CHKPT_STD_LOAD(ctx, pic->master_icw4); + V3_CHKPT_STD_LOAD(ctx, pic->slave_icw1); + V3_CHKPT_STD_LOAD(ctx, pic->slave_icw2); + V3_CHKPT_STD_LOAD(ctx, pic->slave_icw3); + V3_CHKPT_STD_LOAD(ctx, pic->slave_icw4); + + + V3_CHKPT_STD_LOAD(ctx, pic->master_imr); + V3_CHKPT_STD_LOAD(ctx, pic->slave_imr); + V3_CHKPT_STD_LOAD(ctx, pic->master_ocw2); + V3_CHKPT_STD_LOAD(ctx, pic->master_ocw3); + V3_CHKPT_STD_LOAD(ctx, pic->slave_ocw2); + V3_CHKPT_STD_LOAD(ctx, pic->slave_ocw3); + + V3_CHKPT_STD_LOAD(ctx, pic->master_state); + V3_CHKPT_STD_LOAD(ctx, pic->slave_state); + + return 0; +} + +#endif static struct v3_device_ops dev_ops = { .free = (int (*)(void *))pic_free, - +#ifdef V3_CONFIG_CHECKPOINT + .save = pic_save, + .load = pic_load +#endif }; -#include + static int pic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { struct pic_internal * state = NULL; @@ -767,9 +854,10 @@ static int pic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { return -1; } + state->core = core; - v3_register_intr_controller(core, &intr_ops, state); - v3_register_intr_router(vm, &router_ops, state); + state->controller_handle = v3_register_intr_controller(core, &intr_ops, state); + state->router_handle = v3_register_intr_router(vm, &router_ops, state); state->master_irr = 0; state->master_isr = 0;