All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] checks: Add an interrupt-map check
@ 2021-10-15 21:35 Rob Herring
       [not found] ` <20211015213527.2237774-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Rob Herring @ 2021-10-15 21:35 UTC (permalink / raw)
  To: David Gibson; +Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA, Andre Przywara

Add a check for parsing 'interrupt-map' properties. The check primarily
tests parsing 'interrupt-map' properties which depends on and the parent
interrupt controller (or another map) node.

Note that this does not require '#address-cells' in the interrupt-map
parent, but treats missing '#address-cells' as 0 which is how the Linux
kernel parses it. There's numerous cases that expect this behavior.

Cc: Andre Przywara <andre.przywara-5wv7dgnIgG8@public.gmane.org>
Signed-off-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
v3:
 - Exit check on unresolved phandle when an overlay
v2:
 - Rework '#interrupt-cells' and '#address-cells' checks to rely on
   other checks (interrupt_provider and addr_size_cells)
---
 checks.c                           | 85 ++++++++++++++++++++++++++++++
 tests/bad-interrupt-map-mask.dts   | 20 +++++++
 tests/bad-interrupt-map-parent.dts | 17 ++++++
 tests/bad-interrupt-map.dts        | 19 +++++++
 tests/run_tests.sh                 |  3 ++
 5 files changed, 144 insertions(+)
 create mode 100644 tests/bad-interrupt-map-mask.dts
 create mode 100644 tests/bad-interrupt-map-parent.dts
 create mode 100644 tests/bad-interrupt-map.dts

diff --git a/checks.c b/checks.c
index b9fcde8a7d41..781ba1129a8e 100644
--- a/checks.c
+++ b/checks.c
@@ -1590,6 +1590,90 @@ static void check_interrupt_provider(struct check *c,
 }
 WARNING(interrupt_provider, check_interrupt_provider, NULL, &interrupts_extended_is_cell);
 
+static void check_interrupt_map(struct check *c,
+				struct dt_info *dti,
+				struct node *node)
+{
+	struct node *root = dti->dt;
+	struct property *prop, *irq_map_prop;
+	size_t cellsize, cell, map_cells;
+
+	irq_map_prop = get_property(node, "interrupt-map");
+	if (!irq_map_prop)
+		return;
+
+	if (node->addr_cells < 0) {
+		FAIL(c, dti, node,
+		     "Missing '#address-cells' in interrupt-map provider");
+		return;
+	}
+	cellsize = node_addr_cells(node);
+	cellsize += propval_cell(get_property(node, "#interrupt-cells"));
+
+	prop = get_property(node, "interrupt-map-mask");
+	if (prop && (prop->val.len != (cellsize * sizeof(cell_t))))
+		FAIL_PROP(c, dti, node, prop,
+			  "property size (%d) is invalid, expected %zu",
+			  prop->val.len, cellsize * sizeof(cell_t));
+
+	if (!is_multiple_of(irq_map_prop->val.len, sizeof(cell_t))) {
+		FAIL_PROP(c, dti, node, irq_map_prop,
+			  "property size (%d) is invalid, expected multiple of %zu",
+			  irq_map_prop->val.len, sizeof(cell_t));
+		return;
+	}
+
+	map_cells = irq_map_prop->val.len / sizeof(cell_t);
+	for (cell = 0; cell < map_cells; ) {
+		struct node *provider_node;
+		struct property *cellprop;
+		int phandle;
+		size_t parent_cellsize;
+
+		if ((cell + cellsize) >= map_cells) {
+			FAIL_PROP(c, dti, node, irq_map_prop,
+				  "property size (%d) too small, expected > %zu",
+				  irq_map_prop->val.len, (cell + cellsize) * sizeof(cell_t));
+			break;
+		}
+		cell += cellsize;
+
+		phandle = propval_cell_n(irq_map_prop, cell);
+		if (!phandle_is_valid(phandle)) {
+			/* Give up if this is an overlay with external references */
+			if (!(dti->dtsflags & DTSF_PLUGIN))
+				FAIL_PROP(c, dti, node, irq_map_prop,
+					  "Cell %zu is not a phandle(%d)",
+					  cell, phandle);
+			break;
+		}
+
+		provider_node = get_node_by_phandle(root, phandle);
+		if (!provider_node) {
+			FAIL_PROP(c, dti, node, irq_map_prop,
+				  "Could not get phandle(%d) node for (cell %zu)",
+				  phandle, cell);
+			break;
+		}
+
+		cellprop = get_property(provider_node, "#interrupt-cells");
+		if (cellprop) {
+			parent_cellsize = propval_cell(cellprop);
+		} else {
+			FAIL(c, dti, node, "Missing property '#interrupt-cells' in node %s or bad phandle (referred from interrupt-map[%zu])",
+			     provider_node->fullpath, cell);
+			break;
+		}
+
+		cellprop = get_property(provider_node, "#address-cells");
+		if (cellprop)
+			parent_cellsize += propval_cell(cellprop);
+
+		cell += 1 + parent_cellsize;
+	}
+}
+WARNING(interrupt_map, check_interrupt_map, NULL, &phandle_references, &addr_size_cells, &interrupt_provider);
+
 static void check_interrupts_property(struct check *c,
 				      struct dt_info *dti,
 				      struct node *node)
@@ -1888,6 +1972,7 @@ static struct check *check_table[] = {
 	&gpios_property,
 	&interrupts_property,
 	&interrupt_provider,
+	&interrupt_map,
 
 	&alias_paths,
 
diff --git a/tests/bad-interrupt-map-mask.dts b/tests/bad-interrupt-map-mask.dts
new file mode 100644
index 000000000000..10eaffd62310
--- /dev/null
+++ b/tests/bad-interrupt-map-mask.dts
@@ -0,0 +1,20 @@
+/dts-v1/;
+
+/ {
+	interrupt-parent = <&intc>;
+	intc: interrupt-controller {
+		#interrupt-cells = <3>;
+		interrupt-controller;
+	};
+
+	node {
+		#address-cells = <0>;
+		#interrupt-cells = <1>;
+		interrupt-map = <1 &intc 1 2 3>;
+		interrupt-map-mask = <0 0>;
+
+		child {
+			interrupts = <1>;
+		};
+	};
+};
diff --git a/tests/bad-interrupt-map-parent.dts b/tests/bad-interrupt-map-parent.dts
new file mode 100644
index 000000000000..fe88ce2fe76f
--- /dev/null
+++ b/tests/bad-interrupt-map-parent.dts
@@ -0,0 +1,17 @@
+/dts-v1/;
+
+/ {
+	interrupt-parent = <&intc>;
+	intc: interrupt-controller {
+	};
+
+	node {
+		#address-cells = <0>;
+		#interrupt-cells = <1>;
+		interrupt-map = <1 &intc 1 2 3>;
+
+		child {
+			interrupts = <1>;
+		};
+	};
+};
diff --git a/tests/bad-interrupt-map.dts b/tests/bad-interrupt-map.dts
new file mode 100644
index 000000000000..6df8f93ae00c
--- /dev/null
+++ b/tests/bad-interrupt-map.dts
@@ -0,0 +1,19 @@
+/dts-v1/;
+
+/ {
+	interrupt-parent = <&intc>;
+	intc: interrupt-controller {
+		#interrupt-cells = <3>;
+		interrupt-controller;
+	};
+
+	node {
+		/* Missing #address-cells = <0>; */
+		#interrupt-cells = <1>;
+		interrupt-map = <1 &intc 1 2 3>;
+
+		child {
+			interrupts = <1>;
+		};
+	};
+};
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 0e270feb3e47..d100d5aaa21f 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -717,6 +717,9 @@ dtc_tests () {
     run_sh_test "$SRCDIR/dtc-checkfails.sh" -n deprecated_gpio_property -- -Wdeprecated_gpio_property -I dts -O dtb "$SRCDIR/good-gpio.dts"
     check_tests "$SRCDIR/bad-interrupt-cells.dts" interrupts_property
     check_tests "$SRCDIR/bad-interrupt-controller.dts" interrupt_provider
+    check_tests "$SRCDIR/bad-interrupt-map.dts" interrupt_map
+    check_tests "$SRCDIR/bad-interrupt-map-parent.dts" interrupt_map
+    check_tests "$SRCDIR/bad-interrupt-map-mask.dts" interrupt_map
     run_sh_test "$SRCDIR/dtc-checkfails.sh" node_name_chars -- -I dtb -O dtb bad_node_char.dtb
     run_sh_test "$SRCDIR/dtc-checkfails.sh" node_name_format -- -I dtb -O dtb bad_node_format.dtb
     run_sh_test "$SRCDIR/dtc-checkfails.sh" property_name_chars -- -I dtb -O dtb bad_prop_char.dtb
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] checks: Add a sanity check for #.*-cells property value
       [not found] ` <20211015213527.2237774-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
@ 2021-10-15 21:35   ` Rob Herring
       [not found]     ` <20211015213527.2237774-2-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  2021-10-21  4:49   ` [PATCH 1/2] checks: Add an interrupt-map check David Gibson
  1 sibling, 1 reply; 4+ messages in thread
From: Rob Herring @ 2021-10-15 21:35 UTC (permalink / raw)
  To: David Gibson; +Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA, Andre Przywara

While in theory any value of number of cells is allowed for a #.*-cells
property, for all practical purposes the number of cells is never more than
a few cells. Add a check that the value is less than 255. This will catch
cases like this which will currently pass:

  #foo-cells = "bar";

Signed-off-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
v3:
 - Rename check_is_cell to check_is_provider_cell
v2:
 - new patch
---
 checks.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/checks.c b/checks.c
index 781ba1129a8e..704e99ebd66c 100644
--- a/checks.c
+++ b/checks.c
@@ -250,8 +250,9 @@ static void check_is_string_list(struct check *c, struct dt_info *dti,
 #define ERROR_IF_NOT_STRING_LIST(nm, propname) \
 	ERROR(nm, check_is_string_list, (propname))
 
-static void check_is_cell(struct check *c, struct dt_info *dti,
-			  struct node *node)
+/* A check for provider '#.*-cells' properties */
+static void check_is_provider_cell(struct check *c, struct dt_info *dti,
+				   struct node *node)
 {
 	struct property *prop;
 	char *propname = c->data;
@@ -260,13 +261,19 @@ static void check_is_cell(struct check *c, struct dt_info *dti,
 	if (!prop)
 		return; /* Not present, assumed ok */
 
-	if (prop->val.len != sizeof(cell_t))
+	if (prop->val.len != sizeof(cell_t)) {
 		FAIL_PROP(c, dti, node, prop, "property is not a single cell");
+		return;
+	}
+
+	/* Sanity test for reasonable number of cells */
+	if (propval_cell(prop) > 255)
+		FAIL_PROP(c, dti, node, prop, "cell size out of range (>255)");
 }
 #define WARNING_IF_NOT_CELL(nm, propname) \
-	WARNING(nm, check_is_cell, (propname))
+	WARNING(nm, check_is_provider_cell, (propname))
 #define ERROR_IF_NOT_CELL(nm, propname) \
-	ERROR(nm, check_is_cell, (propname))
+	ERROR(nm, check_is_provider_cell, (propname))
 
 /*
  * Structural check functions
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] checks: Add an interrupt-map check
       [not found] ` <20211015213527.2237774-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  2021-10-15 21:35   ` [PATCH 2/2] checks: Add a sanity check for #.*-cells property value Rob Herring
@ 2021-10-21  4:49   ` David Gibson
  1 sibling, 0 replies; 4+ messages in thread
From: David Gibson @ 2021-10-21  4:49 UTC (permalink / raw)
  To: Rob Herring; +Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA, Andre Przywara

[-- Attachment #1: Type: text/plain, Size: 7697 bytes --]

On Fri, Oct 15, 2021 at 04:35:26PM -0500, Rob Herring wrote:
> Add a check for parsing 'interrupt-map' properties. The check primarily
> tests parsing 'interrupt-map' properties which depends on and the parent
> interrupt controller (or another map) node.
> 
> Note that this does not require '#address-cells' in the interrupt-map
> parent, but treats missing '#address-cells' as 0 which is how the Linux
> kernel parses it. There's numerous cases that expect this behavior.
> 
> Cc: Andre Przywara <andre.przywara-5wv7dgnIgG8@public.gmane.org>
> Signed-off-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

Applied, thanks.

> ---
> v3:
>  - Exit check on unresolved phandle when an overlay
> v2:
>  - Rework '#interrupt-cells' and '#address-cells' checks to rely on
>    other checks (interrupt_provider and addr_size_cells)
> ---
>  checks.c                           | 85 ++++++++++++++++++++++++++++++
>  tests/bad-interrupt-map-mask.dts   | 20 +++++++
>  tests/bad-interrupt-map-parent.dts | 17 ++++++
>  tests/bad-interrupt-map.dts        | 19 +++++++
>  tests/run_tests.sh                 |  3 ++
>  5 files changed, 144 insertions(+)
>  create mode 100644 tests/bad-interrupt-map-mask.dts
>  create mode 100644 tests/bad-interrupt-map-parent.dts
>  create mode 100644 tests/bad-interrupt-map.dts
> 
> diff --git a/checks.c b/checks.c
> index b9fcde8a7d41..781ba1129a8e 100644
> --- a/checks.c
> +++ b/checks.c
> @@ -1590,6 +1590,90 @@ static void check_interrupt_provider(struct check *c,
>  }
>  WARNING(interrupt_provider, check_interrupt_provider, NULL, &interrupts_extended_is_cell);
>  
> +static void check_interrupt_map(struct check *c,
> +				struct dt_info *dti,
> +				struct node *node)
> +{
> +	struct node *root = dti->dt;
> +	struct property *prop, *irq_map_prop;
> +	size_t cellsize, cell, map_cells;
> +
> +	irq_map_prop = get_property(node, "interrupt-map");
> +	if (!irq_map_prop)
> +		return;
> +
> +	if (node->addr_cells < 0) {
> +		FAIL(c, dti, node,
> +		     "Missing '#address-cells' in interrupt-map provider");
> +		return;
> +	}
> +	cellsize = node_addr_cells(node);
> +	cellsize += propval_cell(get_property(node, "#interrupt-cells"));
> +
> +	prop = get_property(node, "interrupt-map-mask");
> +	if (prop && (prop->val.len != (cellsize * sizeof(cell_t))))
> +		FAIL_PROP(c, dti, node, prop,
> +			  "property size (%d) is invalid, expected %zu",
> +			  prop->val.len, cellsize * sizeof(cell_t));
> +
> +	if (!is_multiple_of(irq_map_prop->val.len, sizeof(cell_t))) {
> +		FAIL_PROP(c, dti, node, irq_map_prop,
> +			  "property size (%d) is invalid, expected multiple of %zu",
> +			  irq_map_prop->val.len, sizeof(cell_t));
> +		return;
> +	}
> +
> +	map_cells = irq_map_prop->val.len / sizeof(cell_t);
> +	for (cell = 0; cell < map_cells; ) {
> +		struct node *provider_node;
> +		struct property *cellprop;
> +		int phandle;
> +		size_t parent_cellsize;
> +
> +		if ((cell + cellsize) >= map_cells) {
> +			FAIL_PROP(c, dti, node, irq_map_prop,
> +				  "property size (%d) too small, expected > %zu",
> +				  irq_map_prop->val.len, (cell + cellsize) * sizeof(cell_t));
> +			break;
> +		}
> +		cell += cellsize;
> +
> +		phandle = propval_cell_n(irq_map_prop, cell);
> +		if (!phandle_is_valid(phandle)) {
> +			/* Give up if this is an overlay with external references */
> +			if (!(dti->dtsflags & DTSF_PLUGIN))
> +				FAIL_PROP(c, dti, node, irq_map_prop,
> +					  "Cell %zu is not a phandle(%d)",
> +					  cell, phandle);
> +			break;
> +		}
> +
> +		provider_node = get_node_by_phandle(root, phandle);
> +		if (!provider_node) {
> +			FAIL_PROP(c, dti, node, irq_map_prop,
> +				  "Could not get phandle(%d) node for (cell %zu)",
> +				  phandle, cell);
> +			break;
> +		}
> +
> +		cellprop = get_property(provider_node, "#interrupt-cells");
> +		if (cellprop) {
> +			parent_cellsize = propval_cell(cellprop);
> +		} else {
> +			FAIL(c, dti, node, "Missing property '#interrupt-cells' in node %s or bad phandle (referred from interrupt-map[%zu])",
> +			     provider_node->fullpath, cell);
> +			break;
> +		}
> +
> +		cellprop = get_property(provider_node, "#address-cells");
> +		if (cellprop)
> +			parent_cellsize += propval_cell(cellprop);
> +
> +		cell += 1 + parent_cellsize;
> +	}
> +}
> +WARNING(interrupt_map, check_interrupt_map, NULL, &phandle_references, &addr_size_cells, &interrupt_provider);
> +
>  static void check_interrupts_property(struct check *c,
>  				      struct dt_info *dti,
>  				      struct node *node)
> @@ -1888,6 +1972,7 @@ static struct check *check_table[] = {
>  	&gpios_property,
>  	&interrupts_property,
>  	&interrupt_provider,
> +	&interrupt_map,
>  
>  	&alias_paths,
>  
> diff --git a/tests/bad-interrupt-map-mask.dts b/tests/bad-interrupt-map-mask.dts
> new file mode 100644
> index 000000000000..10eaffd62310
> --- /dev/null
> +++ b/tests/bad-interrupt-map-mask.dts
> @@ -0,0 +1,20 @@
> +/dts-v1/;
> +
> +/ {
> +	interrupt-parent = <&intc>;
> +	intc: interrupt-controller {
> +		#interrupt-cells = <3>;
> +		interrupt-controller;
> +	};
> +
> +	node {
> +		#address-cells = <0>;
> +		#interrupt-cells = <1>;
> +		interrupt-map = <1 &intc 1 2 3>;
> +		interrupt-map-mask = <0 0>;
> +
> +		child {
> +			interrupts = <1>;
> +		};
> +	};
> +};
> diff --git a/tests/bad-interrupt-map-parent.dts b/tests/bad-interrupt-map-parent.dts
> new file mode 100644
> index 000000000000..fe88ce2fe76f
> --- /dev/null
> +++ b/tests/bad-interrupt-map-parent.dts
> @@ -0,0 +1,17 @@
> +/dts-v1/;
> +
> +/ {
> +	interrupt-parent = <&intc>;
> +	intc: interrupt-controller {
> +	};
> +
> +	node {
> +		#address-cells = <0>;
> +		#interrupt-cells = <1>;
> +		interrupt-map = <1 &intc 1 2 3>;
> +
> +		child {
> +			interrupts = <1>;
> +		};
> +	};
> +};
> diff --git a/tests/bad-interrupt-map.dts b/tests/bad-interrupt-map.dts
> new file mode 100644
> index 000000000000..6df8f93ae00c
> --- /dev/null
> +++ b/tests/bad-interrupt-map.dts
> @@ -0,0 +1,19 @@
> +/dts-v1/;
> +
> +/ {
> +	interrupt-parent = <&intc>;
> +	intc: interrupt-controller {
> +		#interrupt-cells = <3>;
> +		interrupt-controller;
> +	};
> +
> +	node {
> +		/* Missing #address-cells = <0>; */
> +		#interrupt-cells = <1>;
> +		interrupt-map = <1 &intc 1 2 3>;
> +
> +		child {
> +			interrupts = <1>;
> +		};
> +	};
> +};
> diff --git a/tests/run_tests.sh b/tests/run_tests.sh
> index 0e270feb3e47..d100d5aaa21f 100755
> --- a/tests/run_tests.sh
> +++ b/tests/run_tests.sh
> @@ -717,6 +717,9 @@ dtc_tests () {
>      run_sh_test "$SRCDIR/dtc-checkfails.sh" -n deprecated_gpio_property -- -Wdeprecated_gpio_property -I dts -O dtb "$SRCDIR/good-gpio.dts"
>      check_tests "$SRCDIR/bad-interrupt-cells.dts" interrupts_property
>      check_tests "$SRCDIR/bad-interrupt-controller.dts" interrupt_provider
> +    check_tests "$SRCDIR/bad-interrupt-map.dts" interrupt_map
> +    check_tests "$SRCDIR/bad-interrupt-map-parent.dts" interrupt_map
> +    check_tests "$SRCDIR/bad-interrupt-map-mask.dts" interrupt_map
>      run_sh_test "$SRCDIR/dtc-checkfails.sh" node_name_chars -- -I dtb -O dtb bad_node_char.dtb
>      run_sh_test "$SRCDIR/dtc-checkfails.sh" node_name_format -- -I dtb -O dtb bad_node_format.dtb
>      run_sh_test "$SRCDIR/dtc-checkfails.sh" property_name_chars -- -I dtb -O dtb bad_prop_char.dtb

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] checks: Add a sanity check for #.*-cells property value
       [not found]     ` <20211015213527.2237774-2-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
@ 2021-10-21  4:51       ` David Gibson
  0 siblings, 0 replies; 4+ messages in thread
From: David Gibson @ 2021-10-21  4:51 UTC (permalink / raw)
  To: Rob Herring; +Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA, Andre Przywara

[-- Attachment #1: Type: text/plain, Size: 2432 bytes --]

On Fri, Oct 15, 2021 at 04:35:27PM -0500, Rob Herring wrote:
> While in theory any value of number of cells is allowed for a #.*-cells
> property, for all practical purposes the number of cells is never more than
> a few cells. Add a check that the value is less than 255. This will catch
> cases like this which will currently pass:
> 
>   #foo-cells = "bar";
> 
> Signed-off-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

Sorry, can you rename the macros as well.  If anything they're *more*
misleading than the function name with this change.

> ---
> v3:
>  - Rename check_is_cell to check_is_provider_cell
> v2:
>  - new patch
> ---
>  checks.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/checks.c b/checks.c
> index 781ba1129a8e..704e99ebd66c 100644
> --- a/checks.c
> +++ b/checks.c
> @@ -250,8 +250,9 @@ static void check_is_string_list(struct check *c, struct dt_info *dti,
>  #define ERROR_IF_NOT_STRING_LIST(nm, propname) \
>  	ERROR(nm, check_is_string_list, (propname))
>  
> -static void check_is_cell(struct check *c, struct dt_info *dti,
> -			  struct node *node)
> +/* A check for provider '#.*-cells' properties */
> +static void check_is_provider_cell(struct check *c, struct dt_info *dti,
> +				   struct node *node)
>  {
>  	struct property *prop;
>  	char *propname = c->data;
> @@ -260,13 +261,19 @@ static void check_is_cell(struct check *c, struct dt_info *dti,
>  	if (!prop)
>  		return; /* Not present, assumed ok */
>  
> -	if (prop->val.len != sizeof(cell_t))
> +	if (prop->val.len != sizeof(cell_t)) {
>  		FAIL_PROP(c, dti, node, prop, "property is not a single cell");
> +		return;
> +	}
> +
> +	/* Sanity test for reasonable number of cells */
> +	if (propval_cell(prop) > 255)
> +		FAIL_PROP(c, dti, node, prop, "cell size out of range (>255)");
>  }
>  #define WARNING_IF_NOT_CELL(nm, propname) \
> -	WARNING(nm, check_is_cell, (propname))
> +	WARNING(nm, check_is_provider_cell, (propname))
>  #define ERROR_IF_NOT_CELL(nm, propname) \
> -	ERROR(nm, check_is_cell, (propname))
> +	ERROR(nm, check_is_provider_cell, (propname))
>  
>  /*
>   * Structural check functions

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-10-21  4:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-15 21:35 [PATCH 1/2] checks: Add an interrupt-map check Rob Herring
     [not found] ` <20211015213527.2237774-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2021-10-15 21:35   ` [PATCH 2/2] checks: Add a sanity check for #.*-cells property value Rob Herring
     [not found]     ` <20211015213527.2237774-2-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2021-10-21  4:51       ` David Gibson
2021-10-21  4:49   ` [PATCH 1/2] checks: Add an interrupt-map check David Gibson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.