mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
xl/libxl: add pvcalls support
Add pvcalls support to libxl and xl. Create the appropriate pvcalls entries in xenstore. Signed-off-by: Stefano Stabellini <stefano@aporeto.com> Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
a92fd9a445
commit
6bbcb226ce
9 files changed
+106
-2
No files matched your search
@@ -299,6 +299,11 @@ A virtual scsi device frontend. Described by
|
||||
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)
|
||||
@@ -378,6 +383,10 @@ A PV SCSI backend.
|
||||
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)
|
||||
|
||||
@@ -140,7 +140,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \
|
||||
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
|
||||
|
||||
|
||||
@@ -2013,6 +2013,16 @@ int libxl_device_p9_destroy(libxl_ctx *ctx, uint32_t domid,
|
||||
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,
|
||||
|
||||
@@ -1374,6 +1374,10 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *multidev,
|
||||
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:
|
||||
{
|
||||
|
||||
@@ -3650,6 +3650,7 @@ extern const struct libxl_device_type libxl__usbdev_devtype;
|
||||
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[];
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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);
|
||||
@@ -790,6 +790,12 @@ libxl_device_p9 = Struct("device_p9", [
|
||||
("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),
|
||||
@@ -829,6 +835,7 @@ libxl_domain_config = Struct("domain_config", [
|
||||
("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
|
||||
|
||||
@@ -28,6 +28,7 @@ libxl__device_kind = Enumeration("device_kind", [
|
||||
(11, "9PFS"),
|
||||
(12, "VDISPL"),
|
||||
(13, "VUART"),
|
||||
(14, "PVCALLS"),
|
||||
])
|
||||
|
||||
libxl__console_backend = Enumeration("console_backend", [
|
||||
|
||||
+36
-1
@@ -860,7 +860,7 @@ void parse_config_data(const char *config_source,
|
||||
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;
|
||||
@@ -1691,6 +1691,41 @@ void parse_config_data(const char *config_source,
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||