arm: mvebu: Kirkwood boards are broken by commit 6fe50e3
Tony Dinh
mibodhi at gmail.com
Fri Jun 20 23:21:59 CEST 2025
Hi Jerome,
On Fri, Jun 20, 2025 at 4:03 AM Jerome Forissier
<jerome.forissier at linaro.org> wrote:
>
> On 6/20/25 12:53, Jerome Forissier wrote:
> > Hi Tony,
> >
> > On 6/19/25 22:37, Tony Dinh wrote:
> >> Hi Jerome,
> >>
> >> While fixing some ext4 file system problems on 2025.07-rc4, I ran into
> >> a problem booting a few Kirkwood boards. kwboot loaded the u-boot
> >> image,
> >> and then u-boot execution was frozen without anything going to the
> >> serial console. I did a bisect and found the commit that caused it.
> >>
> >> https://github.com/trini/u-boot/commit/6fe50e39508043f386fc1bd40bbc02b8a75c1940
> >>
> >> When I tried to reverse this commit, I had a build error like this
> >> "{standard input}:24246: Error: selected processor does not support
> >> `mrc p15,1,r3,c15,c1,0' in Thumb mode"
> >>
> >> Currently, the only way to boot Kirkwood boards is to disable either
> >> CONFIG_LTO or CONFIG_SYS_THUMB_BUILD or both.
> >>
> >> I'm using the pogo_v4 and nsa325 boards as test beds. Please let me
> >> know if I can help with testing to troubleshoot this regression.
> >>
> >> All the best,
> >> Tony
> >
> > The problem seems to be that some arm32 instructions are inlined
> > inside thumb code and that's not allowed on this CPU without some
> > interworking instruction (bx, blx etc.). For example, consider
> > board_init_r(), is is mainly 16-bit instructions (Thumb):
> >
> > 006186a0 <board_init_r>:
> > board_init_r():
> > /home/jerome/work/u-boot/common/board_r.c:799
> > 6186a0: b5f0 push {r4, r5, r6, r7, lr}
> > 6186a2: b0ab sub sp, #172 @ 0xac
> > get_gd():
> > /home/jerome/work/u-boot/./arch/arm/include/asm/global_data.h:127
> > 6186a4: 464a mov r2, r9
> > ...
> >
> > but then suddenly:
> >
> > /home/jerome/work/u-boot/arch/arm/mach-kirkwood/cpu.c:242
> > 619aae: 9b15 ldr r3, [sp, #84] @ 0x54
> > writefr_extra_feature_reg():
> > /home/jerome/work/u-boot/./arch/arm/include/asm/arch/cpu.h:100
> > 619ab0: ee2f3f11 mcr 15, 1, r3, cr15, cr1, {0}
> > ^^^^^^^^
> > 32-bit arm instruction
> >
> > I would expect some call to a *_from_thumb() veneer, such as in:
> >
> > 006009dc <do_bootm_qnxelf>:
> > [...]
> > /home/jerome/work/u-boot/boot/bootm_os.c:379
> > 600a02: 9501 str r5, [sp, #4]
> > /home/jerome/work/u-boot/boot/bootm_os.c:384
> > 600a04: f04a fc7c bl 64b300 <__dcache_status_from_thumb>
> >
> >
> > 0064b130 <__dcache_enable_from_thumb>:
> > __dcache_enable_from_thumb():
> > 64b130: 4778 bx pc
> > 64b132: e7fd b.n 64b130 <__dcache_enable_from_thumb>
> > 64b134: e59fc000 ldr ip, [pc] @ 64b13c <__dcache_enable_from_thumb+0xc>
> > 64b138: e08cf00f add pc, ip, pc
> > 64b13c: fffffb28 .word 0xfffffb28
> >
> > We may need to move the inline functions with mrc/mcr to a .S file,
> > making sure it's built with -marm on CPUs that do not support Thumb2.
> > Then hopefully the proper interworking sequence would be inserted by the
> > linker as is the case when Thumb is calling into object files resulting
> > from .c files built with -marm (for example: arch/arm/mach-kirkwood/cpu.c
> > which has CFLAGS_cpu.o := -marm).
> >
> > In the meantime, could you try the following patch?
> >
> > diff --git a/common/Makefile b/common/Makefile
> > index 35991562a12..a509675335a 100644
> > --- a/common/Makefile
> > +++ b/common/Makefile
> > @@ -19,6 +19,8 @@ obj-y += version.o
> > # # boards
> > obj-y += board_f.o
> > obj-y += board_r.o
> > +CFLAGS_board_f.o += -marm
> > +CFLAGS_board_r.o += -marm
> > obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o
> > obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o
> >
> > I think it should resolve the issue, but is does also increase the
> > size of the binary (+4 KiB). So the .S solution would definitely be
> > better if it works IMO. I'll try to propose something ASAP, will
> > likely be on Monday, feel free to give it a try by yourself though :)
>
> Or maybe this which is a bit less radical:
>
> diff --git a/common/Makefile b/common/Makefile
> index 35991562a12..f0b7eadf7d2 100644
> --- a/common/Makefile
> +++ b/common/Makefile
> @@ -19,6 +19,8 @@ obj-y += version.o
> # # boards
> obj-y += board_f.o
> obj-y += board_r.o
> +CFLAGS_REMOVE_board_f.o := $(LTO_CFLAGS)
> +CFLAGS_REMOVE_board_r.o := $(LTO_CFLAGS)
> obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o
> obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o
>
> Still results in +1 KiB.
The above patch works great! I've tested it on 3 Kirkwood boards: the
Pogo V4 (88F6192), Zyxel NSA325 (88F6282), and GoFlex Home (88F6281,
same SoC as the Sheevaplug).
The Sheevaplug is now 498K, which is well under limit. All these
boards see only 1K increase in binary size.
All the best,
Tony
>
> --
> Jerome
More information about the U-Boot
mailing list