• Nick Desaulniers's avatar
    x86/mem: Move memmove to out of line assembler · bce5a1e8
    Nick Desaulniers authored
    When building ARCH=i386 with CONFIG_LTO_CLANG_FULL=y, it's possible
    (depending on additional configs which I have not been able to isolate)
    to observe a failure during register allocation:
    
      error: inline assembly requires more registers than available
    
    when memmove is inlined into tcp_v4_fill_cb() or tcp_v6_fill_cb().
    
    memmove is quite large and probably shouldn't be inlined due to size
    alone. A noinline function attribute would be the simplest fix, but
    there's a few things that stand out with the current definition:
    
    In addition to having complex constraints that can't always be resolved,
    the clobber list seems to be missing %bx. By using numbered operands
    rather than symbolic operands, the constraints are quite obnoxious to
    refactor.
    
    Having a large function be 99% inline asm is a code smell that this
    function should simply be written in stand-alone out-of-line assembler.
    
    Moving this to out of line assembler guarantees that the
    compiler cannot inline calls to memmove.
    
    This has been done previously for 64b:
    commit 9599ec04 ("x86-64, mem: Convert memmove() to assembly file
    and fix return value bug")
    
    That gives the opportunity for other cleanups like fixing the
    inconsistent use of tabs vs spaces and instruction suffixes, and the
    label 3 appearing twice.  Symbolic operands, local labels, and
    additional comments would provide this code with a fresh coat of paint.
    
    Finally, add a test that tickles the `rep movsl` implementation to test
    it for correctness, since it has implicit operands.
    Suggested-by: default avatarIngo Molnar <mingo@kernel.org>
    Suggested-by: default avatarDavid Laight <David.Laight@aculab.com>
    Signed-off-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Tested-by: default avatarKees Cook <keescook@chromium.org>
    Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
    Link: https://lore.kernel.org/all/20221018172155.287409-1-ndesaulniers%40google.com
    bce5a1e8
memcpy_kunit.c 10.8 KB