]> xenbits.xensource.com Git - people/iwj/xen.git/commitdiff
tools/libs/evtchn: Add support for restricting a handle
authorRoss Lagerwall <ross.lagerwall@citrix.com>
Wed, 18 Oct 2017 13:42:32 +0000 (14:42 +0100)
committerWei Liu <wei.liu2@citrix.com>
Fri, 27 Oct 2017 14:06:39 +0000 (15:06 +0100)
Implement support for restricting evtchn handles to a particular domain
on Linux by calling the IOCTL_EVTCHN_RESTRICT_DOMID ioctl (support added
in Linux v4.8).

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Release-acked-by: Julien Grall <julien.grall@linaro.org>
13 files changed:
tools/include/xen-sys/Linux/evtchn.h
tools/libs/evtchn/Makefile
tools/libs/evtchn/core.c
tools/libs/evtchn/freebsd.c
tools/libs/evtchn/include/xenevtchn.h
tools/libs/evtchn/libxenevtchn.map
tools/libs/evtchn/linux.c
tools/libs/evtchn/minios.c
tools/libs/evtchn/netbsd.c
tools/libs/evtchn/private.h
tools/libs/evtchn/solaris.c
tools/libvchan/init.c
tools/libvchan/libxenvchan.h

index 938d4da2bdde2728a08d85285535be8414eab84a..08ee0b7c33e1f7124fd59f225e7c54b9d1315de2 100644 (file)
@@ -85,4 +85,19 @@ struct ioctl_evtchn_notify {
 #define IOCTL_EVTCHN_RESET                             \
        _IOC(_IOC_NONE, 'E', 5, 0)
 
+/*
+ * Restrict this file descriptor so that it can only be used to bind
+ * new interdomain events from one domain.
+ *
+ * Once a file descriptor has been restricted it cannot be
+ * de-restricted, and must be closed and re-opened.  Event channels
+ * which were bound before restricting remain bound afterwards, and
+ * can be notified as usual.
+ */
+#define IOCTL_EVTCHN_RESTRICT_DOMID                    \
+       _IOC(_IOC_NONE, 'E', 6, sizeof(struct ioctl_evtchn_restrict_domid))
+struct ioctl_evtchn_restrict_domid {
+       domid_t domid;
+};
+
 #endif /* __LINUX_PUBLIC_EVTCHN_H__ */
index 5444ec73e5430085a52d43121def52901aa96ae5..bc98aed429bd92500c8a00f124aa8e9c91116fda 100644 (file)
@@ -2,7 +2,7 @@ XEN_ROOT = $(CURDIR)/../../..
 include $(XEN_ROOT)/tools/Rules.mk
 
 MAJOR    = 1
-MINOR    = 0
+MINOR    = 1
 SHLIB_LDFLAGS += -Wl,--version-script=libxenevtchn.map
 
 CFLAGS   += -Werror -Wmissing-prototypes
index c31e08ce3d81eb3239c4fcf4f03b01f63935c2de..41621ff64bd396569b38d87c759e3e5339ceaf7f 100644 (file)
@@ -61,6 +61,11 @@ int xenevtchn_close(xenevtchn_handle *xce)
     return rc;
 }
 
+int xenevtchn_restrict(xenevtchn_handle *xce, domid_t domid)
+{
+    return osdep_evtchn_restrict(xce, domid);
+}
+
 /*
  * Local variables:
  * mode: C
index 30eaa705ac8c852ec2d4851880fe4a3cdc5b4a3d..ba82f06311f1b65f81ec1cc7dd949af537272ee6 100644 (file)
@@ -47,6 +47,12 @@ int osdep_evtchn_close(xenevtchn_handle *xce)
     return close(xce->fd);
 }
 
+int osdep_evtchn_restrict(xenevtchn_handle *xce, domid_t domid)
+{
+    errno = -EOPNOTSUPP;
+    return -1;
+}
+
 int xenevtchn_fd(xenevtchn_handle *xce)
 {
     return xce->fd;
index 93b80cb1199eae52454d260c34cf5da7ae5c7b64..91821ee56db9fe9caeb7214aafbae0891eee131d 100644 (file)
@@ -151,6 +151,16 @@ xenevtchn_pending(xenevtchn_handle *xce);
  */
 int xenevtchn_unmask(xenevtchn_handle *xce, evtchn_port_t port);
 
+/**
+ * This function restricts the use of this handle to the specified
+ * domain.
+ *
+ * @parm xce handle to the open evtchn interface
+ * @parm domid the domain id
+ * @return 0 on success, -1 on failure with errno set appropriately.
+ */
+int xenevtchn_restrict(xenevtchn_handle *xce, domid_t domid);
+
 #endif
 
 /*
index 625a1e2b827fa523aa3a49ae2f70f9f8c002e4bd..33a38f953ac3bb962262aa3ea1921d8f83494f70 100644 (file)
@@ -17,3 +17,7 @@ VERS_1.0 {
                xenevtchn_pending;
        local: *; /* Do not expose anything by default */
 };
+VERS_1.1 {
+       global:
+               xenevtchn_restrict;
+} VERS_1.0;
index a581c5d316765c92008e51bd096f56cb92fe7dd4..17e64aea3240d219a8f9f12757c5686a67f24e65 100644 (file)
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <stdint.h>
 
 #include <sys/ioctl.h>
 
+#include <xen/xen.h>
 #include <xen/sys/evtchn.h>
 
 #include "private.h"
@@ -49,6 +51,13 @@ int osdep_evtchn_close(xenevtchn_handle *xce)
     return close(xce->fd);
 }
 
+int osdep_evtchn_restrict(xenevtchn_handle *xce, domid_t domid)
+{
+    struct ioctl_evtchn_restrict_domid restrict_domid = { domid };
+
+    return ioctl(xce->fd, IOCTL_EVTCHN_RESTRICT_DOMID, &restrict_domid);
+}
+
 int xenevtchn_fd(xenevtchn_handle *xce)
 {
     return xce->fd;
index ccf37f081a113582cf92447f3a2b023b887abdbb..414c21ba6720ffdcd1095f8a9c696bad76716d5b 100644 (file)
@@ -82,6 +82,12 @@ int osdep_evtchn_close(xenevtchn_handle *xce)
     return close(xce->fd);
 }
 
+int osdep_evtchn_restrict(xenevtchn_handle *xce, domid_t domid)
+{
+    errno = -EOPNOTSUPP;
+    return -1;
+}
+
 void minios_evtchn_close_fd(int fd)
 {
     struct evtchn_port_info *port_info, *tmp;
index 114c6e6bc418b9d9ac6e652ad266c2562c95a4de..5ce3a35f801cb05c18e57f19011cdf3afcac0570 100644 (file)
@@ -47,6 +47,12 @@ int osdep_evtchn_close(xenevtchn_handle *xce)
     return close(xce->fd);
 }
 
+int osdep_evtchn_restrict(xenevtchn_handle *xce, domid_t domid)
+{
+    errno = -EOPNOTSUPP;
+    return -1;
+}
+
 int xenevtchn_fd(xenevtchn_handle *xce)
 {
     return xce->fd;
index fcd0e9697922c5918ac8f3c08353878354c6fc44..3d34862accd4ab8bc80ee6675d5618ce0f20b644 100644 (file)
@@ -4,6 +4,8 @@
 #include <xentoollog.h>
 #include <xenevtchn.h>
 
+#include <xen/xen.h>
+
 struct xenevtchn_handle {
     xentoollog_logger *logger, *logger_tofree;
     int fd;
@@ -11,6 +13,7 @@ struct xenevtchn_handle {
 
 int osdep_evtchn_open(xenevtchn_handle *xce);
 int osdep_evtchn_close(xenevtchn_handle *xce);
+int osdep_evtchn_restrict(xenevtchn_handle *xce, domid_t domid);
 
 #endif
 
index dc249aa0139280d64af40e0f54edcd4f798cd755..f7189894503f0c55dc7fe310c44e0ff06e60d246 100644 (file)
@@ -50,6 +50,12 @@ int osdep_evtchn_close(xenevtchn_handle *xce)
     return close(xce->fd);
 }
 
+int osdep_evtchn_restrict(xenevtchn_handle *xce, domid_t domid)
+{
+    errno = -EOPNOTSUPP;
+    return -1;
+}
+
 int xenevtchn_fd(xenevtchn_handle *xce)
 {
     return xce->fd;
index e53f3a78d20790e5f97da557667d2a3bc2955dee..0b3759a05619cefe3617baa9adfde8a28a389418 100644 (file)
@@ -40,6 +40,7 @@
 #include <fcntl.h>
 
 #include <xenstore.h>
+#include <xen/xen.h>
 #include <xen/sys/evtchn.h>
 #include <xen/sys/gntalloc.h>
 #include <xen/sys/gntdev.h>
index 2adbdfe29d11f0ef72bfec84653b6fb351cb8162..d6010b145df299a62cf17f7318edebcdbc4a4e89 100644 (file)
@@ -43,6 +43,7 @@
  */
 
 #include <xen/io/libxenvchan.h>
+#include <xen/xen.h>
 #include <xen/sys/evtchn.h>
 #include <xenevtchn.h>
 #include <xengnttab.h>