[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
Description: S/MIME Cryptographic Signature

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.