From 41a9b98fff4d3a45ae5c6ffe6a10999fafd3e4e6 Mon Sep 17 00:00:00 2001 From: Varad Gautam Date: Wed, 1 Apr 2020 18:57:15 +0200 Subject: kexec-xen: Introduce xen_get_kexec_range to wrap xc_kexec_get_range And convert all callers of xc_kexec_get_range to use this. Allows reusing sanity checks for other KEXEC_RANGEs v2: define xen_get_kexec_range outside of HAVE_LIBXENCTRL Signed-off-by: Varad Gautam Signed-off-by: Simon Horman --- kexec/crashdump-xen.c | 38 +++++--------------------------------- kexec/kexec-xen.c | 32 ++++++++++++++++++++++++++++++++ kexec/kexec-xen.h | 4 ++++ 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/kexec/crashdump-xen.c b/kexec/crashdump-xen.c index 2d6b2f9d..3f59a0dc 100644 --- a/kexec/crashdump-xen.c +++ b/kexec/crashdump-xen.c @@ -162,21 +162,15 @@ unsigned long xen_architecture(struct crash_elf_info *elf_info) #ifdef HAVE_LIBXENCTRL int get_xen_vmcoreinfo(uint64_t *addr, uint64_t *len) { - xc_interface *xc; + uint64_t end; int ret = 0; - xc = xc_interface_open(NULL, NULL, 0); - if (!xc) { - fprintf(stderr, "failed to open xen control interface.\n"); + ret = xen_get_kexec_range(KEXEC_RANGE_MA_VMCOREINFO, addr, &end); + if (ret < 0) return -1; - } - - ret = xc_kexec_get_range(xc, KEXEC_RANGE_MA_VMCOREINFO, 0, len, addr); - xc_interface_close(xc); + *len = end - *addr + 1; - if (ret < 0) - return -1; return 0; } @@ -252,29 +246,7 @@ int xen_get_note(int cpu, uint64_t *addr, uint64_t *len) #ifdef HAVE_LIBXENCTRL int xen_get_crashkernel_region(uint64_t *start, uint64_t *end) { - uint64_t size; - xc_interface *xc; - int rc = -1; - - xc = xc_interface_open(NULL, NULL, 0); - if (!xc) { - fprintf(stderr, "failed to open xen control interface.\n"); - goto out; - } - - rc = xc_kexec_get_range(xc, KEXEC_RANGE_MA_CRASH, 0, &size, start); - if (rc < 0) { - fprintf(stderr, "failed to get crash region from hypervisor.\n"); - goto out_close; - } - - *end = *start + size - 1; - -out_close: - xc_interface_close(xc); - -out: - return rc; + return xen_get_kexec_range(KEXEC_RANGE_MA_CRASH, start, end); } #else int xen_get_crashkernel_region(uint64_t *start, uint64_t *end) diff --git a/kexec/kexec-xen.c b/kexec/kexec-xen.c index c3269554..afcfc5b8 100644 --- a/kexec/kexec-xen.c +++ b/kexec/kexec-xen.c @@ -64,6 +64,33 @@ int __xc_interface_close(xc_interface *xch) } #endif /* CONFIG_LIBXENCTRL_DL */ +int xen_get_kexec_range(int range, uint64_t *start, uint64_t *end) +{ + uint64_t size; + xc_interface *xc; + int rc = -1; + + xc = xc_interface_open(NULL, NULL, 0); + if (!xc) { + fprintf(stderr, "failed to open xen control interface.\n"); + goto out; + } + + rc = xc_kexec_get_range(xc, range, 0, &size, start); + if (rc < 0) { + fprintf(stderr, "failed to get range=%d from hypervisor.\n", range); + goto out_close; + } + + *end = *start + size - 1; + +out_close: + xc_interface_close(xc); + +out: + return rc; +} + #define IDENTMAP_1MiB (1024 * 1024) int xen_kexec_load(struct kexec_info *info) @@ -226,6 +253,11 @@ void xen_kexec_exec(void) #else /* ! HAVE_LIBXENCTRL */ +int xen_get_kexec_range(int range, uint64_t *start, uint64_t *end) +{ + return -1; +} + int xen_kexec_load(struct kexec_info *UNUSED(info)) { return -1; diff --git a/kexec/kexec-xen.h b/kexec/kexec-xen.h index ae67393c..94d22cda 100644 --- a/kexec/kexec-xen.h +++ b/kexec/kexec-xen.h @@ -63,6 +63,10 @@ extern int __xc_interface_close(xc_interface *xch); __xc_call(void *, xc_hypercall_buffer_array_destroy, args) #endif /* CONFIG_LIBXENCTRL_DL */ + + #endif /* HAVE_LIBXENCTRL */ +int xen_get_kexec_range(int range, uint64_t *start, uint64_t *end); + #endif /* KEXEC_XEN_H */ -- cgit 1.2.3-korg