RBTX4927: linux-2.6.24-rc4 hang on boot
PATCH 1/1 RBTX4927: linux-2.6.24-rc4 hang on boot
In linux-2.6.24-rc4 the Toshiba RBTX4927 hangs on boot.
The cause is that plat_time_init() from arch/mips/tx4927/common/tx4927_setup.c does not override the __weak plat_time_init() from arch/mips/kernel/time.c. This is due to a compiler bug in gcc 4.1.1. The bug is reported to not exist in earlier versions of gcc, and to be fixed in 4.1.2. The problem is that the __weak plat_time_init() is empty and thus gets optimized out of existence (thus the linker is never given the option to replace the __weak function).
For more info on the gcc bug see
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27781
The attached patch is one workaround. Another possible workaround would be to change the __weak plat_time_init() to be a non-empty function.
---
arch/mips/kernel/Makefile | 4 4 + 0 - 0 !
1 files changed, 4 insertions(+)
arch/mips/kernel/Makefile +4 -0
@@ -83,6 +83,10 @@ obj-$(CONFIG_EARLY_PRINTK) += early_prin CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi) +# workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27781, +# which impacts plat_time_init() for tx4927, gcc 4.1.1 +CFLAGS_time.o += -fno-unit-at-a-time + obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT) += 8250-platform.o EXTRA_CFLAGS += -Werror
Quoted 9 lines · Frank Rowand
In linux-2.6.24-rc4 the Toshiba RBTX4927 hangs on boot.
The cause is that
plat_time_init()fromarch/mips/tx4927/common/tx4927_setup.cdoes not override the__weakplat_time_init()fromarch/mips/kernel/time.c. This is due to a compiler bug in gcc 4.1.1. The bug is reported to not exist in earlier versions of gcc, and to be fixed in 4.1.2. The problem is that the__weakplat_time_init()is empty and thus gets optimized out of existence (thus the linker is never given the option to replace the__weakfunction).
You meant the call to plat_time_init() from time_init() gets optimized away.
Quoted 7 lines
For more info on the gcc bug see
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27781The attached patch is one workaround. Another possible workaround would be to change the
__weakplat_time_init()to be a non-empty function.
The __weak definition of plat_time_init was only ever meant to be a migration helper to keep platforms that don't have a plat_time_init compiling. A few greps says that all platforms now supply their own plat_time_init() so the weak definition is no longer needed. So I instead delete it.
Ralf