[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging] libs/devicemodel: add dm_op support for FreeBSD



commit bbf71e99f01b883ebf1c60209b99953c1b95d8a0
Author:     Roger Pau Monne <roger.pau@xxxxxxxxxx>
AuthorDate: Tue Jan 5 11:25:46 2021 +0100
Commit:     Wei Liu <wl@xxxxxxx>
CommitDate: Tue Jan 5 12:33:55 2021 +0000

    libs/devicemodel: add dm_op support for FreeBSD
    
    The FreeBSD ioctls have the same fields has the Linux ones, so the
    same file can be shared between both OSes.
    
    No functional change for OSes different than FreeBSD.
    
    Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
    Acked-by: Wei Liu <wl@xxxxxxx>
---
 tools/include/xen-sys/FreeBSD/privcmd.h |  15 ++++
 tools/libs/devicemodel/Makefile         |   4 +-
 tools/libs/devicemodel/common.c         | 138 ++++++++++++++++++++++++++++++++
 tools/libs/devicemodel/linux.c          | 138 --------------------------------
 4 files changed, 155 insertions(+), 140 deletions(-)

diff --git a/tools/include/xen-sys/FreeBSD/privcmd.h 
b/tools/include/xen-sys/FreeBSD/privcmd.h
index 603aad67d5..649ad443c7 100644
--- a/tools/include/xen-sys/FreeBSD/privcmd.h
+++ b/tools/include/xen-sys/FreeBSD/privcmd.h
@@ -66,12 +66,27 @@ struct ioctl_privcmd_mmapresource {
 };
 typedef struct ioctl_privcmd_mmapresource privcmd_mmap_resource_t;
 
+struct privcmd_dmop_buf {
+       void *uptr; /* pointer to memory (in calling process) */
+       size_t size; /* size of the buffer */
+};
+typedef struct privcmd_dmop_buf privcmd_dm_op_buf_t;
+
+struct ioctl_privcmd_dmop {
+       domid_t dom; /* target domain */
+       unsigned int num; /* num of buffers */
+       const struct privcmd_dmop_buf *ubufs; /* array of buffers */
+};
+typedef struct ioctl_privcmd_dmop privcmd_dm_op_t;
+
 #define IOCTL_PRIVCMD_HYPERCALL                                        \
        _IOWR('E', 0, struct ioctl_privcmd_hypercall)
 #define IOCTL_PRIVCMD_MMAPBATCH                                        \
        _IOWR('E', 1, struct ioctl_privcmd_mmapbatch)
 #define IOCTL_PRIVCMD_MMAP_RESOURCE                            \
        _IOW('E', 2, struct ioctl_privcmd_mmapresource)
+#define IOCTL_PRIVCMD_DM_OP                                    \
+       _IOW('E', 3, struct ioctl_privcmd_dmop)
 #define IOCTL_PRIVCMD_RESTRICT                                 \
        _IOW('E', 4, domid_t)
 
diff --git a/tools/libs/devicemodel/Makefile b/tools/libs/devicemodel/Makefile
index b67fc0fac1..500de7adc5 100644
--- a/tools/libs/devicemodel/Makefile
+++ b/tools/libs/devicemodel/Makefile
@@ -5,8 +5,8 @@ MAJOR    = 1
 MINOR    = 3
 
 SRCS-y                 += core.c
-SRCS-$(CONFIG_Linux)   += linux.c
-SRCS-$(CONFIG_FreeBSD) += compat.c
+SRCS-$(CONFIG_Linux)   += common.c
+SRCS-$(CONFIG_FreeBSD) += common.c
 SRCS-$(CONFIG_SunOS)   += compat.c
 SRCS-$(CONFIG_NetBSD)  += compat.c
 SRCS-$(CONFIG_MiniOS)  += compat.c
diff --git a/tools/libs/devicemodel/common.c b/tools/libs/devicemodel/common.c
new file mode 100644
index 0000000000..0fdc7121f1
--- /dev/null
+++ b/tools/libs/devicemodel/common.c
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2017 Citrix Systems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <xen/xen.h>
+#include <xen/sys/privcmd.h>
+
+#include "private.h"
+
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
+int osdep_xendevicemodel_open(xendevicemodel_handle *dmod)
+{
+    int fd = open("/dev/xen/privcmd", O_RDWR | O_CLOEXEC);
+    privcmd_dm_op_t uop;
+    int rc;
+
+    if (fd < 0) {
+        /*
+         * If the 'new' privcmd interface doesn't exist then don't treat
+         * this as an error, but an old privcmd clearly won't implement
+         * IOCTL_PRIVCMD_DM_OP so don't bother trying to open it.
+         */
+        if (errno == ENOENT || errno == ENXIO || errno == ENODEV)
+            goto out;
+
+        PERROR("Could not obtain handle on privileged command interface");
+        return -1;
+    }
+
+    /*
+     * Check to see if IOCTL_PRIVCMD_DM_OP is implemented as we want to
+     * use that in preference to libxencall.
+     */
+    uop.dom = DOMID_INVALID;
+    uop.num = 0;
+    uop.ubufs = NULL;
+
+    rc = ioctl(fd, IOCTL_PRIVCMD_DM_OP, &uop);
+    if (rc < 0) {
+        close(fd);
+        fd = -1;
+    }
+
+out:
+    dmod->fd = fd;
+    return 0;
+}
+
+int osdep_xendevicemodel_close(xendevicemodel_handle *dmod)
+{
+    if (dmod->fd < 0)
+        return 0;
+
+    return close(dmod->fd);
+}
+
+int osdep_xendevicemodel_op(xendevicemodel_handle *dmod,
+                            domid_t domid, unsigned int nr_bufs,
+                            struct xendevicemodel_buf bufs[])
+{
+    privcmd_dm_op_buf_t *ubufs;
+    privcmd_dm_op_t uop;
+    unsigned int i;
+    int rc;
+
+    if (dmod->fd < 0)
+        return xendevicemodel_xcall(dmod, domid, nr_bufs, bufs);
+
+    ubufs = calloc(nr_bufs, sizeof (*ubufs));
+    if (!ubufs)
+        return -1;
+
+    for (i = 0; i < nr_bufs; i++) {
+        ubufs[i].uptr = bufs[i].ptr;
+        ubufs[i].size = bufs[i].size;
+    }
+
+    uop.dom = domid;
+    uop.num = nr_bufs;
+    uop.ubufs = ubufs;
+
+    rc = ioctl(dmod->fd, IOCTL_PRIVCMD_DM_OP, &uop);
+
+    free(ubufs);
+
+    if (rc < 0)
+        return -1;
+
+    return 0;
+}
+
+int osdep_xendevicemodel_restrict(xendevicemodel_handle *dmod,
+                                  domid_t domid)
+{
+    if (dmod->fd < 0) {
+        errno = EOPNOTSUPP;
+        return -1;
+    }
+
+    return ioctl(dmod->fd, IOCTL_PRIVCMD_RESTRICT, &domid);
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/tools/libs/devicemodel/linux.c b/tools/libs/devicemodel/linux.c
deleted file mode 100644
index 0fdc7121f1..0000000000
--- a/tools/libs/devicemodel/linux.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 2017 Citrix Systems Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <xen/xen.h>
-#include <xen/sys/privcmd.h>
-
-#include "private.h"
-
-#ifndef O_CLOEXEC
-#define O_CLOEXEC 0
-#endif
-
-int osdep_xendevicemodel_open(xendevicemodel_handle *dmod)
-{
-    int fd = open("/dev/xen/privcmd", O_RDWR | O_CLOEXEC);
-    privcmd_dm_op_t uop;
-    int rc;
-
-    if (fd < 0) {
-        /*
-         * If the 'new' privcmd interface doesn't exist then don't treat
-         * this as an error, but an old privcmd clearly won't implement
-         * IOCTL_PRIVCMD_DM_OP so don't bother trying to open it.
-         */
-        if (errno == ENOENT || errno == ENXIO || errno == ENODEV)
-            goto out;
-
-        PERROR("Could not obtain handle on privileged command interface");
-        return -1;
-    }
-
-    /*
-     * Check to see if IOCTL_PRIVCMD_DM_OP is implemented as we want to
-     * use that in preference to libxencall.
-     */
-    uop.dom = DOMID_INVALID;
-    uop.num = 0;
-    uop.ubufs = NULL;
-
-    rc = ioctl(fd, IOCTL_PRIVCMD_DM_OP, &uop);
-    if (rc < 0) {
-        close(fd);
-        fd = -1;
-    }
-
-out:
-    dmod->fd = fd;
-    return 0;
-}
-
-int osdep_xendevicemodel_close(xendevicemodel_handle *dmod)
-{
-    if (dmod->fd < 0)
-        return 0;
-
-    return close(dmod->fd);
-}
-
-int osdep_xendevicemodel_op(xendevicemodel_handle *dmod,
-                            domid_t domid, unsigned int nr_bufs,
-                            struct xendevicemodel_buf bufs[])
-{
-    privcmd_dm_op_buf_t *ubufs;
-    privcmd_dm_op_t uop;
-    unsigned int i;
-    int rc;
-
-    if (dmod->fd < 0)
-        return xendevicemodel_xcall(dmod, domid, nr_bufs, bufs);
-
-    ubufs = calloc(nr_bufs, sizeof (*ubufs));
-    if (!ubufs)
-        return -1;
-
-    for (i = 0; i < nr_bufs; i++) {
-        ubufs[i].uptr = bufs[i].ptr;
-        ubufs[i].size = bufs[i].size;
-    }
-
-    uop.dom = domid;
-    uop.num = nr_bufs;
-    uop.ubufs = ubufs;
-
-    rc = ioctl(dmod->fd, IOCTL_PRIVCMD_DM_OP, &uop);
-
-    free(ubufs);
-
-    if (rc < 0)
-        return -1;
-
-    return 0;
-}
-
-int osdep_xendevicemodel_restrict(xendevicemodel_handle *dmod,
-                                  domid_t domid)
-{
-    if (dmod->fd < 0) {
-        errno = EOPNOTSUPP;
-        return -1;
-    }
-
-    return ioctl(dmod->fd, IOCTL_PRIVCMD_RESTRICT, &domid);
-}
-
-/*
- * Local variables:
- * mode: C
- * c-file-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
--
generated by git-patchbot for /home/xen/git/xen.git#staging



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.