From ae2c92c3745192eebdee57dfeaf4400f59a164c6 Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Tue, 28 Apr 2015 15:32:37 +0100 Subject: [PATCH] tools/libxl: Create a per-arch function to map IRQ to a domain ARM and x86 use a different hypercall to map an IRQ to a domain. The hypercall to give IRQ permission to the domain has also been moved to be an x86 specific function as ARM guest won't be able to manage the IRQ. We may want to support it later. Signed-off-by: Julien Grall Acked-by: Ian Campbell Cc: Ian Jackson Cc: Wei Liu --- tools/libxl/libxl_arch.h | 4 ++++ tools/libxl/libxl_arm.c | 5 +++++ tools/libxl/libxl_create.c | 6 ++---- tools/libxl/libxl_x86.c | 13 +++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h index cae64c0744..77b1f2acce 100644 --- a/tools/libxl/libxl_arch.h +++ b/tools/libxl/libxl_arch.h @@ -39,4 +39,8 @@ int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc, uint32_t domid, libxl_domain_build_info *b_info, libxl__domain_build_state *state); + +/* arch specific irq map function */ +int libxl__arch_domain_map_irq(libxl__gc *gc, uint32_t domid, int irq); + #endif diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c index 5a5cb3fb45..feded586c1 100644 --- a/tools/libxl/libxl_arm.c +++ b/tools/libxl/libxl_arm.c @@ -742,6 +742,11 @@ int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc, return libxl__vnuma_build_vmemrange_pv_generic(gc, domid, info, state); } +int libxl__arch_domain_map_irq(libxl__gc *gc, uint32_t domid, int irq) +{ + return xc_domain_bind_pt_spi_irq(CTX->xch, domid, irq, irq); +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 188f7dfebc..f0da7dc264 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -1218,11 +1218,9 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *multidev, LOG(DEBUG, "dom%d irq %d", domid, irq); - ret = irq >= 0 ? xc_physdev_map_pirq(CTX->xch, domid, irq, &irq) + ret = irq >= 0 ? libxl__arch_domain_map_irq(gc, domid, irq) : -EOVERFLOW; - if (!ret) - ret = xc_domain_irq_permission(CTX->xch, domid, irq, 1); - if (ret < 0) { + if (ret) { LOGE(ERROR, "failed give dom%d access to irq %d", domid, irq); ret = ERROR_FAIL; goto error_out; diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 5e9a8d2dc0..ed2bd388cb 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -424,6 +424,19 @@ out: return rc; } +int libxl__arch_domain_map_irq(libxl__gc *gc, uint32_t domid, int irq) +{ + int ret; + + ret = xc_physdev_map_pirq(CTX->xch, domid, irq, &irq); + if (ret) + return ret; + + ret = xc_domain_irq_permission(CTX->xch, domid, irq, 1); + + return ret; +} + /* * Local variables: * mode: C -- 2.30.2