X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_dev_mgr.c;h=de6209b592566f0fe83fba5a8b10c874f71cf4b3;hp=e6fad6929ca673cebaa216c9968f893a2f88803c;hb=e00538192a2762cacb12b359b40f076cb4f3ba83;hpb=5d1bbcc86de011e3f0d115b6f10fd8645cdf855e diff --git a/palacios/src/palacios/vmm_dev_mgr.c b/palacios/src/palacios/vmm_dev_mgr.c index e6fad69..de6209b 100644 --- a/palacios/src/palacios/vmm_dev_mgr.c +++ b/palacios/src/palacios/vmm_dev_mgr.c @@ -184,11 +184,47 @@ int v3_save_vm_devices(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { int v3_load_vm_devices(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { + struct vm_device * dev; + struct v3_chkpt_ctx * dev_mgr_ctx = NULL; + uint32_t num_devs = 0; + char * name_table = NULL; + int i = 0; + + dev_mgr_ctx = v3_chkpt_open_ctx(chkpt, NULL, "devices"); + + v3_chkpt_load(dev_mgr_ctx, "num_devs", 4, &num_devs); + + V3_Print("Loading State for %d devices\n", num_devs); + + name_table = V3_Malloc(32 * num_devs); + + v3_chkpt_load(dev_mgr_ctx, "names", 32 * num_devs, name_table); - PrintError("TODO... \n"); + for (i = 0; i < num_devs; i++) { + char * name = &(name_table[i * 32]); + struct v3_chkpt_ctx * dev_ctx = NULL; + dev = v3_find_dev(vm, name); - // Read devices from checkpoint data - // selectively load them + if (!dev) { + PrintError("Tried to load state into non existant device: %s\n", name); + continue; + } + + if (!dev->ops->load) { + PrintError("Error Device (%s) does not support load operation\n", name); + continue; + } + + dev_ctx = v3_chkpt_open_ctx(chkpt, dev_mgr_ctx, name); + + if (!dev_ctx) { + PrintError("Error missing device context (%s)\n", name); + continue; + } + + + dev->ops->load(dev_ctx, dev->private_data); + } return 0; }