• Dave Martin's avatar
    ARM: 6516/1: Allow SMP_ON_UP to work with Thumb-2 kernels. · ed3768a8
    Dave Martin authored
      * __fixup_smp_on_up has been modified with support for the
        THUMB2_KERNEL case.  For THUMB2_KERNEL only, fixups are split
        into halfwords in case of misalignment, since we can't rely on
        unaligned accesses working before turning the MMU on.
    
        No attempt is made to optimise the aligned case, since the
        number of fixups is typically small, and it seems best to keep
        the code as simple as possible.
    
      * Add a rotate in the fixup_smp code in order to support
        CPU_BIG_ENDIAN, as suggested by Nicolas Pitre.
    
      * Add an assembly-time sanity-check to ALT_UP() to ensure that
        the content really is the right size (4 bytes).
    
        (No check is done for ALT_SMP().  Possibly, this could be fixed
        by splitting the two uses ot ALT_SMP() (ALT_SMP...SMP_UP versus
        ALT_SMP...SMP_UP_B) into two macros.  In the first case,
        ALT_SMP needs to expand to >= 4 bytes, not == 4.)
    
      * smp_mpidr.h (which implements ALT_SMP()/ALT_UP() manually due
        to macro limitations) has not been modified: the affected
        instruction (mov) has no 16-bit encoding, so the correct
        instruction size is satisfied in this case.
    
      * A "mode" parameter has been added to smp_dmb:
    
        smp_dmb arm @ assumes 4-byte instructions (for ARM code, e.g. kuser)
        smp_dmb     @ uses W() to ensure 4-byte instructions for ALT_SMP()
    
        This avoids assembly failures due to use of W() inside smp_dmb,
        when assembling pure-ARM code in the vectors page.
    
        There might be a better way to achieve this.
    
      * Kconfig: make SMP_ON_UP depend on
        (!THUMB2_KERNEL || !BIG_ENDIAN) i.e., THUMB2_KERNEL is now
        supported, but only if !BIG_ENDIAN (The fixup code for Thumb-2
        currently assumes little-endian order.)
    
    Tested using a single generic realview kernel on:
    	ARM RealView PB-A8 (CONFIG_THUMB2_KERNEL={n,y})
    	ARM RealView PBX-A9 (SMP)
    Signed-off-by: default avatarDave Martin <dave.martin@linaro.org>
    Acked-by: default avatarNicolas Pitre <nicolas.pitre@linaro.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    ed3768a8
entry-armv.S 29 KB