|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 4/8] xen/arm: copy dtb fragment to guest dtb
On Wed, 25 Sep 2019, Julien Grall wrote:
> On 24/09/2019 22:06, Stefano Stabellini wrote:
> > On Wed, 11 Sep 2019, Julien Grall wrote:
> > > On 8/21/19 4:53 AM, Stefano Stabellini wrote:
> > > > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
> > > >
> > > > ----
> > > > Changes in v4:
> > > > - use recursion in the implementation
> > > > - rename handle_properties to handle_prop_pfdt
> > > > - rename scan_pt_node to scan_pfdt_node
> > > > - pass kinfo to handle_properties
> > > > - use uint32_t instead of u32
> > > > - rename r to res
> > > > - add "passthrough" and "aliases" check
> > > > - add a name == NULL check
> > > > - code style
> > > > - move DTB fragment scanning earlier, before DomU GIC node creation
> > > > - set guest_phandle_gic based on "/gic"
> > > > - in-code comment
> > > >
> > > > Changes in v3:
> > > > - switch to using device_tree_for_each_node for the copy
> > > >
> > > > Changes in v2:
> > > > - add a note about the code coming from libxl in the commit message
> > > > - copy /aliases
> > > > - code style
> > > > ---
> > > > xen/arch/arm/domain_build.c | 112
> > > > +++++++++++++++++++++++++++++++++++
> > > > xen/include/asm-arm/kernel.h | 2 +-
> > > > 2 files changed, 113 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > > > index cd585f05ca..c71b9f2889 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>
> > > > @@ -1713,6 +1714,111 @@ static int __init make_vpl011_uart_node(struct
> > > > kernel_info *kinfo)
> > > > }
> > > > #endif
> > > > +static int __init handle_prop_pfdt(struct kernel_info *kinfo,
> > > > + const void *pfdt, int nodeoff,
> > > > + uint32_t address_cells, uint32_t
> > > > size_cells)
> > >
> > > Why do you need address_cells and size_cells in parameter?
> >
> > Yes, it will be necessary for later patches.
>
> ok.
>
> >
> >
> > > > +{
> > > > + void *fdt = kinfo->fdt;
> > > > + int propoff, nameoff, res;
> > > > + const struct fdt_property *prop;
> > > > +
> > > > + for ( propoff = fdt_first_property_offset(pfdt, nodeoff);
> > > > + propoff >= 0;
> > > > + propoff = fdt_next_property_offset(pfdt, propoff) )
> > > > + {
> > > > + if ( !(prop = fdt_get_property_by_offset(pfdt, propoff, NULL))
> > > > )
> > > > + return -FDT_ERR_INTERNAL;
> > > > +
> > > > + nameoff = fdt32_to_cpu(prop->nameoff);
> > > > + res = fdt_property(fdt, fdt_string(pfdt, nameoff),
> > > > + prop->data, fdt32_to_cpu(prop->len));
> > > > + if ( res )
> > > > + return res;
> > > > + }
> > > > +
> > > > + /* FDT_ERR_NOTFOUND => There is no more properties for this node */
> > > > + return ( propoff != -FDT_ERR_NOTFOUND ) ? propoff : 0;
> > > > +}
> > > > +
> > > > +static int __init scan_pfdt_node(struct kernel_info *kinfo, const void
> > > > *pfdt,
> > > > + int nodeoff, int depth,
> > > > + uint32_t address_cells, uint32_t
> > > > size_cells)
> > > > +{
> > > > + int rc = 0;
> > > > + void *fdt = kinfo->fdt;
> > > > + int node_next;
> > > > + const char *name = fdt_get_name(pfdt, nodeoff, NULL);
> > > > +
> > > > + /*
> > > > + * Take the GIC phandle value from the special /gic node in the DTB
> > > > + * fragment.
> > > > + */
> > > > + if ( depth == 1 && dt_node_cmp(name, "gic") == 0 )
> > > > + {
> > > > + kinfo->guest_phandle_gic = fdt_get_phandle(pfdt, nodeoff);
> > > > + return 0;
> > > > + }
> > >
> > > I don't like this solution. You are bypassing most of the function just
> > > for
> > > the benefits of have the name in hand. Can this be done separately? This
> > > would
> > > also avoid to have an extra parameter (depth) for the only benefits of
> > > this
> > > check.
> >
> > All right, I'll change it and remove depth.
>
> Thinking again about this function, you will allow a users to describe a
> device in the node /aliases. So there are more to do in this function.
Yes, that's true. I can pass a parameter to make sure the proper
behavior is applied to /aliases (only copy) and /passthrough (copy and
look for device assignment properties).
> > > > +
> > > > + rc = fdt_begin_node(fdt, fdt_get_name(pfdt, nodeoff, NULL));
> > > > + if ( rc )
> > > > + return rc;
> > > > +
> > > > + rc = handle_prop_pfdt(kinfo, pfdt, nodeoff, address_cells,
> > > > size_cells);
> > > > + if ( rc )
> > > > + return rc;
> > > > +
> > > > + address_cells = device_tree_get_u32(pfdt, nodeoff,
> > > > "#address-cells",
> > > > + address_cells);
> > > > + size_cells = device_tree_get_u32(pfdt, nodeoff, "#size-cells",
> > > > + size_cells);
> > >
> > > I am pretty sure I mention it before (though not on this patch...), this
> > > is
> > > not matching the DT spec. address_cells and size_cells are not propagated
> > > to
> > > the next level. So these should be DT_ROOT_NODE_{ADDR,
> > > SIZE}_CELLS_DEFAULT.
> >
> > They are only propagated from parent to children, not from parent to
> > grandchildren. This function is recursive. In this case we are reading
> > #address-cells and #size-cells just to pass it on by 1 level as by the
> > spec. Am I misunderstanding something?
>
> I am afraid this is not correct. device_tree_get_u32 take the default number
> of cells as 3rd parameter. This is used if the property does not exist.
>
> So if the children does not have the two properties, then you will end up to
> use the parent's value as default when parsing grandchildren "reg" properties.
I understand your point now. I'll fix it.
> > > > +
> > > > + node_next = fdt_first_subnode(pfdt, 0);
> > > > + while ( node_next > 0 )
> > > > + {
> > >
> > > Why do we have to go through the all the nodes of the first level? Can't
> > > we
> > > just lookup for the path and copy the node as libxl does?
> >
> > Yes, we could do that, but fdt_path_offset is implemented as a loop
> > anyway and we would still have the same "gic", "aliases" and
> > "passthrough" checks. I tried the change but the code doesn't look much
> > nicer and we would end up increasing runtime complexity.
>
> This is ok as long as they don't depend on each other. This is not very clear
> from the code that "/gic" does not need to be parsed first, so you may want to
> explain in a comment.
OK, I'll clarify
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |