• Paul Walmsley's avatar
    ARM: 7801/1: v6: prevent gcc 4.5 from reordering extended CP15 reads above is_smp() test · 067e710b
    Paul Walmsley authored
    Commit 621a0147 ("ARM: 7757/1: mm:
    don't flush icache in switch_mm with hardware broadcasting") breaks
    the boot on OMAP2430SDP with omap2plus_defconfig.  Tracked to an
    undefined instruction abort from the CP15 read in
    cache_ops_need_broadcast().  It turns out that gcc 4.5 reorders the
    extended CP15 read above the is_smp() test.  This breaks ARM1136 r0
    cores, since they don't support several CP15 registers that later ARM
    cores do.  ARM1136JF-S TRM section 3.2.1 "Register allocation" has the
    details.
    
    So mark the extended CP15 read as clobbering memory, which prevents
    the compiler from reordering it before the is_smp() test.  Russell
    states that the code generated from this approach is preferable to
    marking the inline asm as volatile.  Remove the existing condition
    code clobber as it's obsolete, per Nico's post:
    
        http://www.spinics.net/lists/arm-kernel/msg261208.html
    
    This patch is a collaboration with Will Deacon and Russell King.
    
    Comments from Paul Walmsley:
    
     Russell, if you accept this one, might you also add Will's ack from the lists:
    
    Comments from Paul Walmsley:
    
     I'd also be obliged if you could add a Cc: line for Jonathan Austin, since he helped test:
    Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
    Cc: Tony Lindgren <tony@atomide.com>
    Acked-by: default avatarWill Deacon <will.deacon@arm.com>
    Cc: Jonathan Austin <jonathan.austin@arm.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    067e710b
cputype.h 5.34 KB