From: Peter Dinda Date: Thu, 27 Oct 2011 19:24:52 +0000 (-0500) Subject: Merge branch 'devel' of newskysaw.cs.northwestern.edu:/home/palacios/palacios into... X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=ff2811ec19911b7baac7b83b246d4e368757812c;hp=5e5c8ee949fa45116d58b904fc11aab082f61607 Merge branch 'devel' of newskysaw.cs.northwestern.edu:/home/palacios/palacios into devel --- diff --git a/palacios/include/interfaces/vmm_keyed_stream.h b/palacios/include/interfaces/vmm_keyed_stream.h index 06fafd5..d9a9eea 100644 --- a/palacios/include/interfaces/vmm_keyed_stream.h +++ b/palacios/include/interfaces/vmm_keyed_stream.h @@ -61,7 +61,9 @@ sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, void *buf, sint64_t len); -#define STD_SAVE(stream,ks,x) \ + + +#define STD_SAVE_RAW(stream,ks,x) \ do { \ if (sizeof((x)) != v3_keyed_stream_write_key((stream), (ks), &(x), sizeof((x)))) { \ v3_keyed_stream_close_key((stream),(ks)); \ @@ -69,7 +71,7 @@ sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, } \ } while (0) -#define STD_LOAD(stream,ks,x) \ +#define STD_LOAD_RAW(stream,ks,x) \ do { \ if (sizeof((x)) != v3_keyed_stream_read_key((stream), (ks), &(x), sizeof((x)))) { \ v3_keyed_stream_close_key((stream),(ks)); \ @@ -78,6 +80,89 @@ sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, } while (0) #endif +#define KSTREAM_MAGIC_COOKIE 0xabcd0123 + +#define STD_SAVE_TAGGED(stream,ks,tag,size,x) \ +do { \ +uint32_t temp; \ +temp=KSTREAM_MAGIC_COOKIE; \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +temp=strlen(tag); \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp != v3_keyed_stream_write_key((stream),(ks),tag,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +temp=(size); \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if ((size) != v3_keyed_stream_write_key((stream),(ks),&(x),(size))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} while (0) + +#define STD_LOAD_TAGGED(stream,ks,tag,size,x) \ +do { \ +uint32_t temp; \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp!=KSTREAM_MAGIC_COOKIE) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (strlen((tag))!=temp) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +{ char buf[temp+1]; \ + if (temp != v3_keyed_stream_read_key((stream),(ks),buf,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ + buf[temp]=0; \ + if (strncasecmp(buf,tag,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp!=(size)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +if ((size) != v3_keyed_stream_read_key((stream),(ks),&(x),(size))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} while (0) + +#ifdef V3_CONFIG_KEYED_STREAMS_WITH_TAGS +#define STD_SAVE(stream,ks,x) STD_SAVE_TAGGED(stream,ks,#x,sizeof(x),x) +#define STD_LOAD(stream,ks,x) STD_LOAD_TAGGED(stream,ks,#x,sizeof(x),x) +#else +#define STD_SAVE(stream,ks,x) STD_SAVE_RAW(stream,ks,x) +#define STD_LOAD(stream,ks,x) STD_LOAD_RAW(stream,ks,x) +#endif + + struct v3_keyed_stream_hooks { // url is meaningful only to the host implementation diff --git a/palacios/src/interfaces/Kconfig b/palacios/src/interfaces/Kconfig index 270509a..61a7965 100644 --- a/palacios/src/interfaces/Kconfig +++ b/palacios/src/interfaces/Kconfig @@ -13,6 +13,16 @@ config KEYED_STREAMS Select this if your host OS supports keyed streams Palacios Checkpoint/Restore and Migration depends on this feature +config KEYED_STREAMS_WITH_TAGS + bool "Keyed streams will be written in verbose tagged style when std save/load macros are in use" + default n + depends on KEYED_STREAMS + help + Select this if you want the standard save and load macros + (STD_SAVE, STD_LOAD) to write to streams in the format: + [magic cookie][tag len][tag][data len][data] instead of the + default format of [data] + config STREAM bool "Stream support" default n