From 67bb93dd0fd338aeef624233fc1793c64b6ab0df Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Tue, 26 Feb 2019 15:00:28 -0800 Subject: [PATCH] libxl/xl: add cacheability option to iomem 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 CC: ian.jackson@eu.citrix.com CC: wei.liu2@citrix.com --- docs/man/xl.cfg.5.pod.in | 4 +++- tools/libs/light/libxl_create.c | 12 +++++++++++- tools/libs/light/libxl_types.idl | 7 +++++++ tools/xl/xl_parse.c | 17 +++++++++++++++-- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in index aef8b8aff2..5adecab002 100644 --- a/docs/man/xl.cfg.5.pod.in +++ b/docs/man/xl.cfg.5.pod.in @@ -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 +=item B Allow auto-translated domains to access specific hardware I/O memory pages. @@ -1282,6 +1282,8 @@ B is not specified, the mapping will be performed using B 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 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 diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c index 57b4969ba4..681e19a730 100644 --- a/tools/libs/light/libxl_create.c +++ b/tools/libs/light/libxl_create.c @@ -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, @@ -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 diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl index 0d08b62cca..e8c946c7e6 100644 --- a/tools/libs/light/libxl_types.idl +++ b/tools/libs/light/libxl_types.idl @@ -283,6 +283,11 @@ 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), @@ -290,6 +295,8 @@ libxl_iomem_range = Struct("iomem_range", [ ("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", [ diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c index ed73a90565..e6c7b69ebb 100644 --- a/tools/xl/xl_parse.c +++ b/tools/xl/xl_parse.c @@ -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) { @@ -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); + } + } } }