All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:30 ` Kees Cook
  0 siblings, 0 replies; 13+ messages in thread
From: Kees Cook @ 2023-08-17 20:30 UTC (permalink / raw)
  To: linux-aspeed

Prepare for the coming implementation by GCC and Clang of the __counted_by
attribute. Flexible array members annotated with __counted_by can have
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
functions).

As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
Additionally, since the element count member must be set before accessing
the annotated flexible array member, move its initialization earlier.

[1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci

Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
Cc: Takao Orito <orito.takao@socionext.com>
Cc: Qin Jian <qinjian@cqplus1.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Gregory Clement <gregory.clement@bootlin.com>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Cc: Andy Gross <agross@kernel.org>
Cc: Bjorn Andersson <andersson@kernel.org>
Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: David Airlie <airlied@gmail.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Samuel Holland <samuel@sholland.org>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: Kishon Vijay Abraham I <kishon@kernel.org>
Cc: linux-clk at vger.kernel.org
Cc: linux-arm-kernel at lists.infradead.org
Cc: linux-aspeed at lists.ozlabs.org
Cc: linux-arm-msm at vger.kernel.org
Cc: linux-mediatek at lists.infradead.org
Cc: dri-devel at lists.freedesktop.org
Cc: linux-sunxi at lists.linux.dev
Cc: linux-phy at lists.infradead.org
Signed-off-by: Kees Cook <keescook@chromium.org>
---
 drivers/clk/clk-aspeed.c                    | 3 +--
 drivers/clk/clk-ast2600.c                   | 2 +-
 drivers/clk/clk-gemini.c                    | 2 +-
 drivers/clk/clk-milbeaut.c                  | 3 +--
 drivers/clk/clk-sp7021.c                    | 3 +--
 drivers/clk/mvebu/cp110-system-controller.c | 2 +-
 drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
 drivers/clk/ralink/clk-mt7621.c             | 3 +--
 drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
 drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
 include/linux/clk-provider.h                | 2 +-
 11 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
index 284710adaef5..ff84191d0fe8 100644
--- a/drivers/clk/clk-aspeed.c
+++ b/drivers/clk/clk-aspeed.c
@@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!aspeed_clk_data)
 		return;
+	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
 		aspeed_ast2500_cc(map);
 	else
 		pr_err("unknown platform, failed to add clocks\n");
-
-	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
index f9e27f95a967..909c3137c428 100644
--- a/drivers/clk/clk-ast2600.c
+++ b/drivers/clk/clk-ast2600.c
@@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
 	if (!aspeed_g6_clk_data)
 		return;
+	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 	}
 
 	aspeed_g6_cc(map);
-	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
index a23fa6d47ef1..2572d15aadd0 100644
--- a/drivers/clk/clk-gemini.c
+++ b/drivers/clk/clk-gemini.c
@@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!gemini_clk_data)
 		return;
+	gemini_clk_data->num = GEMINI_NUM_CLKS;
 
 	/*
 	 * This way all clock fetched before the platform device probes,
@@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
 	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
 
 	/* Register the clocks to be accessed by the device tree */
-	gemini_clk_data->num = GEMINI_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
index 050fd4fb588f..18c20aff45f7 100644
--- a/drivers/clk/clk-milbeaut.c
+++ b/drivers/clk/clk-milbeaut.c
@@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
 
 	if (!m10v_clk_data)
 		return;
+	m10v_clk_data->num = M10V_NUM_CLKS;
 
 	base = of_iomap(np, 0);
 	if (!base) {
@@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
 					base + CLKSEL(1), 0, 3, 0, rclk_table,
 					&m10v_crglock, NULL);
 	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
-
-	m10v_clk_data->num = M10V_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
index 11d22043ddd7..01d3c4c7b0b2 100644
--- a/drivers/clk/clk-sp7021.c
+++ b/drivers/clk/clk-sp7021.c
@@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_MAX;
 
 	hws = clk_data->hws;
 	pd_ext.index = 0;
@@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 			return PTR_ERR(hws[i]);
 	}
 
-	clk_data->num = CLK_MAX;
-
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 }
 
diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
index 84c8900542e4..03c59bf22106 100644
--- a/drivers/clk/mvebu/cp110-system-controller.c
+++ b/drivers/clk/mvebu/cp110-system-controller.c
@@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
 				      GFP_KERNEL);
 	if (!cp110_clk_data)
 		return -ENOMEM;
+	cp110_clk_data->num = CP110_CLK_NUM;
 
 	cp110_clks = cp110_clk_data->hws;
-	cp110_clk_data->num = CP110_CLK_NUM;
 
 	/* Register the PLL0 which is the root of the hw tree */
 	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
index 592c7c3cdeb7..72689448a653 100644
--- a/drivers/clk/qcom/clk-cpu-8996.c
+++ b/drivers/clk/qcom/clk-cpu-8996.c
@@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	base = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(base))
@@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 
 	data->hws[0] = &pwrcl_pmux.clkr.hw;
 	data->hws[1] = &perfcl_pmux.clkr.hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
 }
diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
index d95a33293b0a..92d14350c4b3 100644
--- a/drivers/clk/ralink/clk-mt7621.c
+++ b/drivers/clk/ralink/clk-mt7621.c
@@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = count;
 
 	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
 		clk_data->hws[i] = mt7621_clk_early[i];
@@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 		goto unreg_clk_fixed;
 	}
 
-	clk_data->num = count;
-
 	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 	if (ret) {
 		dev_err(dev, "Couldn't add clk hw provider\n");
diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
index 6f076cf4b403..a1ca3916f42b 100644
--- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
+++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
@@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_NUM;
 	tcon_top->clk_data = clk_data;
 
 	spin_lock_init(&tcon_top->reg_lock);
@@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 			goto err_unregister_gates;
 		}
 
-	clk_data->num = CLK_NUM;
-
 	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
 				     clk_data);
 	if (ret)
diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
index e0e722b9be31..8e5078304646 100644
--- a/drivers/phy/qualcomm/phy-qcom-edp.c
+++ b/drivers/phy/qualcomm/phy-qcom-edp.c
@@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
 	init.ops = &qcom_edp_dp_link_clk_ops;
@@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 
 	data->hws[0] = &edp->dp_link_hw;
 	data->hws[1] = &edp->dp_pixel_hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
 }
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index 0f0cd01906b4..ec32ec58c59f 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -1379,7 +1379,7 @@ struct clk_onecell_data {
 
 struct clk_hw_onecell_data {
 	unsigned int num;
-	struct clk_hw *hws[];
+	struct clk_hw *hws[] __counted_by(num);
 };
 
 #define CLK_OF_DECLARE(name, compat, fn) \
-- 
2.34.1


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

* [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:30 ` Kees Cook
  0 siblings, 0 replies; 13+ messages in thread
From: Kees Cook @ 2023-08-17 20:30 UTC (permalink / raw)
  To: Michael Turquette
  Cc: Kees Cook, Stephen Boyd, Joel Stanley, Andrew Jeffery,
	Taichi Sugaya, Takao Orito, Qin Jian, Andrew Lunn,
	Gregory Clement, Sebastian Hesselbarth, Andy Gross,
	Bjorn Andersson, Konrad Dybcio, Sergio Paracuellos,
	Matthias Brugger, AngeloGioacchino Del Regno, Maxime Ripard,
	Chen-Yu Tsai, Jernej Skrabec, David Airlie, Daniel Vetter,
	Samuel Holland, Vinod Koul, Kishon Vijay Abraham I, linux-clk,
	linux-arm-kernel, linux-aspeed, linux-arm-msm, linux-mediatek,
	dri-devel, linux-sunxi, linux-phy, Nathan Chancellor,
	Nick Desaulniers, Tom Rix, linux-kernel, llvm, linux-hardening

Prepare for the coming implementation by GCC and Clang of the __counted_by
attribute. Flexible array members annotated with __counted_by can have
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
functions).

As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
Additionally, since the element count member must be set before accessing
the annotated flexible array member, move its initialization earlier.

[1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci

Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
Cc: Takao Orito <orito.takao@socionext.com>
Cc: Qin Jian <qinjian@cqplus1.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Gregory Clement <gregory.clement@bootlin.com>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Cc: Andy Gross <agross@kernel.org>
Cc: Bjorn Andersson <andersson@kernel.org>
Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: David Airlie <airlied@gmail.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Samuel Holland <samuel@sholland.org>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: Kishon Vijay Abraham I <kishon@kernel.org>
Cc: linux-clk@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-aspeed@lists.ozlabs.org
Cc: linux-arm-msm@vger.kernel.org
Cc: linux-mediatek@lists.infradead.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-sunxi@lists.linux.dev
Cc: linux-phy@lists.infradead.org
Signed-off-by: Kees Cook <keescook@chromium.org>
---
 drivers/clk/clk-aspeed.c                    | 3 +--
 drivers/clk/clk-ast2600.c                   | 2 +-
 drivers/clk/clk-gemini.c                    | 2 +-
 drivers/clk/clk-milbeaut.c                  | 3 +--
 drivers/clk/clk-sp7021.c                    | 3 +--
 drivers/clk/mvebu/cp110-system-controller.c | 2 +-
 drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
 drivers/clk/ralink/clk-mt7621.c             | 3 +--
 drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
 drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
 include/linux/clk-provider.h                | 2 +-
 11 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
index 284710adaef5..ff84191d0fe8 100644
--- a/drivers/clk/clk-aspeed.c
+++ b/drivers/clk/clk-aspeed.c
@@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!aspeed_clk_data)
 		return;
+	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
 		aspeed_ast2500_cc(map);
 	else
 		pr_err("unknown platform, failed to add clocks\n");
-
-	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
index f9e27f95a967..909c3137c428 100644
--- a/drivers/clk/clk-ast2600.c
+++ b/drivers/clk/clk-ast2600.c
@@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
 	if (!aspeed_g6_clk_data)
 		return;
+	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 	}
 
 	aspeed_g6_cc(map);
-	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
index a23fa6d47ef1..2572d15aadd0 100644
--- a/drivers/clk/clk-gemini.c
+++ b/drivers/clk/clk-gemini.c
@@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!gemini_clk_data)
 		return;
+	gemini_clk_data->num = GEMINI_NUM_CLKS;
 
 	/*
 	 * This way all clock fetched before the platform device probes,
@@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
 	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
 
 	/* Register the clocks to be accessed by the device tree */
-	gemini_clk_data->num = GEMINI_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
index 050fd4fb588f..18c20aff45f7 100644
--- a/drivers/clk/clk-milbeaut.c
+++ b/drivers/clk/clk-milbeaut.c
@@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
 
 	if (!m10v_clk_data)
 		return;
+	m10v_clk_data->num = M10V_NUM_CLKS;
 
 	base = of_iomap(np, 0);
 	if (!base) {
@@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
 					base + CLKSEL(1), 0, 3, 0, rclk_table,
 					&m10v_crglock, NULL);
 	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
-
-	m10v_clk_data->num = M10V_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
index 11d22043ddd7..01d3c4c7b0b2 100644
--- a/drivers/clk/clk-sp7021.c
+++ b/drivers/clk/clk-sp7021.c
@@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_MAX;
 
 	hws = clk_data->hws;
 	pd_ext.index = 0;
@@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 			return PTR_ERR(hws[i]);
 	}
 
-	clk_data->num = CLK_MAX;
-
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 }
 
diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
index 84c8900542e4..03c59bf22106 100644
--- a/drivers/clk/mvebu/cp110-system-controller.c
+++ b/drivers/clk/mvebu/cp110-system-controller.c
@@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
 				      GFP_KERNEL);
 	if (!cp110_clk_data)
 		return -ENOMEM;
+	cp110_clk_data->num = CP110_CLK_NUM;
 
 	cp110_clks = cp110_clk_data->hws;
-	cp110_clk_data->num = CP110_CLK_NUM;
 
 	/* Register the PLL0 which is the root of the hw tree */
 	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
index 592c7c3cdeb7..72689448a653 100644
--- a/drivers/clk/qcom/clk-cpu-8996.c
+++ b/drivers/clk/qcom/clk-cpu-8996.c
@@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	base = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(base))
@@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 
 	data->hws[0] = &pwrcl_pmux.clkr.hw;
 	data->hws[1] = &perfcl_pmux.clkr.hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
 }
diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
index d95a33293b0a..92d14350c4b3 100644
--- a/drivers/clk/ralink/clk-mt7621.c
+++ b/drivers/clk/ralink/clk-mt7621.c
@@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = count;
 
 	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
 		clk_data->hws[i] = mt7621_clk_early[i];
@@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 		goto unreg_clk_fixed;
 	}
 
-	clk_data->num = count;
-
 	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 	if (ret) {
 		dev_err(dev, "Couldn't add clk hw provider\n");
diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
index 6f076cf4b403..a1ca3916f42b 100644
--- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
+++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
@@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_NUM;
 	tcon_top->clk_data = clk_data;
 
 	spin_lock_init(&tcon_top->reg_lock);
@@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 			goto err_unregister_gates;
 		}
 
-	clk_data->num = CLK_NUM;
-
 	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
 				     clk_data);
 	if (ret)
diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
index e0e722b9be31..8e5078304646 100644
--- a/drivers/phy/qualcomm/phy-qcom-edp.c
+++ b/drivers/phy/qualcomm/phy-qcom-edp.c
@@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
 	init.ops = &qcom_edp_dp_link_clk_ops;
@@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 
 	data->hws[0] = &edp->dp_link_hw;
 	data->hws[1] = &edp->dp_pixel_hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
 }
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index 0f0cd01906b4..ec32ec58c59f 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -1379,7 +1379,7 @@ struct clk_onecell_data {
 
 struct clk_hw_onecell_data {
 	unsigned int num;
-	struct clk_hw *hws[];
+	struct clk_hw *hws[] __counted_by(num);
 };
 
 #define CLK_OF_DECLARE(name, compat, fn) \
-- 
2.34.1


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

* [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:30 ` Kees Cook
  0 siblings, 0 replies; 13+ messages in thread
From: Kees Cook @ 2023-08-17 20:30 UTC (permalink / raw)
  To: Michael Turquette
  Cc: Kees Cook, Stephen Boyd, Joel Stanley, Andrew Jeffery,
	Taichi Sugaya, Takao Orito, Qin Jian, Andrew Lunn,
	Gregory Clement, Sebastian Hesselbarth, Andy Gross,
	Bjorn Andersson, Konrad Dybcio, Sergio Paracuellos,
	Matthias Brugger, AngeloGioacchino Del Regno, Maxime Ripard,
	Chen-Yu Tsai, Jernej Skrabec, David Airlie, Daniel Vetter,
	Samuel Holland, Vinod Koul, Kishon Vijay Abraham I, linux-clk,
	linux-arm-kernel, linux-aspeed, linux-arm-msm, linux-mediatek,
	dri-devel, linux-sunxi, linux-phy, Nathan Chancellor,
	Nick Desaulniers, Tom Rix, linux-kernel, llvm, linux-hardening

Prepare for the coming implementation by GCC and Clang of the __counted_by
attribute. Flexible array members annotated with __counted_by can have
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
functions).

As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
Additionally, since the element count member must be set before accessing
the annotated flexible array member, move its initialization earlier.

[1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci

Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
Cc: Takao Orito <orito.takao@socionext.com>
Cc: Qin Jian <qinjian@cqplus1.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Gregory Clement <gregory.clement@bootlin.com>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Cc: Andy Gross <agross@kernel.org>
Cc: Bjorn Andersson <andersson@kernel.org>
Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: David Airlie <airlied@gmail.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Samuel Holland <samuel@sholland.org>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: Kishon Vijay Abraham I <kishon@kernel.org>
Cc: linux-clk@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-aspeed@lists.ozlabs.org
Cc: linux-arm-msm@vger.kernel.org
Cc: linux-mediatek@lists.infradead.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-sunxi@lists.linux.dev
Cc: linux-phy@lists.infradead.org
Signed-off-by: Kees Cook <keescook@chromium.org>
---
 drivers/clk/clk-aspeed.c                    | 3 +--
 drivers/clk/clk-ast2600.c                   | 2 +-
 drivers/clk/clk-gemini.c                    | 2 +-
 drivers/clk/clk-milbeaut.c                  | 3 +--
 drivers/clk/clk-sp7021.c                    | 3 +--
 drivers/clk/mvebu/cp110-system-controller.c | 2 +-
 drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
 drivers/clk/ralink/clk-mt7621.c             | 3 +--
 drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
 drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
 include/linux/clk-provider.h                | 2 +-
 11 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
index 284710adaef5..ff84191d0fe8 100644
--- a/drivers/clk/clk-aspeed.c
+++ b/drivers/clk/clk-aspeed.c
@@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!aspeed_clk_data)
 		return;
+	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
 		aspeed_ast2500_cc(map);
 	else
 		pr_err("unknown platform, failed to add clocks\n");
-
-	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
index f9e27f95a967..909c3137c428 100644
--- a/drivers/clk/clk-ast2600.c
+++ b/drivers/clk/clk-ast2600.c
@@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
 	if (!aspeed_g6_clk_data)
 		return;
+	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 	}
 
 	aspeed_g6_cc(map);
-	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
index a23fa6d47ef1..2572d15aadd0 100644
--- a/drivers/clk/clk-gemini.c
+++ b/drivers/clk/clk-gemini.c
@@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!gemini_clk_data)
 		return;
+	gemini_clk_data->num = GEMINI_NUM_CLKS;
 
 	/*
 	 * This way all clock fetched before the platform device probes,
@@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
 	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
 
 	/* Register the clocks to be accessed by the device tree */
-	gemini_clk_data->num = GEMINI_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
index 050fd4fb588f..18c20aff45f7 100644
--- a/drivers/clk/clk-milbeaut.c
+++ b/drivers/clk/clk-milbeaut.c
@@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
 
 	if (!m10v_clk_data)
 		return;
+	m10v_clk_data->num = M10V_NUM_CLKS;
 
 	base = of_iomap(np, 0);
 	if (!base) {
@@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
 					base + CLKSEL(1), 0, 3, 0, rclk_table,
 					&m10v_crglock, NULL);
 	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
-
-	m10v_clk_data->num = M10V_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
index 11d22043ddd7..01d3c4c7b0b2 100644
--- a/drivers/clk/clk-sp7021.c
+++ b/drivers/clk/clk-sp7021.c
@@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_MAX;
 
 	hws = clk_data->hws;
 	pd_ext.index = 0;
@@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 			return PTR_ERR(hws[i]);
 	}
 
-	clk_data->num = CLK_MAX;
-
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 }
 
diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
index 84c8900542e4..03c59bf22106 100644
--- a/drivers/clk/mvebu/cp110-system-controller.c
+++ b/drivers/clk/mvebu/cp110-system-controller.c
@@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
 				      GFP_KERNEL);
 	if (!cp110_clk_data)
 		return -ENOMEM;
+	cp110_clk_data->num = CP110_CLK_NUM;
 
 	cp110_clks = cp110_clk_data->hws;
-	cp110_clk_data->num = CP110_CLK_NUM;
 
 	/* Register the PLL0 which is the root of the hw tree */
 	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
index 592c7c3cdeb7..72689448a653 100644
--- a/drivers/clk/qcom/clk-cpu-8996.c
+++ b/drivers/clk/qcom/clk-cpu-8996.c
@@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	base = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(base))
@@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 
 	data->hws[0] = &pwrcl_pmux.clkr.hw;
 	data->hws[1] = &perfcl_pmux.clkr.hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
 }
diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
index d95a33293b0a..92d14350c4b3 100644
--- a/drivers/clk/ralink/clk-mt7621.c
+++ b/drivers/clk/ralink/clk-mt7621.c
@@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = count;
 
 	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
 		clk_data->hws[i] = mt7621_clk_early[i];
@@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 		goto unreg_clk_fixed;
 	}
 
-	clk_data->num = count;
-
 	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 	if (ret) {
 		dev_err(dev, "Couldn't add clk hw provider\n");
diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
index 6f076cf4b403..a1ca3916f42b 100644
--- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
+++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
@@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_NUM;
 	tcon_top->clk_data = clk_data;
 
 	spin_lock_init(&tcon_top->reg_lock);
@@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 			goto err_unregister_gates;
 		}
 
-	clk_data->num = CLK_NUM;
-
 	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
 				     clk_data);
 	if (ret)
diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
index e0e722b9be31..8e5078304646 100644
--- a/drivers/phy/qualcomm/phy-qcom-edp.c
+++ b/drivers/phy/qualcomm/phy-qcom-edp.c
@@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
 	init.ops = &qcom_edp_dp_link_clk_ops;
@@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 
 	data->hws[0] = &edp->dp_link_hw;
 	data->hws[1] = &edp->dp_pixel_hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
 }
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index 0f0cd01906b4..ec32ec58c59f 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -1379,7 +1379,7 @@ struct clk_onecell_data {
 
 struct clk_hw_onecell_data {
 	unsigned int num;
-	struct clk_hw *hws[];
+	struct clk_hw *hws[] __counted_by(num);
 };
 
 #define CLK_OF_DECLARE(name, compat, fn) \
-- 
2.34.1


-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

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

* [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:30 ` Kees Cook
  0 siblings, 0 replies; 13+ messages in thread
From: Kees Cook @ 2023-08-17 20:30 UTC (permalink / raw)
  To: Michael Turquette
  Cc: Kees Cook, Stephen Boyd, Joel Stanley, Andrew Jeffery,
	Taichi Sugaya, Takao Orito, Qin Jian, Andrew Lunn,
	Gregory Clement, Sebastian Hesselbarth, Andy Gross,
	Bjorn Andersson, Konrad Dybcio, Sergio Paracuellos,
	Matthias Brugger, AngeloGioacchino Del Regno, Maxime Ripard,
	Chen-Yu Tsai, Jernej Skrabec, David Airlie, Daniel Vetter,
	Samuel Holland, Vinod Koul, Kishon Vijay Abraham I, linux-clk,
	linux-arm-kernel, linux-aspeed, linux-arm-msm, linux-mediatek,
	dri-devel, linux-sunxi, linux-phy, Nathan Chancellor,
	Nick Desaulniers, Tom Rix, linux-kernel, llvm, linux-hardening

Prepare for the coming implementation by GCC and Clang of the __counted_by
attribute. Flexible array members annotated with __counted_by can have
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
functions).

As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
Additionally, since the element count member must be set before accessing
the annotated flexible array member, move its initialization earlier.

[1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci

Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
Cc: Takao Orito <orito.takao@socionext.com>
Cc: Qin Jian <qinjian@cqplus1.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Gregory Clement <gregory.clement@bootlin.com>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Cc: Andy Gross <agross@kernel.org>
Cc: Bjorn Andersson <andersson@kernel.org>
Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: David Airlie <airlied@gmail.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Samuel Holland <samuel@sholland.org>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: Kishon Vijay Abraham I <kishon@kernel.org>
Cc: linux-clk@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-aspeed@lists.ozlabs.org
Cc: linux-arm-msm@vger.kernel.org
Cc: linux-mediatek@lists.infradead.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-sunxi@lists.linux.dev
Cc: linux-phy@lists.infradead.org
Signed-off-by: Kees Cook <keescook@chromium.org>
---
 drivers/clk/clk-aspeed.c                    | 3 +--
 drivers/clk/clk-ast2600.c                   | 2 +-
 drivers/clk/clk-gemini.c                    | 2 +-
 drivers/clk/clk-milbeaut.c                  | 3 +--
 drivers/clk/clk-sp7021.c                    | 3 +--
 drivers/clk/mvebu/cp110-system-controller.c | 2 +-
 drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
 drivers/clk/ralink/clk-mt7621.c             | 3 +--
 drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
 drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
 include/linux/clk-provider.h                | 2 +-
 11 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
index 284710adaef5..ff84191d0fe8 100644
--- a/drivers/clk/clk-aspeed.c
+++ b/drivers/clk/clk-aspeed.c
@@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!aspeed_clk_data)
 		return;
+	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
 		aspeed_ast2500_cc(map);
 	else
 		pr_err("unknown platform, failed to add clocks\n");
-
-	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
index f9e27f95a967..909c3137c428 100644
--- a/drivers/clk/clk-ast2600.c
+++ b/drivers/clk/clk-ast2600.c
@@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
 	if (!aspeed_g6_clk_data)
 		return;
+	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 	}
 
 	aspeed_g6_cc(map);
-	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
index a23fa6d47ef1..2572d15aadd0 100644
--- a/drivers/clk/clk-gemini.c
+++ b/drivers/clk/clk-gemini.c
@@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!gemini_clk_data)
 		return;
+	gemini_clk_data->num = GEMINI_NUM_CLKS;
 
 	/*
 	 * This way all clock fetched before the platform device probes,
@@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
 	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
 
 	/* Register the clocks to be accessed by the device tree */
-	gemini_clk_data->num = GEMINI_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
index 050fd4fb588f..18c20aff45f7 100644
--- a/drivers/clk/clk-milbeaut.c
+++ b/drivers/clk/clk-milbeaut.c
@@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
 
 	if (!m10v_clk_data)
 		return;
+	m10v_clk_data->num = M10V_NUM_CLKS;
 
 	base = of_iomap(np, 0);
 	if (!base) {
@@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
 					base + CLKSEL(1), 0, 3, 0, rclk_table,
 					&m10v_crglock, NULL);
 	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
-
-	m10v_clk_data->num = M10V_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
index 11d22043ddd7..01d3c4c7b0b2 100644
--- a/drivers/clk/clk-sp7021.c
+++ b/drivers/clk/clk-sp7021.c
@@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_MAX;
 
 	hws = clk_data->hws;
 	pd_ext.index = 0;
@@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 			return PTR_ERR(hws[i]);
 	}
 
-	clk_data->num = CLK_MAX;
-
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 }
 
diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
index 84c8900542e4..03c59bf22106 100644
--- a/drivers/clk/mvebu/cp110-system-controller.c
+++ b/drivers/clk/mvebu/cp110-system-controller.c
@@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
 				      GFP_KERNEL);
 	if (!cp110_clk_data)
 		return -ENOMEM;
+	cp110_clk_data->num = CP110_CLK_NUM;
 
 	cp110_clks = cp110_clk_data->hws;
-	cp110_clk_data->num = CP110_CLK_NUM;
 
 	/* Register the PLL0 which is the root of the hw tree */
 	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
index 592c7c3cdeb7..72689448a653 100644
--- a/drivers/clk/qcom/clk-cpu-8996.c
+++ b/drivers/clk/qcom/clk-cpu-8996.c
@@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	base = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(base))
@@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 
 	data->hws[0] = &pwrcl_pmux.clkr.hw;
 	data->hws[1] = &perfcl_pmux.clkr.hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
 }
diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
index d95a33293b0a..92d14350c4b3 100644
--- a/drivers/clk/ralink/clk-mt7621.c
+++ b/drivers/clk/ralink/clk-mt7621.c
@@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = count;
 
 	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
 		clk_data->hws[i] = mt7621_clk_early[i];
@@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 		goto unreg_clk_fixed;
 	}
 
-	clk_data->num = count;
-
 	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 	if (ret) {
 		dev_err(dev, "Couldn't add clk hw provider\n");
diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
index 6f076cf4b403..a1ca3916f42b 100644
--- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
+++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
@@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_NUM;
 	tcon_top->clk_data = clk_data;
 
 	spin_lock_init(&tcon_top->reg_lock);
@@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 			goto err_unregister_gates;
 		}
 
-	clk_data->num = CLK_NUM;
-
 	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
 				     clk_data);
 	if (ret)
diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
index e0e722b9be31..8e5078304646 100644
--- a/drivers/phy/qualcomm/phy-qcom-edp.c
+++ b/drivers/phy/qualcomm/phy-qcom-edp.c
@@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
 	init.ops = &qcom_edp_dp_link_clk_ops;
@@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 
 	data->hws[0] = &edp->dp_link_hw;
 	data->hws[1] = &edp->dp_pixel_hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
 }
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index 0f0cd01906b4..ec32ec58c59f 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -1379,7 +1379,7 @@ struct clk_onecell_data {
 
 struct clk_hw_onecell_data {
 	unsigned int num;
-	struct clk_hw *hws[];
+	struct clk_hw *hws[] __counted_by(num);
 };
 
 #define CLK_OF_DECLARE(name, compat, fn) \
-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:30 ` Kees Cook
  0 siblings, 0 replies; 13+ messages in thread
From: Kees Cook @ 2023-08-17 20:30 UTC (permalink / raw)
  To: Michael Turquette
  Cc: Andrew Lunn, linux-aspeed, Andrew Jeffery, llvm, dri-devel,
	linux-hardening, linux-phy, linux-clk, Kishon Vijay Abraham I,
	Samuel Holland, Gregory Clement, Jernej Skrabec,
	Sergio Paracuellos, Chen-Yu Tsai, Andy Gross, Joel Stanley,
	Tom Rix, linux-sunxi, Sebastian Hesselbarth, Kees Cook,
	linux-arm-msm, Maxime Ripard, Nathan Chancellor, linux-mediatek,
	Matthias Brugger, linux-arm-kernel, AngeloGioacchino Del Regno,
	Qin Jian, Taichi Sugaya, Bjorn Andersson, Nick Desaulniers,
	linux-kernel, Konrad Dybcio, Stephen Boyd, Vinod Koul,
	Takao Orito

Prepare for the coming implementation by GCC and Clang of the __counted_by
attribute. Flexible array members annotated with __counted_by can have
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
functions).

As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
Additionally, since the element count member must be set before accessing
the annotated flexible array member, move its initialization earlier.

[1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci

Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
Cc: Takao Orito <orito.takao@socionext.com>
Cc: Qin Jian <qinjian@cqplus1.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Gregory Clement <gregory.clement@bootlin.com>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Cc: Andy Gross <agross@kernel.org>
Cc: Bjorn Andersson <andersson@kernel.org>
Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: David Airlie <airlied@gmail.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Samuel Holland <samuel@sholland.org>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: Kishon Vijay Abraham I <kishon@kernel.org>
Cc: linux-clk@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-aspeed@lists.ozlabs.org
Cc: linux-arm-msm@vger.kernel.org
Cc: linux-mediatek@lists.infradead.org
Cc: dri-devel@lists.freedesktop.org
Cc: linux-sunxi@lists.linux.dev
Cc: linux-phy@lists.infradead.org
Signed-off-by: Kees Cook <keescook@chromium.org>
---
 drivers/clk/clk-aspeed.c                    | 3 +--
 drivers/clk/clk-ast2600.c                   | 2 +-
 drivers/clk/clk-gemini.c                    | 2 +-
 drivers/clk/clk-milbeaut.c                  | 3 +--
 drivers/clk/clk-sp7021.c                    | 3 +--
 drivers/clk/mvebu/cp110-system-controller.c | 2 +-
 drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
 drivers/clk/ralink/clk-mt7621.c             | 3 +--
 drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
 drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
 include/linux/clk-provider.h                | 2 +-
 11 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
index 284710adaef5..ff84191d0fe8 100644
--- a/drivers/clk/clk-aspeed.c
+++ b/drivers/clk/clk-aspeed.c
@@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!aspeed_clk_data)
 		return;
+	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
 		aspeed_ast2500_cc(map);
 	else
 		pr_err("unknown platform, failed to add clocks\n");
-
-	aspeed_clk_data->num = ASPEED_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
index f9e27f95a967..909c3137c428 100644
--- a/drivers/clk/clk-ast2600.c
+++ b/drivers/clk/clk-ast2600.c
@@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
 	if (!aspeed_g6_clk_data)
 		return;
+	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 
 	/*
 	 * This way all clocks fetched before the platform device probes,
@@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
 	}
 
 	aspeed_g6_cc(map);
-	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
 	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
 	if (ret)
 		pr_err("failed to add DT provider: %d\n", ret);
diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
index a23fa6d47ef1..2572d15aadd0 100644
--- a/drivers/clk/clk-gemini.c
+++ b/drivers/clk/clk-gemini.c
@@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
 				  GFP_KERNEL);
 	if (!gemini_clk_data)
 		return;
+	gemini_clk_data->num = GEMINI_NUM_CLKS;
 
 	/*
 	 * This way all clock fetched before the platform device probes,
@@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
 	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
 
 	/* Register the clocks to be accessed by the device tree */
-	gemini_clk_data->num = GEMINI_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
index 050fd4fb588f..18c20aff45f7 100644
--- a/drivers/clk/clk-milbeaut.c
+++ b/drivers/clk/clk-milbeaut.c
@@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
 
 	if (!m10v_clk_data)
 		return;
+	m10v_clk_data->num = M10V_NUM_CLKS;
 
 	base = of_iomap(np, 0);
 	if (!base) {
@@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
 					base + CLKSEL(1), 0, 3, 0, rclk_table,
 					&m10v_crglock, NULL);
 	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
-
-	m10v_clk_data->num = M10V_NUM_CLKS;
 	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
 }
 CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
index 11d22043ddd7..01d3c4c7b0b2 100644
--- a/drivers/clk/clk-sp7021.c
+++ b/drivers/clk/clk-sp7021.c
@@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_MAX;
 
 	hws = clk_data->hws;
 	pd_ext.index = 0;
@@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
 			return PTR_ERR(hws[i]);
 	}
 
-	clk_data->num = CLK_MAX;
-
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 }
 
diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
index 84c8900542e4..03c59bf22106 100644
--- a/drivers/clk/mvebu/cp110-system-controller.c
+++ b/drivers/clk/mvebu/cp110-system-controller.c
@@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
 				      GFP_KERNEL);
 	if (!cp110_clk_data)
 		return -ENOMEM;
+	cp110_clk_data->num = CP110_CLK_NUM;
 
 	cp110_clks = cp110_clk_data->hws;
-	cp110_clk_data->num = CP110_CLK_NUM;
 
 	/* Register the PLL0 which is the root of the hw tree */
 	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
index 592c7c3cdeb7..72689448a653 100644
--- a/drivers/clk/qcom/clk-cpu-8996.c
+++ b/drivers/clk/qcom/clk-cpu-8996.c
@@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	base = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(base))
@@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
 
 	data->hws[0] = &pwrcl_pmux.clkr.hw;
 	data->hws[1] = &perfcl_pmux.clkr.hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
 }
diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
index d95a33293b0a..92d14350c4b3 100644
--- a/drivers/clk/ralink/clk-mt7621.c
+++ b/drivers/clk/ralink/clk-mt7621.c
@@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = count;
 
 	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
 		clk_data->hws[i] = mt7621_clk_early[i];
@@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
 		goto unreg_clk_fixed;
 	}
 
-	clk_data->num = count;
-
 	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
 	if (ret) {
 		dev_err(dev, "Couldn't add clk hw provider\n");
diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
index 6f076cf4b403..a1ca3916f42b 100644
--- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
+++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
@@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 				GFP_KERNEL);
 	if (!clk_data)
 		return -ENOMEM;
+	clk_data->num = CLK_NUM;
 	tcon_top->clk_data = clk_data;
 
 	spin_lock_init(&tcon_top->reg_lock);
@@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
 			goto err_unregister_gates;
 		}
 
-	clk_data->num = CLK_NUM;
-
 	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
 				     clk_data);
 	if (ret)
diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
index e0e722b9be31..8e5078304646 100644
--- a/drivers/phy/qualcomm/phy-qcom-edp.c
+++ b/drivers/phy/qualcomm/phy-qcom-edp.c
@@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
+	data->num = 2;
 
 	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
 	init.ops = &qcom_edp_dp_link_clk_ops;
@@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
 
 	data->hws[0] = &edp->dp_link_hw;
 	data->hws[1] = &edp->dp_pixel_hw;
-	data->num = 2;
 
 	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
 }
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index 0f0cd01906b4..ec32ec58c59f 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -1379,7 +1379,7 @@ struct clk_onecell_data {
 
 struct clk_hw_onecell_data {
 	unsigned int num;
-	struct clk_hw *hws[];
+	struct clk_hw *hws[] __counted_by(num);
 };
 
 #define CLK_OF_DECLARE(name, compat, fn) \
-- 
2.34.1


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

* [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
  2023-08-17 20:30 ` Kees Cook
                     ` (2 preceding siblings ...)
  (?)
@ 2023-08-17 20:42   ` Gustavo A. R. Silva
  -1 siblings, 0 replies; 13+ messages in thread
From: Gustavo A. R. Silva @ 2023-08-17 20:42 UTC (permalink / raw)
  To: linux-aspeed



On 8/17/23 14:30, Kees Cook wrote:
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
> 
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
> 
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
> 
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk at vger.kernel.org
> Cc: linux-arm-kernel at lists.infradead.org
> Cc: linux-aspeed at lists.ozlabs.org
> Cc: linux-arm-msm at vger.kernel.org
> Cc: linux-mediatek at lists.infradead.org
> Cc: dri-devel at lists.freedesktop.org
> Cc: linux-sunxi at lists.linux.dev
> Cc: linux-phy at lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>

Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>

Thanks
--
Gustavo

> ---
>   drivers/clk/clk-aspeed.c                    | 3 +--
>   drivers/clk/clk-ast2600.c                   | 2 +-
>   drivers/clk/clk-gemini.c                    | 2 +-
>   drivers/clk/clk-milbeaut.c                  | 3 +--
>   drivers/clk/clk-sp7021.c                    | 3 +--
>   drivers/clk/mvebu/cp110-system-controller.c | 2 +-
>   drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
>   drivers/clk/ralink/clk-mt7621.c             | 3 +--
>   drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
>   drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
>   include/linux/clk-provider.h                | 2 +-
>   11 files changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
> index 284710adaef5..ff84191d0fe8 100644
> --- a/drivers/clk/clk-aspeed.c
> +++ b/drivers/clk/clk-aspeed.c
> @@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!aspeed_clk_data)
>   		return;
> +	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
>   		aspeed_ast2500_cc(map);
>   	else
>   		pr_err("unknown platform, failed to add clocks\n");
> -
> -	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
> index f9e27f95a967..909c3137c428 100644
> --- a/drivers/clk/clk-ast2600.c
> +++ b/drivers/clk/clk-ast2600.c
> @@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
>   	if (!aspeed_g6_clk_data)
>   		return;
> +	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   	}
>   
>   	aspeed_g6_cc(map);
> -	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
> index a23fa6d47ef1..2572d15aadd0 100644
> --- a/drivers/clk/clk-gemini.c
> +++ b/drivers/clk/clk-gemini.c
> @@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!gemini_clk_data)
>   		return;
> +	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   
>   	/*
>   	 * This way all clock fetched before the platform device probes,
> @@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
>   	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
>   
>   	/* Register the clocks to be accessed by the device tree */
> -	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
> diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
> index 050fd4fb588f..18c20aff45f7 100644
> --- a/drivers/clk/clk-milbeaut.c
> +++ b/drivers/clk/clk-milbeaut.c
> @@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
>   
>   	if (!m10v_clk_data)
>   		return;
> +	m10v_clk_data->num = M10V_NUM_CLKS;
>   
>   	base = of_iomap(np, 0);
>   	if (!base) {
> @@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
>   					base + CLKSEL(1), 0, 3, 0, rclk_table,
>   					&m10v_crglock, NULL);
>   	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
> -
> -	m10v_clk_data->num = M10V_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
> diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
> index 11d22043ddd7..01d3c4c7b0b2 100644
> --- a/drivers/clk/clk-sp7021.c
> +++ b/drivers/clk/clk-sp7021.c
> @@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_MAX;
>   
>   	hws = clk_data->hws;
>   	pd_ext.index = 0;
> @@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   			return PTR_ERR(hws[i]);
>   	}
>   
> -	clk_data->num = CLK_MAX;
> -
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   }
>   
> diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
> index 84c8900542e4..03c59bf22106 100644
> --- a/drivers/clk/mvebu/cp110-system-controller.c
> +++ b/drivers/clk/mvebu/cp110-system-controller.c
> @@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
>   				      GFP_KERNEL);
>   	if (!cp110_clk_data)
>   		return -ENOMEM;
> +	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	cp110_clks = cp110_clk_data->hws;
> -	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	/* Register the PLL0 which is the root of the hw tree */
>   	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
> diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
> index 592c7c3cdeb7..72689448a653 100644
> --- a/drivers/clk/qcom/clk-cpu-8996.c
> +++ b/drivers/clk/qcom/clk-cpu-8996.c
> @@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	base = devm_platform_ioremap_resource(pdev, 0);
>   	if (IS_ERR(base))
> @@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   
>   	data->hws[0] = &pwrcl_pmux.clkr.hw;
>   	data->hws[1] = &perfcl_pmux.clkr.hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
> index d95a33293b0a..92d14350c4b3 100644
> --- a/drivers/clk/ralink/clk-mt7621.c
> +++ b/drivers/clk/ralink/clk-mt7621.c
> @@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = count;
>   
>   	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
>   		clk_data->hws[i] = mt7621_clk_early[i];
> @@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   		goto unreg_clk_fixed;
>   	}
>   
> -	clk_data->num = count;
> -
>   	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   	if (ret) {
>   		dev_err(dev, "Couldn't add clk hw provider\n");
> diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> index 6f076cf4b403..a1ca3916f42b 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> @@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_NUM;
>   	tcon_top->clk_data = clk_data;
>   
>   	spin_lock_init(&tcon_top->reg_lock);
> @@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   			goto err_unregister_gates;
>   		}
>   
> -	clk_data->num = CLK_NUM;
> -
>   	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
>   				     clk_data);
>   	if (ret)
> diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
> index e0e722b9be31..8e5078304646 100644
> --- a/drivers/phy/qualcomm/phy-qcom-edp.c
> +++ b/drivers/phy/qualcomm/phy-qcom-edp.c
> @@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
>   	init.ops = &qcom_edp_dp_link_clk_ops;
> @@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   
>   	data->hws[0] = &edp->dp_link_hw;
>   	data->hws[1] = &edp->dp_pixel_hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
> index 0f0cd01906b4..ec32ec58c59f 100644
> --- a/include/linux/clk-provider.h
> +++ b/include/linux/clk-provider.h
> @@ -1379,7 +1379,7 @@ struct clk_onecell_data {
>   
>   struct clk_hw_onecell_data {
>   	unsigned int num;
> -	struct clk_hw *hws[];
> +	struct clk_hw *hws[] __counted_by(num);
>   };
>   
>   #define CLK_OF_DECLARE(name, compat, fn) \

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

* Re: [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:42   ` Gustavo A. R. Silva
  0 siblings, 0 replies; 13+ messages in thread
From: Gustavo A. R. Silva @ 2023-08-17 20:42 UTC (permalink / raw)
  To: Kees Cook, Michael Turquette
  Cc: Stephen Boyd, Joel Stanley, Andrew Jeffery, Taichi Sugaya,
	Takao Orito, Qin Jian, Andrew Lunn, Gregory Clement,
	Sebastian Hesselbarth, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Sergio Paracuellos, Matthias Brugger, AngeloGioacchino Del Regno,
	Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec, David Airlie,
	Daniel Vetter, Samuel Holland, Vinod Koul, Kishon Vijay Abraham I,
	linux-clk, linux-arm-kernel, linux-aspeed, linux-arm-msm,
	linux-mediatek, dri-devel, linux-sunxi, linux-phy,
	Nathan Chancellor, Nick Desaulniers, Tom Rix, linux-kernel, llvm,
	linux-hardening



On 8/17/23 14:30, Kees Cook wrote:
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
> 
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
> 
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
> 
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-aspeed@lists.ozlabs.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: linux-sunxi@lists.linux.dev
> Cc: linux-phy@lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>

Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>

Thanks
--
Gustavo

> ---
>   drivers/clk/clk-aspeed.c                    | 3 +--
>   drivers/clk/clk-ast2600.c                   | 2 +-
>   drivers/clk/clk-gemini.c                    | 2 +-
>   drivers/clk/clk-milbeaut.c                  | 3 +--
>   drivers/clk/clk-sp7021.c                    | 3 +--
>   drivers/clk/mvebu/cp110-system-controller.c | 2 +-
>   drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
>   drivers/clk/ralink/clk-mt7621.c             | 3 +--
>   drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
>   drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
>   include/linux/clk-provider.h                | 2 +-
>   11 files changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
> index 284710adaef5..ff84191d0fe8 100644
> --- a/drivers/clk/clk-aspeed.c
> +++ b/drivers/clk/clk-aspeed.c
> @@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!aspeed_clk_data)
>   		return;
> +	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
>   		aspeed_ast2500_cc(map);
>   	else
>   		pr_err("unknown platform, failed to add clocks\n");
> -
> -	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
> index f9e27f95a967..909c3137c428 100644
> --- a/drivers/clk/clk-ast2600.c
> +++ b/drivers/clk/clk-ast2600.c
> @@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
>   	if (!aspeed_g6_clk_data)
>   		return;
> +	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   	}
>   
>   	aspeed_g6_cc(map);
> -	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
> index a23fa6d47ef1..2572d15aadd0 100644
> --- a/drivers/clk/clk-gemini.c
> +++ b/drivers/clk/clk-gemini.c
> @@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!gemini_clk_data)
>   		return;
> +	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   
>   	/*
>   	 * This way all clock fetched before the platform device probes,
> @@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
>   	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
>   
>   	/* Register the clocks to be accessed by the device tree */
> -	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
> diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
> index 050fd4fb588f..18c20aff45f7 100644
> --- a/drivers/clk/clk-milbeaut.c
> +++ b/drivers/clk/clk-milbeaut.c
> @@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
>   
>   	if (!m10v_clk_data)
>   		return;
> +	m10v_clk_data->num = M10V_NUM_CLKS;
>   
>   	base = of_iomap(np, 0);
>   	if (!base) {
> @@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
>   					base + CLKSEL(1), 0, 3, 0, rclk_table,
>   					&m10v_crglock, NULL);
>   	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
> -
> -	m10v_clk_data->num = M10V_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
> diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
> index 11d22043ddd7..01d3c4c7b0b2 100644
> --- a/drivers/clk/clk-sp7021.c
> +++ b/drivers/clk/clk-sp7021.c
> @@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_MAX;
>   
>   	hws = clk_data->hws;
>   	pd_ext.index = 0;
> @@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   			return PTR_ERR(hws[i]);
>   	}
>   
> -	clk_data->num = CLK_MAX;
> -
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   }
>   
> diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
> index 84c8900542e4..03c59bf22106 100644
> --- a/drivers/clk/mvebu/cp110-system-controller.c
> +++ b/drivers/clk/mvebu/cp110-system-controller.c
> @@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
>   				      GFP_KERNEL);
>   	if (!cp110_clk_data)
>   		return -ENOMEM;
> +	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	cp110_clks = cp110_clk_data->hws;
> -	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	/* Register the PLL0 which is the root of the hw tree */
>   	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
> diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
> index 592c7c3cdeb7..72689448a653 100644
> --- a/drivers/clk/qcom/clk-cpu-8996.c
> +++ b/drivers/clk/qcom/clk-cpu-8996.c
> @@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	base = devm_platform_ioremap_resource(pdev, 0);
>   	if (IS_ERR(base))
> @@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   
>   	data->hws[0] = &pwrcl_pmux.clkr.hw;
>   	data->hws[1] = &perfcl_pmux.clkr.hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
> index d95a33293b0a..92d14350c4b3 100644
> --- a/drivers/clk/ralink/clk-mt7621.c
> +++ b/drivers/clk/ralink/clk-mt7621.c
> @@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = count;
>   
>   	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
>   		clk_data->hws[i] = mt7621_clk_early[i];
> @@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   		goto unreg_clk_fixed;
>   	}
>   
> -	clk_data->num = count;
> -
>   	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   	if (ret) {
>   		dev_err(dev, "Couldn't add clk hw provider\n");
> diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> index 6f076cf4b403..a1ca3916f42b 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> @@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_NUM;
>   	tcon_top->clk_data = clk_data;
>   
>   	spin_lock_init(&tcon_top->reg_lock);
> @@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   			goto err_unregister_gates;
>   		}
>   
> -	clk_data->num = CLK_NUM;
> -
>   	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
>   				     clk_data);
>   	if (ret)
> diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
> index e0e722b9be31..8e5078304646 100644
> --- a/drivers/phy/qualcomm/phy-qcom-edp.c
> +++ b/drivers/phy/qualcomm/phy-qcom-edp.c
> @@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
>   	init.ops = &qcom_edp_dp_link_clk_ops;
> @@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   
>   	data->hws[0] = &edp->dp_link_hw;
>   	data->hws[1] = &edp->dp_pixel_hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
> index 0f0cd01906b4..ec32ec58c59f 100644
> --- a/include/linux/clk-provider.h
> +++ b/include/linux/clk-provider.h
> @@ -1379,7 +1379,7 @@ struct clk_onecell_data {
>   
>   struct clk_hw_onecell_data {
>   	unsigned int num;
> -	struct clk_hw *hws[];
> +	struct clk_hw *hws[] __counted_by(num);
>   };
>   
>   #define CLK_OF_DECLARE(name, compat, fn) \

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

* Re: [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:42   ` Gustavo A. R. Silva
  0 siblings, 0 replies; 13+ messages in thread
From: Gustavo A. R. Silva @ 2023-08-17 20:42 UTC (permalink / raw)
  To: Kees Cook, Michael Turquette
  Cc: Stephen Boyd, Joel Stanley, Andrew Jeffery, Taichi Sugaya,
	Takao Orito, Qin Jian, Andrew Lunn, Gregory Clement,
	Sebastian Hesselbarth, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Sergio Paracuellos, Matthias Brugger, AngeloGioacchino Del Regno,
	Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec, David Airlie,
	Daniel Vetter, Samuel Holland, Vinod Koul, Kishon Vijay Abraham I,
	linux-clk, linux-arm-kernel, linux-aspeed, linux-arm-msm,
	linux-mediatek, dri-devel, linux-sunxi, linux-phy,
	Nathan Chancellor, Nick Desaulniers, Tom Rix, linux-kernel, llvm,
	linux-hardening



On 8/17/23 14:30, Kees Cook wrote:
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
> 
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
> 
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
> 
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-aspeed@lists.ozlabs.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: linux-sunxi@lists.linux.dev
> Cc: linux-phy@lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>

Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>

Thanks
--
Gustavo

> ---
>   drivers/clk/clk-aspeed.c                    | 3 +--
>   drivers/clk/clk-ast2600.c                   | 2 +-
>   drivers/clk/clk-gemini.c                    | 2 +-
>   drivers/clk/clk-milbeaut.c                  | 3 +--
>   drivers/clk/clk-sp7021.c                    | 3 +--
>   drivers/clk/mvebu/cp110-system-controller.c | 2 +-
>   drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
>   drivers/clk/ralink/clk-mt7621.c             | 3 +--
>   drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
>   drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
>   include/linux/clk-provider.h                | 2 +-
>   11 files changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
> index 284710adaef5..ff84191d0fe8 100644
> --- a/drivers/clk/clk-aspeed.c
> +++ b/drivers/clk/clk-aspeed.c
> @@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!aspeed_clk_data)
>   		return;
> +	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
>   		aspeed_ast2500_cc(map);
>   	else
>   		pr_err("unknown platform, failed to add clocks\n");
> -
> -	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
> index f9e27f95a967..909c3137c428 100644
> --- a/drivers/clk/clk-ast2600.c
> +++ b/drivers/clk/clk-ast2600.c
> @@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
>   	if (!aspeed_g6_clk_data)
>   		return;
> +	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   	}
>   
>   	aspeed_g6_cc(map);
> -	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
> index a23fa6d47ef1..2572d15aadd0 100644
> --- a/drivers/clk/clk-gemini.c
> +++ b/drivers/clk/clk-gemini.c
> @@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!gemini_clk_data)
>   		return;
> +	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   
>   	/*
>   	 * This way all clock fetched before the platform device probes,
> @@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
>   	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
>   
>   	/* Register the clocks to be accessed by the device tree */
> -	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
> diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
> index 050fd4fb588f..18c20aff45f7 100644
> --- a/drivers/clk/clk-milbeaut.c
> +++ b/drivers/clk/clk-milbeaut.c
> @@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
>   
>   	if (!m10v_clk_data)
>   		return;
> +	m10v_clk_data->num = M10V_NUM_CLKS;
>   
>   	base = of_iomap(np, 0);
>   	if (!base) {
> @@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
>   					base + CLKSEL(1), 0, 3, 0, rclk_table,
>   					&m10v_crglock, NULL);
>   	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
> -
> -	m10v_clk_data->num = M10V_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
> diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
> index 11d22043ddd7..01d3c4c7b0b2 100644
> --- a/drivers/clk/clk-sp7021.c
> +++ b/drivers/clk/clk-sp7021.c
> @@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_MAX;
>   
>   	hws = clk_data->hws;
>   	pd_ext.index = 0;
> @@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   			return PTR_ERR(hws[i]);
>   	}
>   
> -	clk_data->num = CLK_MAX;
> -
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   }
>   
> diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
> index 84c8900542e4..03c59bf22106 100644
> --- a/drivers/clk/mvebu/cp110-system-controller.c
> +++ b/drivers/clk/mvebu/cp110-system-controller.c
> @@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
>   				      GFP_KERNEL);
>   	if (!cp110_clk_data)
>   		return -ENOMEM;
> +	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	cp110_clks = cp110_clk_data->hws;
> -	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	/* Register the PLL0 which is the root of the hw tree */
>   	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
> diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
> index 592c7c3cdeb7..72689448a653 100644
> --- a/drivers/clk/qcom/clk-cpu-8996.c
> +++ b/drivers/clk/qcom/clk-cpu-8996.c
> @@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	base = devm_platform_ioremap_resource(pdev, 0);
>   	if (IS_ERR(base))
> @@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   
>   	data->hws[0] = &pwrcl_pmux.clkr.hw;
>   	data->hws[1] = &perfcl_pmux.clkr.hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
> index d95a33293b0a..92d14350c4b3 100644
> --- a/drivers/clk/ralink/clk-mt7621.c
> +++ b/drivers/clk/ralink/clk-mt7621.c
> @@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = count;
>   
>   	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
>   		clk_data->hws[i] = mt7621_clk_early[i];
> @@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   		goto unreg_clk_fixed;
>   	}
>   
> -	clk_data->num = count;
> -
>   	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   	if (ret) {
>   		dev_err(dev, "Couldn't add clk hw provider\n");
> diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> index 6f076cf4b403..a1ca3916f42b 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> @@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_NUM;
>   	tcon_top->clk_data = clk_data;
>   
>   	spin_lock_init(&tcon_top->reg_lock);
> @@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   			goto err_unregister_gates;
>   		}
>   
> -	clk_data->num = CLK_NUM;
> -
>   	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
>   				     clk_data);
>   	if (ret)
> diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
> index e0e722b9be31..8e5078304646 100644
> --- a/drivers/phy/qualcomm/phy-qcom-edp.c
> +++ b/drivers/phy/qualcomm/phy-qcom-edp.c
> @@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
>   	init.ops = &qcom_edp_dp_link_clk_ops;
> @@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   
>   	data->hws[0] = &edp->dp_link_hw;
>   	data->hws[1] = &edp->dp_pixel_hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
> index 0f0cd01906b4..ec32ec58c59f 100644
> --- a/include/linux/clk-provider.h
> +++ b/include/linux/clk-provider.h
> @@ -1379,7 +1379,7 @@ struct clk_onecell_data {
>   
>   struct clk_hw_onecell_data {
>   	unsigned int num;
> -	struct clk_hw *hws[];
> +	struct clk_hw *hws[] __counted_by(num);
>   };
>   
>   #define CLK_OF_DECLARE(name, compat, fn) \

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

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

* Re: [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:42   ` Gustavo A. R. Silva
  0 siblings, 0 replies; 13+ messages in thread
From: Gustavo A. R. Silva @ 2023-08-17 20:42 UTC (permalink / raw)
  To: Kees Cook, Michael Turquette
  Cc: Stephen Boyd, Joel Stanley, Andrew Jeffery, Taichi Sugaya,
	Takao Orito, Qin Jian, Andrew Lunn, Gregory Clement,
	Sebastian Hesselbarth, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Sergio Paracuellos, Matthias Brugger, AngeloGioacchino Del Regno,
	Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec, David Airlie,
	Daniel Vetter, Samuel Holland, Vinod Koul, Kishon Vijay Abraham I,
	linux-clk, linux-arm-kernel, linux-aspeed, linux-arm-msm,
	linux-mediatek, dri-devel, linux-sunxi, linux-phy,
	Nathan Chancellor, Nick Desaulniers, Tom Rix, linux-kernel, llvm,
	linux-hardening



On 8/17/23 14:30, Kees Cook wrote:
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
> 
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
> 
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
> 
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-aspeed@lists.ozlabs.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: linux-sunxi@lists.linux.dev
> Cc: linux-phy@lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>

Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>

Thanks
--
Gustavo

> ---
>   drivers/clk/clk-aspeed.c                    | 3 +--
>   drivers/clk/clk-ast2600.c                   | 2 +-
>   drivers/clk/clk-gemini.c                    | 2 +-
>   drivers/clk/clk-milbeaut.c                  | 3 +--
>   drivers/clk/clk-sp7021.c                    | 3 +--
>   drivers/clk/mvebu/cp110-system-controller.c | 2 +-
>   drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
>   drivers/clk/ralink/clk-mt7621.c             | 3 +--
>   drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
>   drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
>   include/linux/clk-provider.h                | 2 +-
>   11 files changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
> index 284710adaef5..ff84191d0fe8 100644
> --- a/drivers/clk/clk-aspeed.c
> +++ b/drivers/clk/clk-aspeed.c
> @@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!aspeed_clk_data)
>   		return;
> +	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
>   		aspeed_ast2500_cc(map);
>   	else
>   		pr_err("unknown platform, failed to add clocks\n");
> -
> -	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
> index f9e27f95a967..909c3137c428 100644
> --- a/drivers/clk/clk-ast2600.c
> +++ b/drivers/clk/clk-ast2600.c
> @@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
>   	if (!aspeed_g6_clk_data)
>   		return;
> +	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   	}
>   
>   	aspeed_g6_cc(map);
> -	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
> index a23fa6d47ef1..2572d15aadd0 100644
> --- a/drivers/clk/clk-gemini.c
> +++ b/drivers/clk/clk-gemini.c
> @@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!gemini_clk_data)
>   		return;
> +	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   
>   	/*
>   	 * This way all clock fetched before the platform device probes,
> @@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
>   	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
>   
>   	/* Register the clocks to be accessed by the device tree */
> -	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
> diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
> index 050fd4fb588f..18c20aff45f7 100644
> --- a/drivers/clk/clk-milbeaut.c
> +++ b/drivers/clk/clk-milbeaut.c
> @@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
>   
>   	if (!m10v_clk_data)
>   		return;
> +	m10v_clk_data->num = M10V_NUM_CLKS;
>   
>   	base = of_iomap(np, 0);
>   	if (!base) {
> @@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
>   					base + CLKSEL(1), 0, 3, 0, rclk_table,
>   					&m10v_crglock, NULL);
>   	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
> -
> -	m10v_clk_data->num = M10V_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
> diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
> index 11d22043ddd7..01d3c4c7b0b2 100644
> --- a/drivers/clk/clk-sp7021.c
> +++ b/drivers/clk/clk-sp7021.c
> @@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_MAX;
>   
>   	hws = clk_data->hws;
>   	pd_ext.index = 0;
> @@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   			return PTR_ERR(hws[i]);
>   	}
>   
> -	clk_data->num = CLK_MAX;
> -
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   }
>   
> diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
> index 84c8900542e4..03c59bf22106 100644
> --- a/drivers/clk/mvebu/cp110-system-controller.c
> +++ b/drivers/clk/mvebu/cp110-system-controller.c
> @@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
>   				      GFP_KERNEL);
>   	if (!cp110_clk_data)
>   		return -ENOMEM;
> +	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	cp110_clks = cp110_clk_data->hws;
> -	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	/* Register the PLL0 which is the root of the hw tree */
>   	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
> diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
> index 592c7c3cdeb7..72689448a653 100644
> --- a/drivers/clk/qcom/clk-cpu-8996.c
> +++ b/drivers/clk/qcom/clk-cpu-8996.c
> @@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	base = devm_platform_ioremap_resource(pdev, 0);
>   	if (IS_ERR(base))
> @@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   
>   	data->hws[0] = &pwrcl_pmux.clkr.hw;
>   	data->hws[1] = &perfcl_pmux.clkr.hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
> index d95a33293b0a..92d14350c4b3 100644
> --- a/drivers/clk/ralink/clk-mt7621.c
> +++ b/drivers/clk/ralink/clk-mt7621.c
> @@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = count;
>   
>   	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
>   		clk_data->hws[i] = mt7621_clk_early[i];
> @@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   		goto unreg_clk_fixed;
>   	}
>   
> -	clk_data->num = count;
> -
>   	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   	if (ret) {
>   		dev_err(dev, "Couldn't add clk hw provider\n");
> diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> index 6f076cf4b403..a1ca3916f42b 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> @@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_NUM;
>   	tcon_top->clk_data = clk_data;
>   
>   	spin_lock_init(&tcon_top->reg_lock);
> @@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   			goto err_unregister_gates;
>   		}
>   
> -	clk_data->num = CLK_NUM;
> -
>   	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
>   				     clk_data);
>   	if (ret)
> diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
> index e0e722b9be31..8e5078304646 100644
> --- a/drivers/phy/qualcomm/phy-qcom-edp.c
> +++ b/drivers/phy/qualcomm/phy-qcom-edp.c
> @@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
>   	init.ops = &qcom_edp_dp_link_clk_ops;
> @@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   
>   	data->hws[0] = &edp->dp_link_hw;
>   	data->hws[1] = &edp->dp_pixel_hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
> index 0f0cd01906b4..ec32ec58c59f 100644
> --- a/include/linux/clk-provider.h
> +++ b/include/linux/clk-provider.h
> @@ -1379,7 +1379,7 @@ struct clk_onecell_data {
>   
>   struct clk_hw_onecell_data {
>   	unsigned int num;
> -	struct clk_hw *hws[];
> +	struct clk_hw *hws[] __counted_by(num);
>   };
>   
>   #define CLK_OF_DECLARE(name, compat, fn) \

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-17 20:42   ` Gustavo A. R. Silva
  0 siblings, 0 replies; 13+ messages in thread
From: Gustavo A. R. Silva @ 2023-08-17 20:42 UTC (permalink / raw)
  To: Kees Cook, Michael Turquette
  Cc: Andrew Lunn, linux-aspeed, Andrew Jeffery, llvm, dri-devel,
	linux-hardening, linux-phy, linux-clk, Kishon Vijay Abraham I,
	Samuel Holland, Gregory Clement, Jernej Skrabec,
	Sergio Paracuellos, Chen-Yu Tsai, Andy Gross, Joel Stanley,
	Tom Rix, linux-sunxi, Sebastian Hesselbarth, linux-arm-msm,
	Maxime Ripard, Nathan Chancellor, linux-mediatek,
	Matthias Brugger, linux-arm-kernel, AngeloGioacchino Del Regno,
	Qin Jian, Taichi Sugaya, Bjorn Andersson, Nick Desaulniers,
	linux-kernel, Konrad Dybcio, Stephen Boyd, Vinod Koul,
	Takao Orito



On 8/17/23 14:30, Kees Cook wrote:
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
> 
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
> 
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
> 
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-aspeed@lists.ozlabs.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: linux-sunxi@lists.linux.dev
> Cc: linux-phy@lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>

Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>

Thanks
--
Gustavo

> ---
>   drivers/clk/clk-aspeed.c                    | 3 +--
>   drivers/clk/clk-ast2600.c                   | 2 +-
>   drivers/clk/clk-gemini.c                    | 2 +-
>   drivers/clk/clk-milbeaut.c                  | 3 +--
>   drivers/clk/clk-sp7021.c                    | 3 +--
>   drivers/clk/mvebu/cp110-system-controller.c | 2 +-
>   drivers/clk/qcom/clk-cpu-8996.c             | 2 +-
>   drivers/clk/ralink/clk-mt7621.c             | 3 +--
>   drivers/gpu/drm/sun4i/sun8i_tcon_top.c      | 3 +--
>   drivers/phy/qualcomm/phy-qcom-edp.c         | 2 +-
>   include/linux/clk-provider.h                | 2 +-
>   11 files changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
> index 284710adaef5..ff84191d0fe8 100644
> --- a/drivers/clk/clk-aspeed.c
> +++ b/drivers/clk/clk-aspeed.c
> @@ -701,6 +701,7 @@ static void __init aspeed_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!aspeed_clk_data)
>   		return;
> +	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -732,8 +733,6 @@ static void __init aspeed_cc_init(struct device_node *np)
>   		aspeed_ast2500_cc(map);
>   	else
>   		pr_err("unknown platform, failed to add clocks\n");
> -
> -	aspeed_clk_data->num = ASPEED_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
> index f9e27f95a967..909c3137c428 100644
> --- a/drivers/clk/clk-ast2600.c
> +++ b/drivers/clk/clk-ast2600.c
> @@ -839,6 +839,7 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
>   	if (!aspeed_g6_clk_data)
>   		return;
> +	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   
>   	/*
>   	 * This way all clocks fetched before the platform device probes,
> @@ -860,7 +861,6 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
>   	}
>   
>   	aspeed_g6_cc(map);
> -	aspeed_g6_clk_data->num = ASPEED_G6_NUM_CLKS;
>   	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, aspeed_g6_clk_data);
>   	if (ret)
>   		pr_err("failed to add DT provider: %d\n", ret);
> diff --git a/drivers/clk/clk-gemini.c b/drivers/clk/clk-gemini.c
> index a23fa6d47ef1..2572d15aadd0 100644
> --- a/drivers/clk/clk-gemini.c
> +++ b/drivers/clk/clk-gemini.c
> @@ -404,6 +404,7 @@ static void __init gemini_cc_init(struct device_node *np)
>   				  GFP_KERNEL);
>   	if (!gemini_clk_data)
>   		return;
> +	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   
>   	/*
>   	 * This way all clock fetched before the platform device probes,
> @@ -457,7 +458,6 @@ static void __init gemini_cc_init(struct device_node *np)
>   	gemini_clk_data->hws[GEMINI_CLK_APB] = hw;
>   
>   	/* Register the clocks to be accessed by the device tree */
> -	gemini_clk_data->num = GEMINI_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, gemini_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(gemini_cc, "cortina,gemini-syscon", gemini_cc_init);
> diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
> index 050fd4fb588f..18c20aff45f7 100644
> --- a/drivers/clk/clk-milbeaut.c
> +++ b/drivers/clk/clk-milbeaut.c
> @@ -618,6 +618,7 @@ static void __init m10v_cc_init(struct device_node *np)
>   
>   	if (!m10v_clk_data)
>   		return;
> +	m10v_clk_data->num = M10V_NUM_CLKS;
>   
>   	base = of_iomap(np, 0);
>   	if (!base) {
> @@ -654,8 +655,6 @@ static void __init m10v_cc_init(struct device_node *np)
>   					base + CLKSEL(1), 0, 3, 0, rclk_table,
>   					&m10v_crglock, NULL);
>   	m10v_clk_data->hws[M10V_RCLK_ID] = hw;
> -
> -	m10v_clk_data->num = M10V_NUM_CLKS;
>   	of_clk_add_hw_provider(np, of_clk_hw_onecell_get, m10v_clk_data);
>   }
>   CLK_OF_DECLARE_DRIVER(m10v_cc, "socionext,milbeaut-m10v-ccu", m10v_cc_init);
> diff --git a/drivers/clk/clk-sp7021.c b/drivers/clk/clk-sp7021.c
> index 11d22043ddd7..01d3c4c7b0b2 100644
> --- a/drivers/clk/clk-sp7021.c
> +++ b/drivers/clk/clk-sp7021.c
> @@ -621,6 +621,7 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_MAX;
>   
>   	hws = clk_data->hws;
>   	pd_ext.index = 0;
> @@ -688,8 +689,6 @@ static int sp7021_clk_probe(struct platform_device *pdev)
>   			return PTR_ERR(hws[i]);
>   	}
>   
> -	clk_data->num = CLK_MAX;
> -
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   }
>   
> diff --git a/drivers/clk/mvebu/cp110-system-controller.c b/drivers/clk/mvebu/cp110-system-controller.c
> index 84c8900542e4..03c59bf22106 100644
> --- a/drivers/clk/mvebu/cp110-system-controller.c
> +++ b/drivers/clk/mvebu/cp110-system-controller.c
> @@ -240,9 +240,9 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
>   				      GFP_KERNEL);
>   	if (!cp110_clk_data)
>   		return -ENOMEM;
> +	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	cp110_clks = cp110_clk_data->hws;
> -	cp110_clk_data->num = CP110_CLK_NUM;
>   
>   	/* Register the PLL0 which is the root of the hw tree */
>   	pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
> diff --git a/drivers/clk/qcom/clk-cpu-8996.c b/drivers/clk/qcom/clk-cpu-8996.c
> index 592c7c3cdeb7..72689448a653 100644
> --- a/drivers/clk/qcom/clk-cpu-8996.c
> +++ b/drivers/clk/qcom/clk-cpu-8996.c
> @@ -590,6 +590,7 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   	data = devm_kzalloc(dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	base = devm_platform_ioremap_resource(pdev, 0);
>   	if (IS_ERR(base))
> @@ -605,7 +606,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
>   
>   	data->hws[0] = &pwrcl_pmux.clkr.hw;
>   	data->hws[1] = &perfcl_pmux.clkr.hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/drivers/clk/ralink/clk-mt7621.c b/drivers/clk/ralink/clk-mt7621.c
> index d95a33293b0a..92d14350c4b3 100644
> --- a/drivers/clk/ralink/clk-mt7621.c
> +++ b/drivers/clk/ralink/clk-mt7621.c
> @@ -521,6 +521,7 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = count;
>   
>   	for (i = 0; i < ARRAY_SIZE(mt7621_clks_base); i++)
>   		clk_data->hws[i] = mt7621_clk_early[i];
> @@ -537,8 +538,6 @@ static int mt7621_clk_probe(struct platform_device *pdev)
>   		goto unreg_clk_fixed;
>   	}
>   
> -	clk_data->num = count;
> -
>   	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
>   	if (ret) {
>   		dev_err(dev, "Couldn't add clk hw provider\n");
> diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> index 6f076cf4b403..a1ca3916f42b 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c
> @@ -141,6 +141,7 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   				GFP_KERNEL);
>   	if (!clk_data)
>   		return -ENOMEM;
> +	clk_data->num = CLK_NUM;
>   	tcon_top->clk_data = clk_data;
>   
>   	spin_lock_init(&tcon_top->reg_lock);
> @@ -213,8 +214,6 @@ static int sun8i_tcon_top_bind(struct device *dev, struct device *master,
>   			goto err_unregister_gates;
>   		}
>   
> -	clk_data->num = CLK_NUM;
> -
>   	ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
>   				     clk_data);
>   	if (ret)
> diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c
> index e0e722b9be31..8e5078304646 100644
> --- a/drivers/phy/qualcomm/phy-qcom-edp.c
> +++ b/drivers/phy/qualcomm/phy-qcom-edp.c
> @@ -744,6 +744,7 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   	data = devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL);
>   	if (!data)
>   		return -ENOMEM;
> +	data->num = 2;
>   
>   	snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev));
>   	init.ops = &qcom_edp_dp_link_clk_ops;
> @@ -763,7 +764,6 @@ static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node *np)
>   
>   	data->hws[0] = &edp->dp_link_hw;
>   	data->hws[1] = &edp->dp_pixel_hw;
> -	data->num = 2;
>   
>   	return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data);
>   }
> diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
> index 0f0cd01906b4..ec32ec58c59f 100644
> --- a/include/linux/clk-provider.h
> +++ b/include/linux/clk-provider.h
> @@ -1379,7 +1379,7 @@ struct clk_onecell_data {
>   
>   struct clk_hw_onecell_data {
>   	unsigned int num;
> -	struct clk_hw *hws[];
> +	struct clk_hw *hws[] __counted_by(num);
>   };
>   
>   #define CLK_OF_DECLARE(name, compat, fn) \

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

* [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
  2023-08-17 20:30 ` Kees Cook
  (?)
@ 2023-08-22 21:00   ` Stephen Boyd
  -1 siblings, 0 replies; 13+ messages in thread
From: Stephen Boyd @ 2023-08-22 21:00 UTC (permalink / raw)
  To: linux-aspeed

Quoting Kees Cook (2023-08-17 13:30:22)
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
> 
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
> 
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
> 
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk at vger.kernel.org
> Cc: linux-arm-kernel at lists.infradead.org
> Cc: linux-aspeed at lists.ozlabs.org
> Cc: linux-arm-msm at vger.kernel.org
> Cc: linux-mediatek at lists.infradead.org
> Cc: dri-devel at lists.freedesktop.org
> Cc: linux-sunxi at lists.linux.dev
> Cc: linux-phy at lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---

Applied to clk-next

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

* Re: [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-22 21:00   ` Stephen Boyd
  0 siblings, 0 replies; 13+ messages in thread
From: Stephen Boyd @ 2023-08-22 21:00 UTC (permalink / raw)
  To: Kees Cook, Michael Turquette
  Cc: Kees Cook, Joel Stanley, Andrew Jeffery, Taichi Sugaya,
	Takao Orito, Qin Jian, Andrew Lunn, Gregory Clement,
	Sebastian Hesselbarth, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Sergio Paracuellos, Matthias Brugger, AngeloGioacchino Del Regno,
	Maxime Ripard, Chen-Yu Tsai, Jernej Skrabec, David Airlie,
	Daniel Vetter, Samuel Holland, Vinod Koul, Kishon Vijay Abraham I,
	linux-clk, linux-arm-kernel, linux-aspe 

Quoting Kees Cook (2023-08-17 13:30:22)
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
> 
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
> 
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
> 
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-aspeed@lists.ozlabs.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: linux-sunxi@lists.linux.dev
> Cc: linux-phy@lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---

Applied to clk-next

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

* Re: [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by
@ 2023-08-22 21:00   ` Stephen Boyd
  0 siblings, 0 replies; 13+ messages in thread
From: Stephen Boyd @ 2023-08-22 21:00 UTC (permalink / raw)
  To: Kees Cook, Michael Turquette
  Cc: Andrew Lunn, linux-aspeed, Tom Rix, llvm, dri-devel,
	linux-hardening, linux-phy, linux-clk, Kishon Vijay Abraham I,
	Samuel Holland, Gregory Clement, Jernej Skrabec,
	Sergio Paracuellos, Chen-Yu Tsai, Andy Gross, Joel Stanley,
	linux-sunxi, Sebastian Hesselbarth, Kees Cook, linux-arm-msm,
	Maxime Ripard, Nathan Chancellor, linux-mediatek,
	Matthias Brugger, linux-arm-kernel, AngeloGioacchino Del Regno,
	Qin Jian, Andrew Jeffery, Bjorn Andersson, Nick Desaulniers,
	linux-kernel, Konrad Dybcio, Taichi Sugaya, Vinod Koul,
	Takao Orito

Quoting Kees Cook (2023-08-17 13:30:22)
> Prepare for the coming implementation by GCC and Clang of the __counted_by
> attribute. Flexible array members annotated with __counted_by can have
> their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
> (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
> functions).
> 
> As found with Coccinelle[1], add __counted_by for struct clk_hw_onecell_data.
> Additionally, since the element count member must be set before accessing
> the annotated flexible array member, move its initialization earlier.
> 
> [1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
> 
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Stephen Boyd <sboyd@kernel.org>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Andrew Jeffery <andrew@aj.id.au>
> Cc: Taichi Sugaya <sugaya.taichi@socionext.com>
> Cc: Takao Orito <orito.takao@socionext.com>
> Cc: Qin Jian <qinjian@cqplus1.com>
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Gregory Clement <gregory.clement@bootlin.com>
> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Cc: Andy Gross <agross@kernel.org>
> Cc: Bjorn Andersson <andersson@kernel.org>
> Cc: Konrad Dybcio <konrad.dybcio@linaro.org>
> Cc: Sergio Paracuellos <sergio.paracuellos@gmail.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Chen-Yu Tsai <wens@csie.org>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Samuel Holland <samuel@sholland.org>
> Cc: Vinod Koul <vkoul@kernel.org>
> Cc: Kishon Vijay Abraham I <kishon@kernel.org>
> Cc: linux-clk@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-aspeed@lists.ozlabs.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: linux-sunxi@lists.linux.dev
> Cc: linux-phy@lists.infradead.org
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---

Applied to clk-next

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

end of thread, other threads:[~2023-08-22 21:00 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-17 20:30 [PATCH] clk: Annotate struct clk_hw_onecell_data with __counted_by Kees Cook
2023-08-17 20:30 ` Kees Cook
2023-08-17 20:30 ` Kees Cook
2023-08-17 20:30 ` Kees Cook
2023-08-17 20:30 ` Kees Cook
2023-08-17 20:42 ` Gustavo A. R. Silva
2023-08-17 20:42   ` Gustavo A. R. Silva
2023-08-17 20:42   ` Gustavo A. R. Silva
2023-08-17 20:42   ` Gustavo A. R. Silva
2023-08-17 20:42   ` Gustavo A. R. Silva
2023-08-22 21:00 ` Stephen Boyd
2023-08-22 21:00   ` Stephen Boyd
2023-08-22 21:00   ` Stephen Boyd

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.