#include <xen/types.h>
#include <xen/vmap.h>
#include <xen/lu.h>
+#include <public/migration_stream.h>
static int lu_stream_extend(struct lu_stream *stream, int nr_pages)
{
return 0;
}
+int lu_stream_open_record(struct lu_stream *stream, unsigned int type)
+{
+ struct mr_rhdr *hdr;
+
+ stream->last_hdr = stream->len;
+
+ hdr = lu_stream_reserve(stream, sizeof(hdr));
+ if (!hdr)
+ return -ENOMEM;
+
+ hdr->type = type;
+ hdr->length = 0;
+
+ lu_stream_end_reservation(stream, sizeof(*hdr));
+
+ return 0;
+}
+
+int lu_stream_close_record(struct lu_stream *stream)
+{
+ uint64_t zeroes = 0;
+ struct mr_rhdr *hdr;
+ int rc = 0;
+
+ hdr = (struct mr_rhdr *)(stream->data + stream->last_hdr);
+
+ hdr->length = stream->len - stream->last_hdr - sizeof(*hdr);
+
+ if (stream->len & 7)
+ rc = lu_stream_append(stream, &zeroes, 8 - (stream->len & 7));
+
+ return rc;
+}
+
+int lu_stream_append_record(struct lu_stream *stream, unsigned int type,
+ void *rec, size_t len)
+{
+ int rc;
+
+
+ rc = lu_stream_open_record(stream, type);
+ if (!rc && len)
+ rc = lu_stream_append(stream, rec, len);
+ if (!rc)
+ rc = lu_stream_close_record(stream);
+
+ return 0;
+}
+
void lu_stream_free(struct lu_stream *stream)
{
unsigned int order = get_order_from_bytes((stream->nr_pages + 1) * sizeof(mfn_t));
struct lu_stream {
mfn_t *pagelist;
+ size_t last_hdr;
size_t len;
int nr_pages;
char *data;
void *lu_stream_reserve(struct lu_stream *stream, size_t size);
void lu_stream_end_reservation(struct lu_stream *stream, size_t size);
int lu_stream_append(struct lu_stream *stream, const void *data, size_t size);
+int lu_stream_open_record(struct lu_stream *stream, unsigned int type);
+int lu_stream_close_record(struct lu_stream *stream);
+int lu_stream_append_record(struct lu_stream *stream, unsigned int type,
+ void *rec, size_t len);
void lu_stream_free(struct lu_stream *stream);
struct kexec_image;