• Ard Biesheuvel's avatar
    ARM: switch_to: clean up Thumb2 code path · b832faec
    Ard Biesheuvel authored
    The load-multiple instruction that essentially performs the switch_to
    operation in ARM mode, by loading all callee save registers as well the
    stack pointer and the program counter, is split into 3 separate loads
    for Thumb-2, with the IP register used as a temporary to capture the
    value of R4 before it gets overwritten.
    
    We can clean this up a bit, by sticking with a single LDMIA instruction,
    but one that pops SP and PC into IP and LR, respectively, and by using
    ordinary move register and branch instructions to get those values into
    SP and PC. This also allows us to move the set_current call closer to
    the assignment of SP, reducing the window where those are mutually out
    of sync. This is especially relevant for CONFIG_VMAP_STACK, which is
    being introduced in a subsequent patch, where we need to issue a load
    that might fault from the new stack while running from the old one, to
    ensure that stale PMD entries in the VMALLOC space are synced up.
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Tested-by: default avatarKeith Packard <keithpac@amazon.com>
    Tested-by: default avatarMarc Zyngier <maz@kernel.org>
    Tested-by: Vladimir Murzin <vladimir.murzin@arm.com> # ARMv7M
    b832faec
entry-armv.S 30.7 KB