On 06/13/2012 03:26 PM, Michael Hope wrote:
> On 14 June 2012 04:22, Rob Herring <robherri...@gmail.com> wrote:
>> On 06/10/2012 05:31 PM, Michael Hope wrote:
>>> There's an interaction between Linaro GCC or FSF GCC 4.7 and Linux
>>> kernels before 3.2 which causes the kernel to halt straight after
>>> showing 'Uncompressing Linux'.  The question comes up every couple of
>>> months so I've blogged about it:
>>>  http://seabright.co.nz/2012/06/11/kernel-not-booting-with-linaro-gcc/
>>>
>>> """
>>> Is your ARM Linux kernel not booting when building with Linaro GCC or
>>> FSF GCC 4.7? Does it halt shortly after showing ‘Uncompressing Linux’?
>>> You may have run into an interaction between older kernels and the new
>>> unaligned access support in GCC. This affects Linaro GCC from
>>> 4.6-2011.11 onwards, GCC from 4.7.0 on, and kernels earlier than 3.2
>>> including the Galaxy Nexus Icecream Sandwich release.
>>>
>>> The work-around is to add -mno-unaligned-access to KBUILD_CFLAGS in
>>> the top level kernel Makefile or to backport
>>> 8428e84d42179c2a00f5f6450866e70d802d1d05 from the current kernel tree.
>>>
>>> ARMv6K and later processors have hardware support for doing unaligned
>>> loads and stores which is faster than the old byte-by-byte/recombine
>>> that was done in software. Later versions of GCC use this to do
>>> quicker loads when working on known unaligned data, such as when
>>> working on a protocol buffer or a packed structure.
>>>
>>> The CPU can be configured to trap on unaligned access. This trap is
>>> off at reset, but pre 3.2 kernels turn this on during the initial
>>> boot. An interaction between -fconserve-stack and -munaligned-access
>>> on a char buffer lead to an unaligned access, which causes a trap,
>>> which causes the kernel to halt.
>>>
>>> This does not affect userspace programs as they run with the trap turned 
>>> off.
>>> """
>>
>> I've also hit this with u-boot if I enable armv7-a builds. Mainline
>> u-boot generally builds using -march=armv5 and unaligned accesses
>> disabled in h/w. Generally u-boot starts but dies on certain commands. I
>> think there may be other u-boot issues with v7 compiles on newer gcc
>> versions, but haven't debugged things further.
> 
> Note that this is done through a unaligned access trap that is off by
> default.  A quick grep through u-boot git shows that it defines CR_A
> but doesn't use it.
> 

The A bit is on in u-boot.

armv7 start.S:

        mrc     p15, 0, r0, c1, c0, 0
        bic     r0, r0, #0x00002000     @ clear bits 13 (--V-)
        bic     r0, r0, #0x00000007     @ clear bits 2:0 (-CAM)
        orr     r0, r0, #0x00000002     @ set bit 1 (--A-) Align
        orr     r0, r0, #0x00000800     @ set bit 11 (Z---) BTB
#ifdef CONFIG_SYS_ICACHE_OFF
        bic     r0, r0, #0x00001000     @ clear bit 12 (I) I-cache
#else
        orr     r0, r0, #0x00001000     @ set bit 12 (I) I-cache
#endif
        mcr     p15, 0, r0, c1, c0, 0
        mov     pc, lr                  @ back to my caller


There is no trap handler in u-boot. I've turned off the A bit, but still
had some problems which I did not debug further.

Rob

> -- Michael


_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to