• Steven Rostedt's avatar
    ftrace: use only 5 byte nops for x86 · 732f3ca7
    Steven Rostedt authored
    Mathieu Desnoyers revealed a bug in the original code. The nop that is
    used to relpace the mcount caller can be a two part nop. This runs the
    risk where a process can be preempted after executing the first nop, but
    before the second part of the nop.
    
    The ftrace code calls kstop_machine to keep multiple CPUs from executing
    code that is being modified, but it does not protect against a task preempting
    in the middle of a two part nop.
    
    If the above preemption happens and the tracer is enabled, after the
    kstop_machine runs, all those nops will be calls to the trace function.
    If the preempted process that was preempted between the two nops is executed
    again, it will execute half of the call to the trace function, and this
    might crash the system.
    
    This patch instead uses what both the latest Intel and AMD spec suggests.
    That is the P6_NOP5 sequence of "0x0f 0x1f 0x44 0x00 0x00".
    
    Note, some older CPUs and QEMU might fault on this nop, so this nop
    is executed with fault handling first. If it detects a fault, it will then
    use the code "0x66 0x66 0x66 0x66 0x90". If that faults, it will then
    default to a simple "jmp 1f; .byte 0x00 0x00 0x00; 1:". The jmp is
    not optimal but will do if the first two can not be executed.
    
    TODO: Examine the cpuid to determine the nop to use.
    Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    732f3ca7
ftrace.c 4.44 KB