X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_chkpt_stores.h;h=d7bc3f07207269b2a0947750f2e07494bfdc20d6;hb=a48fed88738b625fea8a606f5b327d32db91f009;hp=5a23e2d4c3a993b5da7ea5e594187eec82d188e5;hpb=04c1f687aa0839b01711be22250903852f1a1257;p=palacios.git diff --git a/palacios/src/palacios/vmm_chkpt_stores.h b/palacios/src/palacios/vmm_chkpt_stores.h index 5a23e2d..d7bc3f0 100644 --- a/palacios/src/palacios/vmm_chkpt_stores.h +++ b/palacios/src/palacios/vmm_chkpt_stores.h @@ -40,6 +40,74 @@ static struct {} null_store __attribute__((__used__)) \ + +#include + + +static void * debug_open_chkpt(char * url, chkpt_mode_t mode) { + + if (mode == LOAD) { + V3_Print(VM_NONE, VCORE_NONE, "Cannot load from debug store\n"); + return NULL; + } + + V3_Print(VM_NONE, VCORE_NONE, "Opening Checkpoint: %s\n", url); + + return (void *)1; +} + + + +static int debug_close_chkpt(void * store_data) { + V3_Print(VM_NONE, VCORE_NONE, "Closing Checkpoint\n"); + return 0; +} + +static void * debug_open_ctx(void * store_data, + char * name) { + V3_Print(VM_NONE, VCORE_NONE, "[%s]\n", name); + return (void *)1; +} + +static int debug_close_ctx(void * store_data, void * ctx) { + V3_Print(VM_NONE, VCORE_NONE, "[CLOSE]\n"); + return 0; +} + +static int debug_save(void * store_data, void * ctx, + char * tag, uint64_t len, void * buf) { + V3_Print(VM_NONE, VCORE_NONE, "%s:\n", tag); + + if (len > 100) { + len = 100; + } + + v3_dump_mem(buf, len); + + return 0; +} + +static int debug_load(void * store_data, void * ctx, + char * tag, uint64_t len, void * buf) { + V3_Print(VM_NONE, VCORE_NONE, "Loading not supported !!!\n"); + return 0; +} + + +static struct chkpt_interface debug_store = { + .name = "DEBUG", + .open_chkpt = debug_open_chkpt, + .close_chkpt = debug_close_chkpt, + .open_ctx = debug_open_ctx, + .close_ctx = debug_close_ctx, + .save = debug_save, + .load = debug_load +}; + +register_chkpt_store(debug_store); + + + #ifdef V3_CONFIG_KEYED_STREAMS #include @@ -65,7 +133,6 @@ static int keyed_stream_close_chkpt(void * store_data) { } static void * keyed_stream_open_ctx(void * store_data, - void * parent_ctx, char * name) { v3_keyed_stream_t stream = store_data; @@ -82,12 +149,20 @@ static int keyed_stream_close_ctx(void * store_data, void * ctx) { static int keyed_stream_save(void * store_data, void * ctx, char * tag, uint64_t len, void * buf) { - return v3_keyed_stream_write_key(store_data, ctx, buf, len); + if (v3_keyed_stream_write_key(store_data, ctx, tag, strlen(tag), buf, len) != len) { + return -1; + } else { + return 0; + } } static int keyed_stream_load(void * store_data, void * ctx, char * tag, uint64_t len, void * buf) { - return v3_keyed_stream_read_key(store_data, ctx, buf, len); + if (v3_keyed_stream_read_key(store_data, ctx, tag, strlen(tag), buf, len) != len) { + return -1; + } else { + return 0; + } } @@ -109,6 +184,123 @@ register_chkpt_store(keyed_stream_store); +#ifdef V3_CONFIG_FILE +#include + + +struct file_ctx { + v3_file_t file; + uint64_t offset; + char * filename; +}; + + +static void * dir_open_chkpt(char * url, chkpt_mode_t mode) { + if (mode == SAVE) { + if (v3_mkdir(url, 0755, 1) != 0) { + return NULL; + } + } + + return url; +} + + + +static int dir_close_chkpt(void * store_data) { + return 0; +} + +static void * dir_open_ctx(void * store_data, + char * name) { + + char * url = store_data; + struct file_ctx * ctx = NULL; + + + ctx = V3_Malloc(sizeof(struct file_ctx)); + + if (!ctx) { + PrintError(VM_NONE, VCORE_NONE, "Cannot allocate\n"); + return NULL; + } + + memset(ctx, 0, sizeof(struct file_ctx)); + + ctx->filename = V3_Malloc(strlen(url) + strlen(name) + 5); + + if (!ctx->filename) { + PrintError(VM_NONE, VCORE_NONE, "Cannot allocate\n"); + V3_Free(ctx); + return NULL; + } + + + memset(ctx->filename, 0, strlen(url) + strlen(name) + 5); + + snprintf(ctx->filename, strlen(url) + strlen(name) + 5, "%s/%s", url, name); + + + ctx->file = v3_file_open(NULL, ctx->filename, FILE_OPEN_MODE_READ | FILE_OPEN_MODE_WRITE | FILE_OPEN_MODE_CREATE); + + return ctx; +} + +static int dir_close_ctx(void * store_data, void * ctx) { + struct file_ctx * file_ctx = ctx; + + v3_file_close(file_ctx->file); + + V3_Free(file_ctx->filename); + V3_Free(file_ctx); + + return 0; +} + +static int dir_save(void * store_data, void * ctx, + char * tag, uint64_t len, void * buf) { + struct file_ctx * file_ctx = ctx; + uint64_t ret = 0; + + ret = v3_file_write(file_ctx->file, buf, len, file_ctx->offset); + + file_ctx->offset += ret; + + return 0; +} + +static int dir_load(void * store_data, void * ctx, + char * tag, uint64_t len, void * buf) { + struct file_ctx * file_ctx = ctx; + uint64_t ret = 0; + + ret = v3_file_read(file_ctx->file, buf, len, file_ctx->offset); + + file_ctx->offset += ret; + + return 0; +} + + +static struct chkpt_interface dir_store = { + .name = "DIR", + .open_chkpt = dir_open_chkpt, + .close_chkpt = dir_close_chkpt, + .open_ctx = dir_open_ctx, + .close_ctx = dir_close_ctx, + .save = dir_save, + .load = dir_load +}; + +register_chkpt_store(dir_store); + + + +#endif + + + +