|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v2 07/14] Add kimage_add_live_update_data()
From: David Woodhouse <dwmw@xxxxxxxxxxxx>
Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx>
---
xen/common/kimage.c | 33 +++++++++++++++++++++++++++++++++
xen/include/asm-x86/config.h | 2 ++
xen/include/xen/kimage.h | 3 +++
3 files changed, 38 insertions(+)
diff --git a/xen/common/kimage.c b/xen/common/kimage.c
index 210241dfb7..eafa6a9c26 100644
--- a/xen/common/kimage.c
+++ b/xen/common/kimage.c
@@ -938,6 +938,39 @@ done:
return ret;
}
+int kimage_add_live_update_data(struct kexec_image *image, mfn_t data, int
nr_mfns)
+{
+ int ret;
+
+ /*
+ * For live update, we place the physical location of 'data'
+ * into the first 64 bits of the reserved live update bootmem
+ * region. At 'data' is an MFN list of pages containing the
+ * actual live update stream, which the new Xen can vmap().
+ *
+ * Append IND_WRITE64 operations to the end of the kimage stream
+ * to store the live update magic and the address of 'data' for
+ * the new Xen to see.
+ */
+ if (!lu_bootmem_start || kimage_dst_used(image, lu_bootmem_start))
+ return -EINVAL;
+
+ ret = machine_kexec_add_page(image, lu_bootmem_start, lu_bootmem_start);
+ if ( ret < 0 )
+ return ret;
+
+ ret = kimage_set_destination(image, lu_bootmem_start);
+ if (!ret)
+ ret = kimage_add_entry(image, LIVE_UPDATE_MAGIC | IND_WRITE64);
+ if (!ret)
+ ret = kimage_add_entry(image, mfn_to_maddr(data) | IND_WRITE64);
+ if (!ret)
+ ret = kimage_add_entry(image, (nr_mfns << PAGE_SHIFT) | IND_WRITE64);
+
+ kimage_terminate(image);
+
+ return ret;
+}
/*
* Local variables:
* mode: C
diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h
index 55f327db70..e80cfd54f0 100644
--- a/xen/include/asm-x86/config.h
+++ b/xen/include/asm-x86/config.h
@@ -281,6 +281,8 @@ extern unsigned long xen_phys_start;
extern unsigned long lu_bootmem_start, lu_bootmem_size;
#endif
+#define LIVE_UPDATE_MAGIC (0x4c69766555700000UL)
+
/* GDT/LDT shadow mapping area. The first per-domain-mapping sub-area. */
#define GDT_LDT_VCPU_SHIFT 5
#define GDT_LDT_VCPU_VA_SHIFT (GDT_LDT_VCPU_SHIFT + PAGE_SHIFT)
diff --git a/xen/include/xen/kimage.h b/xen/include/xen/kimage.h
index e94839d7c3..1e0e378afd 100644
--- a/xen/include/xen/kimage.h
+++ b/xen/include/xen/kimage.h
@@ -54,6 +54,9 @@ unsigned long kimage_entry_ind(kimage_entry_t *entry, bool_t
compat);
int kimage_build_ind(struct kexec_image *image, mfn_t ind_mfn,
bool_t compat);
+int kimage_add_live_update_data(struct kexec_image *image, mfn_t data,
+ int nr_mfns);
+
#endif /* __ASSEMBLY__ */
#endif /* __XEN_KIMAGE_H__ */
--
2.21.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |