• Nick Desaulniers's avatar
    x86/purgatory: Do not use __builtin_memcpy and __builtin_memset · e0d262a5
    Nick Desaulniers authored
    commit 4ce97317 upstream.
    
    Implementing memcpy and memset in terms of __builtin_memcpy and
    __builtin_memset is problematic.
    
    GCC at -O2 will replace calls to the builtins with calls to memcpy and
    memset (but will generate an inline implementation at -Os).  Clang will
    replace the builtins with these calls regardless of optimization level.
    $ llvm-objdump -dr arch/x86/purgatory/string.o | tail
    
    0000000000000339 memcpy:
         339: 48 b8 00 00 00 00 00 00 00 00 movabsq $0, %rax
                    000000000000033b:  R_X86_64_64  memcpy
         343: ff e0                         jmpq    *%rax
    
    0000000000000345 memset:
         345: 48 b8 00 00 00 00 00 00 00 00 movabsq $0, %rax
                    0000000000000347:  R_X86_64_64  memset
         34f: ff e0
    
    Such code results in infinite recursion at runtime. This is observed
    when doing kexec.
    
    Instead, reuse an implementation from arch/x86/boot/compressed/string.c.
    This requires to imple...
    e0d262a5
purgatory.c 1.79 KB