|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 21/24] tools/(lib)xl: Add partial device tree support for ARM
On Tue, 2015-01-13 at 14:25 +0000, Julien Grall wrote:
> Let the user to pass additional nodes to the guest device tree. For this
> purpose, everything in the node /passthrough from the partial device tree will
> be copied into the guest device tree.
>
> The node /aliases will be also copied to allow the user to define aliases
> which can be used by the guest kernel.
>
> A simple partial device tree will look like:
>
> /dts-v1/;
>
> / {
> #address-cells = <2>;
> #size-cells = <2>;
Are these mandatory/required as implied below, or only the ones inside
the passthrough node (which is what I would expect).
>
> passthrough {
> compatible = "simple-bus";
> ranges;
> #address-cells = <2>;
> #size-cells = <2>;
>
> /* List of your nodes */
> }
> };
>
> Note that:
> * The interrupt-parent proporties will be added by the toolstack in
"properties"
> the root node
> * The properties compatible, ranges, #address-cells and #size-cells
> in /passthrough are mandatory.
Does ranges need to be the empty form? I think ranges = <stuff stuff>
would be illegal?
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
>
> ---
> Changes in v3:
> - Patch added
> ---
> docs/man/xl.cfg.pod.5 | 7 ++
> tools/libxl/libxl_arm.c | 253
> ++++++++++++++++++++++++++++++++++++++++++++
> tools/libxl/libxl_types.idl | 1 +
> tools/libxl/xl_cmdimpl.c | 1 +
> 4 files changed, 262 insertions(+)
>
> diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5
> index e2f91fc..225b782 100644
> --- a/docs/man/xl.cfg.pod.5
> +++ b/docs/man/xl.cfg.pod.5
> @@ -398,6 +398,13 @@ not emulated.
> Specify that this domain is a driver domain. This enables certain
> features needed in order to run a driver domain.
>
> +=item B<device_tree=PATH>
> +
> +Specify a partial device tree (compiled via the Device Tree Compiler).
> +Everything under the node "/passthrough" will be copied into the guest
> +device tree. For convenience, the node "/aliases" is also copied to allow
> +the user to defined aliases which can be used by the guest kernel.
> +
> =back
>
> =head2 Devices
> diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c
> index 53177eb..619458b 100644
> --- a/tools/libxl/libxl_arm.c
> +++ b/tools/libxl/libxl_arm.c
> @@ -540,6 +540,238 @@ out:
> }
> }
>
> +static bool check_overrun(uint64_t a, uint64_t b, uint32_t max)
> +{
> + return ((a + b) > UINT_MAX || (a + b) > max);
Both halves here will fail if e.g. a == UINT64_MAX-1 and b == 2, so e..g
a+b <= UINT_MAX and < max.
To avoid this you should check that a and b are both less than some
fraction of UINT64_MAX before the other checks, which would ensure the
overflow can't happen, perhaps even UINT32_MAX would be acceptable for
this use, depending on the input types involved.
> +/*
> + * Based on fdt_first_subnode and fdt_next_subnode.
> + * We can't use the one helpers provided by libfdt because:
> + * - It has been introduced in 2013 => Doesn't work on wheezy
> + * - The prototypes exist but the functions are not exported. Don't
> + * ask why...
> + * - There is no version in the header (might be better to use
> + * configure for this purpose?)
> + */
> +static int _fdt_first_subnode(const void *fdt, int offset)
The _ namespace is for something other than applications (POSIX or the
compiler, I forget which is _ and which __)
Using configure to conditionally compile our own versions with the usual
names would be better I think.
The copyright and licensing of these functions should be included
somewhere either just above their definitions, or maybe you want to put
these into a separate .c file for convenience.
> +{
> + int depth = 0;
> +
> + offset = fdt_next_node(fdt, offset, &depth);
> + if (offset < 0 || depth != 1)
> + return -FDT_ERR_NOTFOUND;
> +
> + return offset;
> +}
> +
> +static int _fdt_next_subnode(const void *fdt, int offset)
> +{
> + int depth = 1;
> +
> + /*
> + * With respect to the parent, the depth of the next subnode will be
> + * the same as the last.
> + */
> + do {
> + offset = fdt_next_node(fdt, offset, &depth);
> + if (offset < 0 || depth < 1)
> + return -FDT_ERR_NOTFOUND;
> + } while (depth > 1);
> +
> + return offset;
> +}
> +
> +/* Limit the maxixum depth of a node because of the recursion */
"maximum".
> +#define MAX_DEPTH 8
This restriction ought to be in the docs I think.
> +static int copy_node_by_path(libxl__gc *gc, const char *path,
> + void *fdt, void *pfdt)
> +{
> + int nodeoff, r;
> + const char *name = strrchr(path, '/');
> +
> + if (!name)
> + return -FDT_ERR_INTERNAL;
> +
> + name++;
> +
> + /* The FDT function to look at node doesn't take into account the
^a
> + * unit (i.e anything after @) when search by name. Check if the
> + * name exactly match.
"exactly matches" or "names exactly match" (I think the second?)
> +/*
> + * The partial device tree is not copied entirely. Only the relevant bits are
> + * copied to the guest device tree:
> + * - /passthrough node
> + * - /aliases node
Would it be easy to add a check for other top-level nodes and
error/warn?
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 1214d2e..5651110 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -399,6 +399,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
> ("kernel", string),
> ("cmdline", string),
> ("ramdisk", string),
> + ("device_tree", string),
Needs a #define LIBXL_HAVE... in libxl.h
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |