• Julian Pidancet's avatar
    x86/alternative: Consistently patch SMP locks in vmlinux and modules · be84d8ed
    Julian Pidancet authored
    alternatives_smp_module_add() restricts patching of SMP lock prefixes to
    the text address range passed as an argument.
    
    For vmlinux, patching all the instructions located between the _text and
    _etext symbols is allowed. That includes the .text section but also
    other sections such as .text.hot and .text.unlikely.
    
    As per the comment inside the 'struct smp_alt_module' definition, the
    original purpose of this restriction is to avoid patching the init code
    because in the case when one boots with a single CPU, the LOCK prefixes
    to the locking primitives are removed.
    
    Later on, when other CPUs are onlined, those LOCK prefixes get added
    back in but by that time the .init code is very likely removed so
    patching that would be a bad idea.
    
    For modules, the current code only allows patching instructions located
    inside the .text segment, excluding other sections such as .text.hot or
    .text.unlikely, which may need patching.
    
    Make patching of the kernel core and modules more consistent by
    allowing all text sections of modules except .init.text to be patched in
    module_finalize().
    
    For that, use mod->core_layout.base/mod->core_layout.text_size as the
    address range allowed to be patched, which include all the code sections
    except the init code.
    
      [ bp: Massage and expand commit message. ]
    Signed-off-by: default avatarJulian Pidancet <julian.pidancet@oracle.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20221027204906.511277-1-julian.pidancet@oracle.com
    be84d8ed
module.c 7.97 KB