Re: [Xen-devel] [PATCH v2 09/11] hvmctl: convert HVMOP_inject_msi

2016-07-05 Thread Daniel De Graaf

On 06/24/2016 06:33 AM, Jan Beulich wrote:

Signed-off-by: Jan Beulich 
Reviewed-by: Wei Liu 
Reviewed-by: Andrew Cooper 

Acked-by: Daniel De Graaf 

___
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel


[Xen-devel] [PATCH v2 09/11] hvmctl: convert HVMOP_inject_msi

2016-06-24 Thread Jan Beulich
Signed-off-by: Jan Beulich 
Reviewed-by: Wei Liu 
Reviewed-by: Andrew Cooper 

--- a/tools/libxc/xc_misc.c
+++ b/tools/libxc/xc_misc.c
@@ -508,27 +508,11 @@ int xc_hvm_set_pci_link_route(
 int xc_hvm_inject_msi(
 xc_interface *xch, domid_t dom, uint64_t addr, uint32_t data)
 {
-DECLARE_HYPERCALL_BUFFER(struct xen_hvm_inject_msi, arg);
-int rc;
+DECLARE_HVMCTL(inject_msi, dom,
+   .data  = data,
+   .addr  = addr);
 
-arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));
-if ( arg == NULL )
-{
-PERROR("Could not allocate memory for xc_hvm_inject_msi hypercall");
-return -1;
-}
-
-arg->domid = dom;
-arg->addr  = addr;
-arg->data  = data;
-
-rc = xencall2(xch->xcall, __HYPERVISOR_hvm_op,
-  HVMOP_inject_msi,
-  HYPERCALL_BUFFER_AS_ARG(arg));
-
-xc_hypercall_buffer_free(xch, arg);
-
-return rc;
+return do_hvmctl(xch, );
 }
 
 int xc_hvm_track_dirty_vram(
--- a/xen/arch/x86/hvm/control.c
+++ b/xen/arch/x86/hvm/control.c
@@ -288,6 +288,10 @@ long do_hvmctl(XEN_GUEST_HANDLE_PARAM(xe
 rc = inject_trap(d, _trap);
 break;
 
+case XEN_HVMCTL_inject_msi:
+rc = hvm_inject_msi(d, op.u.inject_msi.addr, op.u.inject_msi.data);
+break;
+
 default:
 rc = -EOPNOTSUPP;
 break;
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -4446,35 +4446,6 @@ static void hvm_s3_resume(struct domain
 }
 }
 
-static int hvmop_inject_msi(
-XEN_GUEST_HANDLE_PARAM(xen_hvm_inject_msi_t) uop)
-{
-struct xen_hvm_inject_msi op;
-struct domain *d;
-int rc;
-
-if ( copy_from_guest(, uop, 1) )
-return -EFAULT;
-
-rc = rcu_lock_remote_domain_by_id(op.domid, );
-if ( rc != 0 )
-return rc;
-
-rc = -EINVAL;
-if ( !is_hvm_domain(d) )
-goto out;
-
-rc = xsm_hvm_inject_msi(XSM_DM_PRIV, d);
-if ( rc )
-goto out;
-
-rc = hvm_inject_msi(d, op.addr, op.data);
-
- out:
-rcu_unlock_domain(d);
-return rc;
-}
-
 static int hvmop_flush_tlb_all(void)
 {
 struct domain *d = current->domain;
@@ -5266,11 +5237,6 @@ long do_hvm_op(unsigned long op, XEN_GUE
 guest_handle_cast(arg, xen_hvm_param_t));
 break;
 
-case HVMOP_inject_msi:
-rc = hvmop_inject_msi(
-guest_handle_cast(arg, xen_hvm_inject_msi_t));
-break;
-
 case HVMOP_flush_tlbs:
 rc = guest_handle_is_null(arg) ? hvmop_flush_tlb_all() : -ENOSYS;
 break;
--- a/xen/arch/x86/hvm/irq.c
+++ b/xen/arch/x86/hvm/irq.c
@@ -292,6 +292,9 @@ int hvm_inject_msi(struct domain *d, uin
 >> MSI_DATA_TRIGGER_SHIFT;
 uint8_t vector = data & MSI_DATA_VECTOR_MASK;
 
+if ( !is_hvm_domain(d) )
+return -EINVAL;
+
 if ( !vector )
 {
 int pirq = ((addr >> 32) & 0xff00) | dest;
--- a/xen/include/public/hvm/control.h
+++ b/xen/include/public/hvm/control.h
@@ -120,6 +120,16 @@ struct xen_hvm_inject_trap {
 uint64_aligned_t cr2;
 };
 
+/* XEN_HVMCTL_inject_msi */
+/* MSI injection for emulated devices. */
+struct xen_hvm_inject_msi {
+/* Message data. */
+uint32_t  data;
+uint32_t  rsvd;
+/* Message address (x86: 0xFEEx). */
+uint64_t  addr;
+};
+
 struct xen_hvmctl {
 uint16_t interface_version;/* XEN_HVMCTL_INTERFACE_VERSION */
 domid_t domain;
@@ -131,6 +141,7 @@ struct xen_hvmctl {
 #define XEN_HVMCTL_modified_memory   5
 #define XEN_HVMCTL_set_mem_type  6
 #define XEN_HVMCTL_inject_trap   7
+#define XEN_HVMCTL_inject_msi8
 uint64_t opaque;   /* Must be zero on initial invocation. */
 union {
 struct xen_hvm_set_pci_intx_level set_pci_intx_level;
@@ -140,6 +151,7 @@ struct xen_hvmctl {
 struct xen_hvm_modified_memory modified_memory;
 struct xen_hvm_set_mem_type set_mem_type;
 struct xen_hvm_inject_trap inject_trap;
+struct xen_hvm_inject_msi inject_msi;
 uint8_t pad[120];
 } u;
 };
--- a/xen/include/public/hvm/hvm_op.h
+++ b/xen/include/public/hvm/hvm_op.h
@@ -140,19 +140,6 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_
 /* Following tools-only interfaces may change in future. */
 #if defined(__XEN__) || defined(__XEN_TOOLS__)
 
-/* MSI injection for emulated devices */
-#define HVMOP_inject_msi 16
-struct xen_hvm_inject_msi {
-/* Domain to be injected */
-domid_t   domid;
-/* Data -- lower 32 bits */
-uint32_t  data;
-/* Address (0xfeex) */
-uint64_t  addr;
-};
-typedef struct xen_hvm_inject_msi xen_hvm_inject_msi_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_inject_msi_t);
-
 /*
  * IOREQ Servers
  *
--- a/xen/include/xsm/dummy.h
+++ b/xen/include/xsm/dummy.h
@@ -609,12 +609,6 @@ static XSM_INLINE int xsm_shadow_control
 return xsm_default_action(action,