BCM4704 stopped booting with 4.4 (due to vmlinux size?)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

>From time to time I test new kernels with ancient Linksys WRT300N v1.0
device based on BCM4704 SoC.

I noticed that after updating kernel from 4.3 to 4.4 it doen't boot
anymore. All I can see is the last CFE's (bootloader's) message:
> Starting program at 0x80001000
Enabling CONFIG_EARLY_PRINTK doesn't help.

After hours or bisecting and testing I found out that it's not caused
by any /real/ code change but rather adding a kernel message. It seems
that by adding enough print messages I can stop kernel from booting.

I didn't know what exactly to look at so I started with "objdump
--syms vmlinux". I took 4.1.16 and 4.3.4 and tried adding to them
various amount of unique pr_info messages in some random error code
path (never executed). I noticed that address of .data was increasing
which makes me believe that it's a matter of .rodata size or some
affected size/offset in vmlinux.
1) 4.1.6: if .data starts at 80369000 of higher kernel doesn't boot.
2) 4.3.4: if .data starts at 80368000 of higher kernel doesn't boot.

Do you have any idea what this problem can be caused by? Any idea how
to fix/workaround it? Can I provide any extra info?

It doesn't affect all BCM4704 devices. Hauke also has some router
using this SoC and he couldn't reproduce this problem.
On the other hand Paul also experiences some problems with his Linksys
WRT54GL (BCM5352E), the last stable kernel for him seems to be 3.18.
Not sure if it's related however.


4.1.16

GOOD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802bd000 l    d  .rodata        00000000 .rodata
8035c000 l    d  .data  00000000 .data
8038ebc8 l    d  .init.data     00000000 .init.data

GOOD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802bd000 l    d  .rodata        00000000 .rodata
80365000 l    d  .data  00000000 .data
80398bc8 l    d  .init.data     00000000 .init.data

GOOD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802bd000 l    d  .rodata        00000000 .rodata
80367000 l    d  .data  00000000 .data
8039abc8 l    d  .init.data     00000000 .init.data

GOOD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802bd000 l    d  .rodata        00000000 .rodata
80368000 l    d  .data  00000000 .data
8039abc8 l    d  .init.data     00000000 .init.data

BAD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802bd000 l    d  .rodata        00000000 .rodata
80369000 l    d  .data  00000000 .data
8039cbc8 l    d  .init.data     00000000 .init.data

BAD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802bd000 l    d  .rodata        00000000 .rodata
8036a000 l    d  .data  00000000 .data
8039cbc8 l    d  .init.data     00000000 .init.data

BAD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802bd000 l    d  .rodata        00000000 .rodata
8036b000 l    d  .data  00000000 .data
8039ebc8 l    d  .init.data     00000000 .init.data


4.3.4

GOOD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802c0000 l    d  .rodata        00000000 .rodata
80362000 l    d  .data  00000000 .data
80394f68 l    d  .init.data     00000000 .init.data

GOOD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802c0000 l    d  .rodata        00000000 .rodata
80365000 l    d  .data  00000000 .data
80398f68 l    d  .init.data     00000000 .init.data

GOOD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802c0000 l    d  .rodata        00000000 .rodata
80367000 l    d  .data  00000000 .data
8039af68 l    d  .init.data     00000000 .init.data

BAD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802c0000 l    d  .rodata        00000000 .rodata
80368000 l    d  .data  00000000 .data
8039af68 l    d  .init.data     00000000 .init.data

BAD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802c0000 l    d  .rodata        00000000 .rodata
8036d000 l    d  .data  00000000 .data
803a0f68 l    d  .init.data     00000000 .init.data

BAD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802c0000 l    d  .rodata        00000000 .rodata
8036f000 l    d  .data  00000000 .data
803a2f68 l    d  .init.data     00000000 .init.data

BAD
> objdump --syms vmlinux | egrep "(ro)?data" | head -n 3
802c0000 l    d  .rodata        00000000 .rodata
80372000 l    d  .data  00000000 .data
803a4f68 l    d  .init.data     00000000 .init.data

-- 
Rafał




[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux