[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 09/11] add iomem support to libxl
On 10/02/2012 09:34 AM, Ian Campbell wrote: > On Thu, 2012-09-27 at 18:10 +0100, Matthew Fioravante wrote: >> This patch adds a new option for xen config files for >> directly mapping hardware io memory into a vm. >> >> Signed-off-by: Matthew Fioravante <matthew.fioravante@xxxxxxxxxx> >> >> diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 >> index 013270d..428da21 100644 >> --- a/docs/man/xl.cfg.pod.5 >> +++ b/docs/man/xl.cfg.pod.5 >> @@ -496,6 +496,17 @@ is given in hexadecimal and may either a span e.g. >> C<2f8-2ff> >> It is recommended to use this option only for trusted VMs under >> administrator control. >> >> +=item B<iomem=[ "IOMEM_START,NUM_PAGES", "IOMEM_START,NUM_PAGES", ... ]> >> + >> +Allow guest to access specific hardware I/O memory pages. B<IOMEM_START> >> +is a physical page number. B<NUM_PAGES> is the number >> +of pages beginning with B<START_PAGE> to allow access. Both values >> +must be given in hexadecimal. >> + >> +It is recommended to use this option only for trusted VMs under >> +administrator control. >> + >> + >> =item B<irqs=[ NUMBER, NUMBER, ... ]> >> >> Allow a guest to access specific physical IRQs. >> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c >> index ef17f05..6cb586b 100644 >> --- a/tools/libxl/libxl_create.c >> +++ b/tools/libxl/libxl_create.c >> @@ -963,6 +963,24 @@ static void domcreate_launch_dm(libxl__egc *egc, >> libxl__multidev *multidev, >> } >> } >> >> + for (i = 0; i < d_config->b_info.num_iomem; i++) { >> + libxl_iomem_range *io = &d_config->b_info.iomem[i]; >> + >> + LOG(DEBUG, "dom%d iomem %"PRIx64"-%"PRIx64, >> + domid, io->start, io->start + io->number - 1); >> + >> + ret = xc_domain_iomem_permission(CTX->xch, domid, >> + io->start, io->number, 1); >> + if ( ret<0 ) { > This should be > if (ret < 0) { Looks like it was like that also for ioports and irqs. I fixed all 3. > >> + LOGE(ERROR, >> + "failed give dom%d access to iomem range >> %"PRIx64"-%"PRIx64, >> + domid, io->start, io->start + io->number - 1); >> + ret = ERROR_FAIL; >> + } >> + } >> + >> + >> + >> for (i = 0; i < d_config->num_nics; i++) { >> /* We have to init the nic here, because we still haven't >> * called libxl_device_nic_add at this point, but qemu needs >> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl >> index 6d5c578..cf83c60 100644 >> --- a/tools/libxl/libxl_types.idl >> +++ b/tools/libxl/libxl_types.idl >> @@ -140,6 +140,11 @@ libxl_ioport_range = Struct("ioport_range", [ >> ("number", uint32), >> ]) >> >> +libxl_iomem_range = Struct("iomem_range", [ >> + ("start", uint64), >> + ("number", uint64), >> + ]) >> + >> libxl_vga_interface_info = Struct("vga_interface_info", [ >> ("kind", libxl_vga_interface_type), >> ]) >> @@ -284,6 +289,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ >> >> ("ioports", Array(libxl_ioport_range, "num_ioports")), >> ("irqs", Array(uint32, "num_irqs")), >> + ("iomem", Array(libxl_iomem_range, "num_iomem")), >> >> ("u", KeyedUnion(None, libxl_domain_type, "type", >> [("hvm", Struct(None, [("firmware", string), >> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c >> index 1627cac..fe8e925 100644 >> --- a/tools/libxl/xl_cmdimpl.c >> +++ b/tools/libxl/xl_cmdimpl.c >> @@ -574,8 +574,8 @@ static void parse_config_data(const char *config_source, >> long l; >> XLU_Config *config; >> XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids; >> - XLU_ConfigList *ioports, *irqs; >> - int num_ioports, num_irqs; >> + XLU_ConfigList *ioports, *irqs, *iomem; >> + int num_ioports, num_irqs, num_iomem; >> int pci_power_mgmt = 0; >> int pci_msitranslate = 0; >> int pci_permissive = 0; >> @@ -1005,6 +1005,30 @@ static void parse_config_data(const char >> *config_source, >> } >> } >> >> + if (!xlu_cfg_get_list(config, "iomem", &iomem, &num_iomem, 0)) { >> + b_info->num_iomem = num_iomem; >> + b_info->iomem = calloc(num_iomem, sizeof(*b_info->iomem)); >> + if (b_info->iomem == NULL) { >> + fprintf(stderr, "unable to allocate memory for iomem\n"); >> + exit(-1); >> + } >> + for (i = 0; i < num_iomem; i++) { >> + buf = xlu_cfg_get_listitem (iomem, i); >> + if (!buf) { >> + fprintf(stderr, >> + "xl: Unable to get element %d in iomem list\n", i); >> + exit(1); >> + } >> + if(sscanf(buf, "%" SCNx64",%" SCNx64, &b_info->iomem[i].start, >> &b_info->iomem[i].number) != 2) { > Can we split this over multiple lines please, to keep it under the 75-80 > column limit mention in coding style. fixed > >> + fprintf(stderr, >> + "xl: Invalid argument parsing iomem: %s\n", buf); >> + exit(1); >> + } >> + } >> + } >> + >> + >> + >> if (!xlu_cfg_get_list (config, "disk", &vbds, 0, 0)) { >> d_config->num_disks = 0; >> d_config->disks = NULL; > Attachment:
smime.p7s _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |