|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5/5] device tree: print a warning if a node is nested too deep
On Thu, 2012-03-22 at 19:17 +0000, David Vrabel wrote:
> From: David Vrabel <david.vrabel@xxxxxxxxxx>
>
> Since device_tree_for_each_node() is called before printk() works, a
> variable is used to switch between using early_printk() and printk().
>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
> ---
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
(although I separately wonder if generic printk ought not to redirect to
early_printk early on)
> xen/common/device_tree.c | 19 ++++++++++++++++++-
> 1 files changed, 18 insertions(+), 1 deletions(-)
>
> diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c
> index 8fb6d46..04619f4 100644
> --- a/xen/common/device_tree.c
> +++ b/xen/common/device_tree.c
> @@ -23,6 +23,10 @@
> struct dt_early_info __initdata early_info;
> void *device_tree_flattened;
>
> +/* Some device tree functions may be called both before and after the
> + console is initialized. */
> +static void (*dt_printk)(const char *fmt, ...) = early_printk;
> +
> bool_t device_tree_node_matches(const void *fdt, int node, const char *match)
> {
> const char *name;
> @@ -90,6 +94,11 @@ u32 device_tree_get_u32(const void *fdt, int node, const
> char *prop_name)
> * @fdt: flat device tree.
> * @func: function to call for each node.
> * @data: data to pass to @func.
> + *
> + * Any nodes nested at DEVICE_TREE_MAX_DEPTH or deeper are ignored.
> + *
> + * Returns 0 if all nodes were iterated over successfully. If @func
> + * returns a negative value, that value is returned immediately.
> */
> int device_tree_for_each_node(const void *fdt,
> device_tree_node_func func, void *data)
> @@ -104,13 +113,19 @@ int device_tree_for_each_node(const void *fdt,
> node >=0 && depth >= 0;
> node = fdt_next_node(fdt, node, &depth) )
> {
> + const char *name = fdt_get_name(fdt, node, NULL);
> +
> if ( depth >= DEVICE_TREE_MAX_DEPTH )
> + {
> + dt_printk("Warning: device tree node `%s' is nested too deep\n",
> + name);
> continue;
> + }
>
> address_cells[depth] = device_tree_get_u32(fdt, node,
> "#address-cells");
> size_cells[depth] = device_tree_get_u32(fdt, node, "#size-cells");
>
> - ret = func(fdt, node, fdt_get_name(fdt, node, NULL), depth,
> + ret = func(fdt, node, name, depth,
> address_cells[depth-1], size_cells[depth-1], data);
> if ( ret < 0 )
> return ret;
> @@ -253,6 +268,8 @@ size_t __init device_tree_early_init(const void *fdt)
> device_tree_for_each_node((void *)fdt, early_scan_node, NULL);
> early_print_info();
>
> + dt_printk = printk;
> +
> return fdt_totalsize(fdt);
> }
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |