[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] device tree: print a warning if a node is nested too deep
# HG changeset patch # User David Vrabel <david.vrabel@xxxxxxxxxx> # Date 1333381844 -3600 # Node ID ac66eedfd9878173a2b8d4e1e81236857a819319 # Parent 5cbe2ab76a9cb4880cd0354cb3e3111930d985ee device tree: print a warning if a node is nested too deep 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> Committed-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- diff -r 5cbe2ab76a9c -r ac66eedfd987 xen/common/device_tree.c --- a/xen/common/device_tree.c Mon Apr 02 16:50:43 2012 +0100 +++ b/xen/common/device_tree.c Mon Apr 02 16:50:44 2012 +0100 @@ -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, * @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 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(con device_tree_for_each_node((void *)fdt, early_scan_node, NULL); early_print_info(); + dt_printk = printk; + return fdt_totalsize(fdt); } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |