* [PATCH] ARM: integrator: Fix early initialization
@ 2025-05-18 16:41 Guenter Roeck
2025-05-18 17:47 ` Russell King (Oracle)
0 siblings, 1 reply; 6+ messages in thread
From: Guenter Roeck @ 2025-05-18 16:41 UTC (permalink / raw)
To: Linus Walleij
Cc: Liviu Dudau, Sudeep Holla, Lorenzo Pieralisi, Russell King,
linux-arm-kernel, linux-kernel, Guenter Roeck
Starting with commit bdb249fce9ad4 ("ARM: integrator: read counter using
syscon/regmap"), intcp_init_early calls syscon_regmap_lookup_by_compatible
which in turn calls of_syscon_register. This function allocates memory.
Since the memory management code has not been initialized at that time,
the call always fails. It either returns -ENOMEM or crashes as follows.
Unable to handle kernel NULL pointer dereference at virtual address 0000000c when read
[0000000c] *pgd=00000000
Internal error: Oops: 5 [#1] ARM
Modules linked in:
CPU: 0 UID: 0 PID: 0 Comm: swapper Not tainted 6.15.0-rc5-00026-g5fcc9bf84ee5 #1 PREEMPT
Hardware name: ARM Integrator/CP (Device Tree)
PC is at __kmalloc_cache_noprof+0xec/0x39c
LR is at __kmalloc_cache_noprof+0x34/0x39c
...
Call trace:
__kmalloc_cache_noprof from of_syscon_register+0x7c/0x310
of_syscon_register from device_node_get_regmap+0xa4/0xb0
device_node_get_regmap from intcp_init_early+0xc/0x40
intcp_init_early from start_kernel+0x60/0x688
start_kernel from 0x0
The crash is seen due to a dereferenced pointer which is not supposed to be
NULL but is NULL if the memory management subsystem has not been
initialized. The crash is not seen with all versions of gcc. Some versions
such as gcc 9.x apparently do not dereference the pointer, presumably if
tracing is disabled. The problem has been reproduced with gcc 10.x, 11.x,
and 13.x. Either case, if the crash is not seen, the call to
syscon_regmap_lookup_by_compatible returns -ENOMEM, and
sched_clock_register is never called.
Fix the problem by moving the early initialization code into the standard
machine initialization code.
Fixes: bdb249fce9ad4 ("ARM: integrator: read counter using syscon/regmap")
Cc: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
arch/arm/mach-versatile/integrator_cp.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/arch/arm/mach-versatile/integrator_cp.c b/arch/arm/mach-versatile/integrator_cp.c
index 2ed4ded56b3f..03dfb5f720b7 100644
--- a/arch/arm/mach-versatile/integrator_cp.c
+++ b/arch/arm/mach-versatile/integrator_cp.c
@@ -86,14 +86,6 @@ static u64 notrace intcp_read_sched_clock(void)
return val;
}
-static void __init intcp_init_early(void)
-{
- cm_map = syscon_regmap_lookup_by_compatible("arm,core-module-integrator");
- if (IS_ERR(cm_map))
- return;
- sched_clock_register(intcp_read_sched_clock, 32, 24000000);
-}
-
static void __init intcp_init_irq_of(void)
{
cm_init();
@@ -119,6 +111,10 @@ static void __init intcp_init_of(void)
{
struct device_node *cpcon;
+ cm_map = syscon_regmap_lookup_by_compatible("arm,core-module-integrator");
+ if (!IS_ERR(cm_map))
+ sched_clock_register(intcp_read_sched_clock, 32, 24000000);
+
cpcon = of_find_matching_node(NULL, intcp_syscon_match);
if (!cpcon)
return;
@@ -138,7 +134,6 @@ static const char * intcp_dt_board_compat[] = {
DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")
.reserve = integrator_reserve,
.map_io = intcp_map_io,
- .init_early = intcp_init_early,
.init_irq = intcp_init_irq_of,
.init_machine = intcp_init_of,
.dt_compat = intcp_dt_board_compat,
--
2.45.2
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] ARM: integrator: Fix early initialization
2025-05-18 16:41 [PATCH] ARM: integrator: Fix early initialization Guenter Roeck
@ 2025-05-18 17:47 ` Russell King (Oracle)
2025-05-18 19:09 ` Guenter Roeck
0 siblings, 1 reply; 6+ messages in thread
From: Russell King (Oracle) @ 2025-05-18 17:47 UTC (permalink / raw)
To: Guenter Roeck
Cc: Linus Walleij, Liviu Dudau, Sudeep Holla, Lorenzo Pieralisi,
linux-arm-kernel, linux-kernel
On Sun, May 18, 2025 at 09:41:18AM -0700, Guenter Roeck wrote:
> Starting with commit bdb249fce9ad4 ("ARM: integrator: read counter using
> syscon/regmap"), intcp_init_early calls syscon_regmap_lookup_by_compatible
> which in turn calls of_syscon_register. This function allocates memory.
> Since the memory management code has not been initialized at that time,
> the call always fails. It either returns -ENOMEM or crashes as follows.
Yet I see no thought whether having the scheduler see sched_clock()
suddenly change is a good idea or not. The point of the initialisation
being early is to avoid a jump in the scheduler clock.
So, was the commit you're trying to fix a good idea after all?
That question at least needs to be considered, rather than just moving
stuff like this later.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] ARM: integrator: Fix early initialization
2025-05-18 17:47 ` Russell King (Oracle)
@ 2025-05-18 19:09 ` Guenter Roeck
0 siblings, 0 replies; 6+ messages in thread
From: Guenter Roeck @ 2025-05-18 19:09 UTC (permalink / raw)
To: Russell King (Oracle)
Cc: Linus Walleij, Liviu Dudau, Sudeep Holla, Lorenzo Pieralisi,
linux-arm-kernel, linux-kernel
On 5/18/25 10:47, Russell King (Oracle) wrote:
> On Sun, May 18, 2025 at 09:41:18AM -0700, Guenter Roeck wrote:
>> Starting with commit bdb249fce9ad4 ("ARM: integrator: read counter using
>> syscon/regmap"), intcp_init_early calls syscon_regmap_lookup_by_compatible
>> which in turn calls of_syscon_register. This function allocates memory.
>> Since the memory management code has not been initialized at that time,
>> the call always fails. It either returns -ENOMEM or crashes as follows.
>
> Yet I see no thought whether having the scheduler see sched_clock()
> suddenly change is a good idea or not. The point of the initialisation
> being early is to avoid a jump in the scheduler clock.
>
> So, was the commit you're trying to fix a good idea after all?
>
> That question at least needs to be considered, rather than just moving
> stuff like this later.
>
Absolutely. Just consider this to be a bug report with a proposed fix.
Thanks,
Guenter
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] ARM: integrator: Fix early initialization
@ 2026-05-05 19:15 Linus Walleij
2026-05-05 21:14 ` Guenter Roeck
0 siblings, 1 reply; 6+ messages in thread
From: Linus Walleij @ 2026-05-05 19:15 UTC (permalink / raw)
To: soc; +Cc: linux-arm-kernel, Guenter Roeck, Linus Walleij
From: Guenter Roeck <linux@roeck-us.net>
Starting with commit bdb249fce9ad4 ("ARM: integrator: read counter using
syscon/regmap"), intcp_init_early calls syscon_regmap_lookup_by_compatible
which in turn calls of_syscon_register. This function allocates memory.
Since the memory management code has not been initialized at that time,
the call always fails. It either returns -ENOMEM or crashes as follows.
Unable to handle kernel NULL pointer dereference at virtual address 0000000c when read
[0000000c] *pgd=00000000
Internal error: Oops: 5 [#1] ARM
Modules linked in:
CPU: 0 UID: 0 PID: 0 Comm: swapper Not tainted 6.15.0-rc5-00026-g5fcc9bf84ee5 #1 PREEMPT
Hardware name: ARM Integrator/CP (Device Tree)
PC is at __kmalloc_cache_noprof+0xec/0x39c
LR is at __kmalloc_cache_noprof+0x34/0x39c
...
Call trace:
__kmalloc_cache_noprof from of_syscon_register+0x7c/0x310
of_syscon_register from device_node_get_regmap+0xa4/0xb0
device_node_get_regmap from intcp_init_early+0xc/0x40
intcp_init_early from start_kernel+0x60/0x688
start_kernel from 0x0
The crash is seen due to a dereferenced pointer which is not supposed to be
NULL but is NULL if the memory management subsystem has not been
initialized. The crash is not seen with all versions of gcc. Some versions
such as gcc 9.x apparently do not dereference the pointer, presumably if
tracing is disabled. The problem has been reproduced with gcc 10.x, 11.x,
and 13.x. Either case, if the crash is not seen, the call to
syscon_regmap_lookup_by_compatible returns -ENOMEM, and
sched_clock_register is never called.
Fix the problem by moving the early initialization code into the standard
machine initialization code.
Fixes: bdb249fce9ad4 ("ARM: integrator: read counter using syscon/regmap")
Cc: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/20250518164118.3859567-1-linux@roeck-us.net
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
Hi SoC folks, please apply this directly for fixes.
Got stuck on a sideways branch for way too long.
---
arch/arm/mach-versatile/integrator_cp.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/arch/arm/mach-versatile/integrator_cp.c b/arch/arm/mach-versatile/integrator_cp.c
index 2ed4ded56b3f..03dfb5f720b7 100644
--- a/arch/arm/mach-versatile/integrator_cp.c
+++ b/arch/arm/mach-versatile/integrator_cp.c
@@ -86,14 +86,6 @@ static u64 notrace intcp_read_sched_clock(void)
return val;
}
-static void __init intcp_init_early(void)
-{
- cm_map = syscon_regmap_lookup_by_compatible("arm,core-module-integrator");
- if (IS_ERR(cm_map))
- return;
- sched_clock_register(intcp_read_sched_clock, 32, 24000000);
-}
-
static void __init intcp_init_irq_of(void)
{
cm_init();
@@ -119,6 +111,10 @@ static void __init intcp_init_of(void)
{
struct device_node *cpcon;
+ cm_map = syscon_regmap_lookup_by_compatible("arm,core-module-integrator");
+ if (!IS_ERR(cm_map))
+ sched_clock_register(intcp_read_sched_clock, 32, 24000000);
+
cpcon = of_find_matching_node(NULL, intcp_syscon_match);
if (!cpcon)
return;
@@ -138,7 +134,6 @@ static const char * intcp_dt_board_compat[] = {
DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")
.reserve = integrator_reserve,
.map_io = intcp_map_io,
- .init_early = intcp_init_early,
.init_irq = intcp_init_irq_of,
.init_machine = intcp_init_of,
.dt_compat = intcp_dt_board_compat,
---
base-commit: 254f49634ee16a731174d2ae34bc50bd5f45e731
change-id: 20250603-integrator-fixes-a8345ddba610
Best regards,
--
Linus Walleij <linusw@kernel.org>
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] ARM: integrator: Fix early initialization
2026-05-05 19:15 Linus Walleij
@ 2026-05-05 21:14 ` Guenter Roeck
2026-05-05 21:25 ` Linus Walleij
0 siblings, 1 reply; 6+ messages in thread
From: Guenter Roeck @ 2026-05-05 21:14 UTC (permalink / raw)
To: Linus Walleij, soc; +Cc: linux-arm-kernel
On 5/5/26 12:15, Linus Walleij wrote:
> From: Guenter Roeck <linux@roeck-us.net>
>
> Starting with commit bdb249fce9ad4 ("ARM: integrator: read counter using
> syscon/regmap"), intcp_init_early calls syscon_regmap_lookup_by_compatible
> which in turn calls of_syscon_register. This function allocates memory.
> Since the memory management code has not been initialized at that time,
> the call always fails. It either returns -ENOMEM or crashes as follows.
>
> Unable to handle kernel NULL pointer dereference at virtual address 0000000c when read
> [0000000c] *pgd=00000000
> Internal error: Oops: 5 [#1] ARM
> Modules linked in:
> CPU: 0 UID: 0 PID: 0 Comm: swapper Not tainted 6.15.0-rc5-00026-g5fcc9bf84ee5 #1 PREEMPT
> Hardware name: ARM Integrator/CP (Device Tree)
> PC is at __kmalloc_cache_noprof+0xec/0x39c
> LR is at __kmalloc_cache_noprof+0x34/0x39c
> ...
> Call trace:
> __kmalloc_cache_noprof from of_syscon_register+0x7c/0x310
> of_syscon_register from device_node_get_regmap+0xa4/0xb0
> device_node_get_regmap from intcp_init_early+0xc/0x40
> intcp_init_early from start_kernel+0x60/0x688
> start_kernel from 0x0
>
> The crash is seen due to a dereferenced pointer which is not supposed to be
> NULL but is NULL if the memory management subsystem has not been
> initialized. The crash is not seen with all versions of gcc. Some versions
> such as gcc 9.x apparently do not dereference the pointer, presumably if
> tracing is disabled. The problem has been reproduced with gcc 10.x, 11.x,
> and 13.x. Either case, if the crash is not seen, the call to
> syscon_regmap_lookup_by_compatible returns -ENOMEM, and
> sched_clock_register is never called.
>
> Fix the problem by moving the early initialization code into the standard
> machine initialization code.
>
> Fixes: bdb249fce9ad4 ("ARM: integrator: read counter using syscon/regmap")
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> Link: https://lore.kernel.org/20250518164118.3859567-1-linux@roeck-us.net
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> Hi SoC folks, please apply this directly for fixes.
> Got stuck on a sideways branch for way too long.
I actually stopped testing the integratorcp qemu emulation
because it no longer works reliably, not even with gcc 9.x,
since the timer-sp804 patches were applied.
Given that apparently no one but me ever hit that problem,
I wonder if it is time to remove support for that machine entirely.
Guenter
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] ARM: integrator: Fix early initialization
2026-05-05 21:14 ` Guenter Roeck
@ 2026-05-05 21:25 ` Linus Walleij
0 siblings, 0 replies; 6+ messages in thread
From: Linus Walleij @ 2026-05-05 21:25 UTC (permalink / raw)
To: Guenter Roeck; +Cc: soc, linux-arm-kernel
On Tue, May 5, 2026 at 11:14 PM Guenter Roeck <linux@roeck-us.net> wrote:
> I actually stopped testing the integratorcp qemu emulation
> because it no longer works reliably, not even with gcc 9.x,
> since the timer-sp804 patches were applied.
>
> Given that apparently no one but me ever hit that problem,
> I wonder if it is time to remove support for that machine entirely.
I actually have the hardware, even several of them, I've been keeping
them as a base reference for old 32bit ARM. Ethernet broke on the
one I had out so I need to bring a new one (yeah, as in factory-new)
from a box.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-05-05 21:25 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-18 16:41 [PATCH] ARM: integrator: Fix early initialization Guenter Roeck
2025-05-18 17:47 ` Russell King (Oracle)
2025-05-18 19:09 ` Guenter Roeck
-- strict thread matches above, loose matches on Subject: below --
2026-05-05 19:15 Linus Walleij
2026-05-05 21:14 ` Guenter Roeck
2026-05-05 21:25 ` Linus Walleij
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox