mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xl: add support to parse generic virtio device
This patch adds basic support for parsing generic Virtio backend. An example of domain configuration for mmio based Virtio I2C device is: virtio = ["type=virtio,device22,transport=mmio"] Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
1 parent
43ba5202e2
commit
953efa0b7b
1 file changed
+81
@@ -1208,6 +1208,83 @@ out:
|
||||
if (rc) exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static int parse_virtio_config(libxl_device_virtio *virtio, char *token)
|
||||
{
|
||||
char *oparg;
|
||||
int rc;
|
||||
|
||||
if (MATCH_OPTION("backend", token, oparg)) {
|
||||
virtio->backend_domname = strdup(oparg);
|
||||
} else if (MATCH_OPTION("type", token, oparg)) {
|
||||
virtio->type = strdup(oparg);
|
||||
} else if (MATCH_OPTION("transport", token, oparg)) {
|
||||
rc = libxl_virtio_transport_from_string(oparg, &virtio->transport);
|
||||
if (rc) return rc;
|
||||
} else {
|
||||
fprintf(stderr, "Unknown string \"%s\" in virtio spec\n", token);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void parse_virtio_list(const XLU_Config *config,
|
||||
libxl_domain_config *d_config)
|
||||
{
|
||||
XLU_ConfigList *virtios;
|
||||
const char *item;
|
||||
char *buf = NULL, *oparg, *str = NULL;
|
||||
int rc;
|
||||
|
||||
if (!xlu_cfg_get_list (config, "virtio", &virtios, 0, 0)) {
|
||||
int entry = 0;
|
||||
while ((item = xlu_cfg_get_listitem(virtios, entry)) != NULL) {
|
||||
libxl_device_virtio *virtio;
|
||||
char *p;
|
||||
|
||||
virtio = ARRAY_EXTEND_INIT(d_config->virtios, d_config->num_virtios,
|
||||
libxl_device_virtio_init);
|
||||
|
||||
buf = strdup(item);
|
||||
|
||||
p = strtok(buf, ",");
|
||||
while (p != NULL)
|
||||
{
|
||||
while (*p == ' ') p++;
|
||||
|
||||
// Type may contain a comma, do special handling.
|
||||
if (MATCH_OPTION("type", p, oparg)) {
|
||||
if (!strncmp(oparg, "virtio", strlen("virtio"))) {
|
||||
char *p2 = strtok(NULL, ",");
|
||||
str = malloc(strlen(p) + strlen(p2) + 2);
|
||||
|
||||
strcpy(str, p);
|
||||
strcat(str, ",");
|
||||
strcat(str, p2);
|
||||
p = str;
|
||||
}
|
||||
}
|
||||
|
||||
rc = parse_virtio_config(virtio, p);
|
||||
if (rc) goto out;
|
||||
|
||||
free(str);
|
||||
str = NULL;
|
||||
p = strtok(NULL, ",");
|
||||
}
|
||||
|
||||
entry++;
|
||||
free(buf);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
out:
|
||||
free(buf);
|
||||
if (rc) exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void parse_config_data(const char *config_source,
|
||||
const char *config_data,
|
||||
int config_len,
|
||||
@@ -2753,6 +2830,10 @@ skip_usbdev:
|
||||
|
||||
parse_vkb_list(config, d_config);
|
||||
|
||||
d_config->virtios = NULL;
|
||||
d_config->num_virtios = 0;
|
||||
parse_virtio_list(config, d_config);
|
||||
|
||||
xlu_cfg_get_defbool(config, "xend_suspend_evtchn_compat",
|
||||
&c_info->xend_suspend_evtchn_compat, 0);
|
||||
|
||||
|
||||