A virtual usb device frontend. Described by
[xen/include/public/io/usbif.h][USBIF]
+#### ~/device/pvcalls/$DEVID/* []
+
+Paravirtualized POSIX function calls frontend. Described by
+[docs/misc/pvcalls.markdown][PVCALLS]
+
#### ~/console/* []
The primary PV console device. Described in [console.txt](console.txt)
A PV USB backend. Described by
[xen/include/public/io/usbif.h][USBIF]
+#### ~/backend/pvcalls/$DOMID/$DEVID/* []
+
+A PVCalls backend. Described in [docs/misc/pvcalls.markdown][PVCALLS].
+
#### ~/backend/console/$DOMID/$DEVID/* []
A PV console backend. Described in [console.txt](console.txt)
libxl_vtpm.o libxl_nic.o libxl_disk.o libxl_console.o \
libxl_cpupool.o libxl_mem.o libxl_sched.o libxl_tmem.o \
libxl_9pfs.o libxl_domain.o libxl_vdispl.o \
- $(LIBXL_OBJS-y)
+ libxl_pvcalls.o $(LIBXL_OBJS-y)
LIBXL_OBJS += libxl_genid.o
LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o
const libxl_asyncop_how *ao_how)
LIBXL_EXTERNAL_CALLERS_ONLY;
+/* pvcalls interface */
+int libxl_device_pvcallsif_remove(libxl_ctx *ctx, uint32_t domid,
+ libxl_device_pvcallsif *pvcallsif,
+ const libxl_asyncop_how *ao_how)
+ LIBXL_EXTERNAL_CALLERS_ONLY;
+int libxl_device_pvcallsif_destroy(libxl_ctx *ctx, uint32_t domid,
+ libxl_device_pvcallsif *pvcallsif,
+ const libxl_asyncop_how *ao_how)
+ LIBXL_EXTERNAL_CALLERS_ONLY;
+
/* PCI Passthrough */
int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid,
libxl_device_pci *pcidev,
for (i = 0; i < d_config->num_p9s; i++)
libxl__device_add(gc, domid, &libxl__p9_devtype, &d_config->p9s[i]);
+ for (i = 0; i < d_config->num_pvcallsifs; i++)
+ libxl__device_add(gc, domid, &libxl__pvcallsif_devtype,
+ &d_config->pvcallsifs[i]);
+
switch (d_config->c_info.type) {
case LIBXL_DOMAIN_TYPE_HVM:
{
extern const struct libxl_device_type libxl__pcidev_devtype;
extern const struct libxl_device_type libxl__vdispl_devtype;
extern const struct libxl_device_type libxl__p9_devtype;
+extern const struct libxl_device_type libxl__pvcallsif_devtype;
extern const struct libxl_device_type *device_type_tbl[];
--- /dev/null
+/*
+ * Copyright (C) 2018 Aporeto
+ * Author Stefano Stabellini <stefano@aporeto.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#include "libxl_osdeps.h"
+
+#include "libxl_internal.h"
+
+static int libxl__device_pvcallsif_setdefault(libxl__gc *gc, uint32_t domid,
+ libxl_device_pvcallsif *pvcallsif,
+ bool hotplug)
+{
+ return libxl__resolve_domid(gc, pvcallsif->backend_domname,
+ &pvcallsif->backend_domid);
+}
+
+static LIBXL_DEFINE_UPDATE_DEVID(pvcallsif)
+static LIBXL_DEFINE_DEVICE_FROM_TYPE(pvcallsif)
+
+#define libxl__add_pvcallsifs NULL
+#define libxl_device_pvcallsif_list NULL
+#define libxl_device_pvcallsif_compare NULL
+
+LIBXL_DEFINE_DEVICE_REMOVE(pvcallsif)
+
+DEFINE_DEVICE_TYPE_STRUCT(pvcallsif, PVCALLS);
("devid", libxl_devid),
])
+libxl_device_pvcallsif = Struct("device_pvcallsif", [
+ ("backend_domid", libxl_domid),
+ ("backend_domname", string),
+ ("devid", libxl_devid),
+])
+
libxl_device_channel = Struct("device_channel", [
("backend_domid", libxl_domid),
("backend_domname", string),
("vkbs", Array(libxl_device_vkb, "num_vkbs")),
("vtpms", Array(libxl_device_vtpm, "num_vtpms")),
("p9s", Array(libxl_device_p9, "num_p9s")),
+ ("pvcallsifs", Array(libxl_device_pvcallsif, "num_pvcallsifs")),
("vdispls", Array(libxl_device_vdispl, "num_vdispls")),
# a channel manifests as a console with a name,
# see docs/misc/channels.txt
(11, "9PFS"),
(12, "VDISPL"),
(13, "VUART"),
+ (14, "PVCALLS"),
])
libxl__console_backend = Enumeration("console_backend", [
long l, vcpus = 0;
XLU_Config *config;
XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms,
- *usbctrls, *usbdevs, *p9devs, *vdispls;
+ *usbctrls, *usbdevs, *p9devs, *vdispls, *pvcallsifs_devs;
XLU_ConfigList *channels, *ioports, *irqs, *iomem, *viridian, *dtdevs,
*mca_caps;
int num_ioports, num_irqs, num_iomem, num_cpus, num_viridian, num_mca_caps;
}
}
+ if (!xlu_cfg_get_list(config, "pvcalls", &pvcallsifs_devs, 0, 0)) {
+ d_config->num_pvcallsifs = 0;
+ d_config->pvcallsifs = NULL;
+ while ((buf = xlu_cfg_get_listitem (pvcallsifs_devs, d_config->num_pvcallsifs)) != NULL) {
+ libxl_device_pvcallsif *pvcallsif;
+ char *backend = NULL;
+ char *p, *p2, *buf2;
+ pvcallsif = ARRAY_EXTEND_INIT(d_config->pvcallsifs,
+ d_config->num_pvcallsifs,
+ libxl_device_pvcallsif_init);
+
+ buf2 = strdup(buf);
+ p = strtok(buf2, ",");
+ if (p) {
+ do {
+ while (*p == ' ')
+ ++p;
+ if ((p2 = strchr(p, '=')) == NULL)
+ break;
+ *p2 = '\0';
+ if(!strcmp(p, "backend")) {
+ backend = strdup(p2 + 1);
+ } else {
+ fprintf(stderr, "Unknown string `%s' in pvcalls spec\n", p);
+ exit(1);
+ }
+ } while ((p = strtok(NULL, ",")) != NULL);
+ }
+ free(buf2);
+
+ if (backend)
+ replace_string(&pvcallsif->backend_domname, backend);
+ }
+ }
+
if (!xlu_cfg_get_list (config, "channel", &channels, 0, 0)) {
d_config->num_channels = 0;
d_config->channels = NULL;