Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel' of newskysaw.cs.northwestern.edu:/home/palacios/palacios into...
Peter Dinda [Thu, 27 Oct 2011 19:24:52 +0000 (14:24 -0500)]
palacios/include/interfaces/vmm_keyed_stream.h
palacios/src/interfaces/Kconfig

index 06fafd5..d9a9eea 100644 (file)
@@ -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
index 270509a..61a7965 100644 (file)
@@ -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