[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 |