[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/5] xen/arm: copy dtb fragment to guest dtb



On Mon, 24 Dec 2018, Julien Grall wrote:
> (+ Wei and Ian)
> 
> Hi Stefano,
> 
> On 12/5/18 5:28 PM, Stefano Stabellini wrote:
> > Read the dtb fragment corresponding to a passthrough device from memory
> > at the location referred to by the "multiboot,dtb" compatible node.
> > 
> > Copy the fragment to the guest dtb.
> > 
> > Add a dtb_bootmodule field to struct kernel_info to find the dtb
> > fragment for a guest.
> 
> The code below is basically a copy from libxl, right? If so, this should be
> specified in the commit message.
> 
> Also, the license is different in libxl compare to the hypervisor (LGPLv2.1 vs
> GPLv2). So is there any issue to copy that code in the hypervisor?

Wei confirmed that it is OK. I'll add a note about this in the commit
message.


> > 
> > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
> > ---
> >   xen/arch/arm/domain_build.c  | 77
> > ++++++++++++++++++++++++++++++++++++++++++++
> >   xen/include/asm-arm/kernel.h |  2 +-
> >   2 files changed, 78 insertions(+), 1 deletion(-)
> > 
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index b0ec3f0..cc6b464 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -14,6 +14,7 @@
> >   #include <xen/guest_access.h>
> >   #include <xen/iocap.h>
> >   #include <xen/acpi.h>
> > +#include <xen/vmap.h>
> >   #include <xen/warning.h>
> >   #include <acpi/actables.h>
> >   #include <asm/device.h>
> > @@ -1669,6 +1670,59 @@ static int __init make_vpl011_uart_node(const struct
> > domain *d, void *fdt)
> >   }
> >   #endif
> >   +static int __init copy_properties(void *fdt, void *pfdt, int nodeoff)
> > +{
> > +    int propoff, nameoff, r;
> > +    const struct fdt_property *prop;
> > +
> > +    for ( propoff = fdt_first_property_offset(pfdt, nodeoff);
> > +          propoff >= 0;
> > +          propoff = fdt_next_property_offset(pfdt, propoff) ) {
> 
> Coding style:
> 
> for ( ... )
> {

OK


> > +
> > +        if ( !(prop = fdt_get_property_by_offset(pfdt, propoff, NULL)) )
> > +            return -FDT_ERR_INTERNAL;
> > +
> > +        nameoff = fdt32_to_cpu(prop->nameoff);
> > +        r = fdt_property(fdt, fdt_string(pfdt, nameoff),
> > +                         prop->data, fdt32_to_cpu(prop->len));
> > +        if ( r )
> > +            return r;
> > +    }
> > +
> > +    /* FDT_ERR_NOTFOUND => There is no more properties for this node */
> > +    return ( propoff != -FDT_ERR_NOTFOUND ) ? propoff : 0;
> > +}
> > +
> > +static int __init copy_node(void *fdt, void *pfdt, int nodeoff, int depth)
> > +{
> > +    int r;
> > +
> > +    r = fdt_begin_node(fdt, fdt_get_name(pfdt, nodeoff, NULL));
> > +    if ( r )
> > +        return r;
> > +
> > +    r = copy_properties(fdt, pfdt, nodeoff);
> > +    if ( r )
> > +        return r;
> > +
> > +    for ( nodeoff = fdt_first_subnode(pfdt, nodeoff);
> > +          nodeoff >= 0;
> > +          nodeoff = fdt_next_subnode(pfdt, nodeoff) ) {
> 
> Same here.

OK


> > +        r = copy_node(fdt, pfdt, nodeoff, depth + 1);
> > +        if ( r )
> > +            return r;
> > +    }
> > +
> > +    if ( nodeoff != -FDT_ERR_NOTFOUND )
> > +        return nodeoff;
> > +
> > +    r = fdt_end_node(fdt);
> > +    if ( r )
> > +        return r;
> > +
> > +    return 0;
> > +}
> > +
> >   /*
> >    * The max size for DT is 2MB. However, the generated DT is small, 4KB
> >    * are enough for now, but we might have to increase it in the future.
> > @@ -1740,6 +1794,29 @@ static int __init prepare_dtb_domU(struct domain *d,
> > struct kernel_info *kinfo)
> >               goto err;
> >       }
> >   +    if ( kinfo->dtb_bootmodule ) {
> > +        int nodeoff, res;
> > +        void *pfdt;
> > +
> > +        pfdt = ioremap_cache(kinfo->dtb_bootmodule->start,
> > +                             kinfo->dtb_bootmodule->size);
> 
> This suggests the DTB fragment should be cacheable. Can this be written in the
> documentation?

OK


> > +        if ( pfdt == NULL )
> > +            return -EFAULT;
> > +
> > +        if ( fdt_magic(pfdt) != FDT_MAGIC )
> > +            return -EINVAL;
> > +
> > +        nodeoff = fdt_path_offset(pfdt, "/passthrough");
> > +        if (nodeoff < 0)
> > +            return nodeoff;
> > +
> > +        res = copy_node(kinfo->fdt, pfdt, nodeoff, 0);
> > +        if ( res )
> > +            return res;
> 
> I would also copy /aliases as it may be used by the users to refer easily a
> node.

OK


> > +
> > +        iounmap(pfdt);
> > +    }
> > +
> >       ret = fdt_end_node(kinfo->fdt);
> >       if ( ret < 0 )
> >           goto err;
> > diff --git a/xen/include/asm-arm/kernel.h b/xen/include/asm-arm/kernel.h
> > index 33f3e72..720dec4 100644
> > --- a/xen/include/asm-arm/kernel.h
> > +++ b/xen/include/asm-arm/kernel.h
> > @@ -28,7 +28,7 @@ struct kernel_info {
> >       paddr_t gnttab_size;
> >         /* boot blob load addresses */
> > -    const struct bootmodule *kernel_bootmodule, *initrd_bootmodule;
> > +    const struct bootmodule *kernel_bootmodule, *initrd_bootmodule,
> > *dtb_bootmodule;
> >       const char* cmdline;
> >       paddr_t dtb_paddr;
> >       paddr_t initrd_paddr;
> > 
> 
> Cheers,
> 
> -- 
> Julien Grall
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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