Skip to content

Commit

Permalink
libxl/xl: add cacheability option to iomem
Browse files Browse the repository at this point in the history
Parse a new cacheability option for the iomem parameter, it can be
"devmem" for device memory mappings, which is the default, or "memory"
for normal memory mappings.

Store the parameter in a new field in libxl_iomem_range.

Pass the cacheability option to xc_domain_memory_mapping.

Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>
CC: ian.jackson@eu.citrix.com
CC: wei.liu2@citrix.com
  • Loading branch information
sstabellini authored and Stefano Stabellini committed Dec 17, 2021
1 parent a0ff289 commit 67bb93d
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 4 deletions.
4 changes: 3 additions & 1 deletion docs/man/xl.cfg.5.pod.in
Expand Up @@ -1271,7 +1271,7 @@ is given in hexadecimal format and may either be a range, e.g. C<2f8-2ff>
It is recommended to only use this option for trusted VMs under
administrator's control.

=item B<iomem=[ "IOMEM_START,NUM_PAGES[@GFN]", "IOMEM_START,NUM_PAGES[@GFN]", ...]>
=item B<iomem=[ "IOMEM_START,NUM_PAGES[@GFN],CACHEABILITY", "IOMEM_START,NUM_PAGES[@GFN],CACHEABILITY", ...]>

Allow auto-translated domains to access specific hardware I/O memory pages.

Expand All @@ -1282,6 +1282,8 @@ B<GFN> is not specified, the mapping will be performed using B<IOMEM_START>
as a start in the guest's address space, therefore performing a 1:1 mapping
by default.
All of these values must be given in hexadecimal format.
B<CACHEABILITY> can be "devmem" for device memory, the default if not
specified, or it can be "memory" for normal memory.

Note that the IOMMU won't be updated with the mappings specified with this
option. This option therefore should not be used to pass through any
Expand Down
12 changes: 11 additions & 1 deletion tools/libs/light/libxl_create.c
Expand Up @@ -491,6 +491,14 @@ static void init_console_info(libxl__gc *gc,
Only 'channels' when mapped to consoles have a string name. */
}

static uint32_t libxl__cacheability_to_xc(libxl_cacheability c)
{
if (c == LIBXL_CACHEABILITY_MEMORY)
return CACHEABILITY_MEMORY;
/* default to devmem */
return CACHEABILITY_DEVMEM;
}

int libxl__domain_build(libxl__gc *gc,
libxl_domain_config *d_config,
uint32_t domid,
Expand Down Expand Up @@ -1719,7 +1727,9 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *multidev,
}
ret = xc_domain_memory_mapping(CTX->xch, domid,
io->gfn, io->start,
io->number, 1, CACHEABILITY_DEVMEM);
io->number, 1,
libxl__cacheability_to_xc(
io->cache_policy));
if (ret < 0) {
LOGED(ERROR, domid,
"failed to map to domain iomem range %"PRIx64"-%"PRIx64
Expand Down
7 changes: 7 additions & 0 deletions tools/libs/light/libxl_types.idl
Expand Up @@ -283,13 +283,20 @@ libxl_ioport_range = Struct("ioport_range", [
("number", uint32),
])

libxl_cacheability = Enumeration("cacheability", [
(0, "devmem"),
(1, "memory"),
], init_val = "LIBXL_CACHEABILITY_DEVMEM")

libxl_iomem_range = Struct("iomem_range", [
# start host frame number to be mapped to the guest
("start", uint64),
# number of frames to be mapped
("number", uint64),
# guest frame number used as a start for the mapping
("gfn", uint64, {'init_val': "LIBXL_INVALID_GFN"}),
# cacheability of the memory region
("cache_policy", libxl_cacheability),
])

libxl_vga_interface_info = Struct("vga_interface_info", [
Expand Down
17 changes: 15 additions & 2 deletions tools/xl/xl_parse.c
Expand Up @@ -1970,6 +1970,7 @@ void parse_config_data(const char *config_source,
}
for (i = 0; i < num_iomem; i++) {
int used;
char cache[7];

buf = xlu_cfg_get_listitem (iomem, i);
if (!buf) {
Expand All @@ -1978,15 +1979,27 @@ void parse_config_data(const char *config_source,
exit(1);
}
libxl_iomem_range_init(&b_info->iomem[i]);
ret = sscanf(buf, "%" SCNx64",%" SCNx64"%n@%" SCNx64"%n",
ret = sscanf(buf, "%" SCNx64",%" SCNx64"%n@%" SCNx64"%n,%6s%n",
&b_info->iomem[i].start,
&b_info->iomem[i].number, &used,
&b_info->iomem[i].gfn, &used);
&b_info->iomem[i].gfn, &used,
cache, &used);
if (ret < 2 || buf[used] != '\0') {
fprintf(stderr,
"xl: Invalid argument parsing iomem: %s\n", buf);
exit(1);
}
if (ret == 4) {
if (!strcmp(cache, "memory"))
b_info->iomem[i].cache_policy = LIBXL_CACHEABILITY_MEMORY;
else if (!strcmp(cache, "devmem"))
b_info->iomem[i].cache_policy = LIBXL_CACHEABILITY_DEVMEM;
else {
fprintf(stderr,
"xl: Invalid iomem cache parameter: %s\n", cache);
exit(1);
}
}
}
}

Expand Down

0 comments on commit 67bb93d

Please sign in to comment.