• Ard Biesheuvel's avatar
    ARM: 9030/1: entry: omit FP emulation for UND exceptions taken in kernel mode · f77ac2e3
    Ard Biesheuvel authored
    There are a couple of problems with the exception entry code that deals
    with FP exceptions (which are reported as UND exceptions) when building
    the kernel in Thumb2 mode:
    - the conditional branch to vfp_kmode_exception in vfp_support_entry()
      may be out of range for its target, depending on how the linker decides
      to arrange the sections;
    - when the UND exception is taken in kernel mode, the emulation handling
      logic is entered via the 'call_fpe' label, which means we end up using
      the wrong value/mask pairs to match and detect the NEON opcodes.
    
    Since UND exceptions in kernel mode are unlikely to occur on a hot path
    (as opposed to the user mode version which is invoked for VFP support
    code and lazy restore), we can use the existing undef hook machinery for
    any kernel mode instruction emulation that is needed, including calling
    the existing vfp_kmode_exception() routine for unexpected cases. So drop
    the call to call_fpe, and instead, install an undef hook that will get
    called for NEON and VFP instructions that trigger an UND exception in
    kernel mode.
    
    While at it, make sure that the PC correction is accurate for the
    execution mode where the exception was taken, by checking the PSR
    Thumb bit.
    
    Cc: Dmitry Osipenko <digetx@gmail.com>
    Cc: Kees Cook <keescook@chromium.org>
    Fixes: eff8728f ("vmlinux.lds.h: Add PGO and AutoFDO input sections")
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    f77ac2e3
vfpmodule.c 21.4 KB