• Ard Biesheuvel's avatar
    ARM: implement support for vmap'ed stacks · a1c510d0
    Ard Biesheuvel authored
    Wire up the generic support for managing task stack allocations via vmalloc,
    and implement the entry code that detects whether we faulted because of a
    stack overrun (or future stack overrun caused by pushing the pt_regs array)
    
    While this adds a fair amount of tricky entry asm code, it should be
    noted that it only adds a TST + branch to the svc_entry path. The code
    implementing the non-trivial handling of the overflow stack is emitted
    out-of-line into the .text section.
    
    Since on ARM, we rely on do_translation_fault() to keep PMD level page
    table entries that cover the vmalloc region up to date, we need to
    ensure that we don't hit such a stale PMD entry when accessing the
    stack. So we do a dummy read from the new stack while still running from
    the old one on the context switch path, and bump the vmalloc_seq counter
    when PMD level entries in the vmalloc range are modified, so that the MM
    switch fetches the latest version of the entries.
    
    Note that we need to increase the per-mode stack by 1 word, to gain some
    space to stash a GPR until we know it is safe to touch the stack.
    However, due to the cacheline alignment of the struct, this does not
    actually increase the memory footprint of the struct stack array at all.
    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
    a1c510d0
unwind.c 14.1 KB