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.
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
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,
}
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
("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", 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", [
}
for (i = 0; i < num_iomem; i++) {
int used;
+ char cache[7];
buf = xlu_cfg_get_listitem (iomem, i);
if (!buf) {
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);
+ }
+ }
}
}