[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 12/15] tools: Call XEN_DOMCTL_acpi_access on PVH VCPU hotplug
Provide libxc interface for accessing ACPI via XEN_DOMCTL_acpi_access. When a VCPU is hot-(un)plugged to/from a PVH guest update VCPU map by writing to ACPI's XEN_ACPI_CPU_MAP register and then set GPE0 status bit in GPE0.status. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> --- Changes in v4: * New patch tools/libxc/include/xenctrl.h | 20 ++++++++++++++++++++ tools/libxc/xc_domain.c | 36 ++++++++++++++++++++++++++++++++++++ tools/libxl/libxl.c | 8 +++++++- tools/libxl/libxl_arch.h | 4 ++++ tools/libxl/libxl_arm.c | 6 ++++++ tools/libxl/libxl_x86.c | 21 +++++++++++++++++++++ 6 files changed, 94 insertions(+), 1 deletion(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 2c83544..e4d735f 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2710,6 +2710,26 @@ int xc_livepatch_revert(xc_interface *xch, char *name, uint32_t timeout); int xc_livepatch_unload(xc_interface *xch, char *name, uint32_t timeout); int xc_livepatch_replace(xc_interface *xch, char *name, uint32_t timeout); +int xc_acpi_access(xc_interface *xch, domid_t domid, + uint8_t rw, uint8_t space_id, unsigned long addr, + unsigned int bytes, void *val); + +static inline int xc_acpi_ioread(xc_interface *xch, domid_t domid, + unsigned long port, + unsigned int bytes, void *val) +{ + return xc_acpi_access(xch, domid, XEN_DOMCTL_ACPI_READ, XEN_ACPI_SYSTEM_IO, + port, bytes, val); +} + +static inline int xc_acpi_iowrite(xc_interface *xch, domid_t domid, + unsigned long port, + unsigned int bytes, void *val) +{ + return xc_acpi_access(xch, domid, XEN_DOMCTL_ACPI_WRITE, XEN_ACPI_SYSTEM_IO, + port, bytes, val); +} + /* Compat shims */ #include "xenctrl_compat.h" diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 296b852..15c5136 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -2520,6 +2520,42 @@ int xc_domain_soft_reset(xc_interface *xch, domctl.domain = (domid_t)domid; return do_domctl(xch, &domctl); } + +int +xc_acpi_access(xc_interface *xch, domid_t domid, + uint8_t rw, uint8_t space_id, + unsigned long address, unsigned int bytes, void *val) +{ + DECLARE_DOMCTL; + DECLARE_HYPERCALL_BOUNCE(val, bytes, XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + + while ( (int)bytes > 0 ) + { + if ( xc_hypercall_bounce_pre(xch, val) ) + return -1; + + memset(&domctl, 0, sizeof(domctl)); + domctl.domain = domid; + domctl.cmd = XEN_DOMCTL_acpi_access; + domctl.u.acpi_access.gas.space_id = space_id; + domctl.u.acpi_access.gas.bit_width = (bytes & 31) * 8; + domctl.u.acpi_access.gas.bit_offset = 0; + domctl.u.acpi_access.gas.address = address; + domctl.u.acpi_access.rw = rw; + set_xen_guest_handle(domctl.u.acpi_access.val, val); + + if ( do_domctl(xch, &domctl) != 0 ) + return 1; + + xc_hypercall_bounce_post(xch, val); + + bytes -= 32; + address += 32; + } + + return 0; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 33c5e4c..d80ab77 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -5147,8 +5147,14 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) switch (libxl__domain_type(gc, domid)) { case LIBXL_DOMAIN_TYPE_HVM: switch (libxl__device_model_version_running(gc, domid)) { - case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: case LIBXL_DEVICE_MODEL_VERSION_NONE: + rc = libxl__arch_set_vcpuonline(gc, domid, cpumap); + if (rc < 0) { + LOGE(ERROR, "Can't change vcpu online map (%d)", rc); + goto out; + } + /* fallthrough */ + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: rc = libxl__set_vcpuonline_xenstore(gc, domid, cpumap, &info); break; case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h index 5e1fc60..1869626 100644 --- a/tools/libxl/libxl_arch.h +++ b/tools/libxl/libxl_arch.h @@ -71,6 +71,10 @@ int libxl__arch_extra_memory(libxl__gc *gc, const libxl_domain_build_info *info, uint64_t *out); +_hidden +int libxl__arch_set_vcpuonline(libxl__gc *gc, uint32_t domid, + libxl_bitmap *cpumap); + #if defined(__i386__) || defined(__x86_64__) #define LAPIC_BASE_ADDRESS 0xfee00000 diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c index d842d88..a64af1b 100644 --- a/tools/libxl/libxl_arm.c +++ b/tools/libxl/libxl_arm.c @@ -126,6 +126,12 @@ out: return rc; } +int libxl__arch_set_vcpuonline(libxl__gc *gc, uint32_t domid, + libxl_bitmap *cpumap) +{ + return ERROR_FAIL; +} + static struct arch_info { const char *guest_type; const char *timer_compat; diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index e1844c8..e31b159 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -3,6 +3,9 @@ #include <xc_dom.h> +#include <xen/arch-x86/xen.h> +#include <xen/hvm/ioreq.h> + int libxl__arch_domain_prepare_config(libxl__gc *gc, libxl_domain_config *d_config, xc_domain_configuration_t *xc_config) @@ -368,6 +371,24 @@ int libxl__arch_extra_memory(libxl__gc *gc, return 0; } +int libxl__arch_set_vcpuonline(libxl__gc *gc, uint32_t domid, + libxl_bitmap *cpumap) +{ + int rc; + + /*Update VCPU map. */ + rc = xc_acpi_iowrite(CTX->xch, domid, XEN_ACPI_CPU_MAP, + cpumap->size, cpumap->map); + if (!rc) { + /* Send an SCI. */ + uint16_t val = 1 << XEN_GPE0_CPUHP_BIT; + rc = xc_acpi_iowrite(CTX->xch, domid, ACPI_GPE0_BLK_ADDRESS_V1, + sizeof(val), &val); + } + + return rc; +} + int libxl__arch_domain_init_hw_description(libxl__gc *gc, libxl_domain_build_info *info, libxl__domain_build_state *state, -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |