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:
Viresh Kumar authored and Jan Beulich committed 2022-12-14 12:03:25 +01:00
1 parent 43ba5202e2
commit 953efa0b7b
1 file changed
+81
+81
View File
@@ -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);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.