• Adrian Hunter's avatar
    perf: Add perf text poke event · e17d43b9
    Adrian Hunter authored
    Record (single instruction) changes to the kernel text (i.e.
    self-modifying code) in order to support tracers like Intel PT and
    ARM CoreSight.
    
    A copy of the running kernel code is needed as a reference point (e.g.
    from /proc/kcore). The text poke event records the old bytes and the
    new bytes so that the event can be processed forwards or backwards.
    
    The basic problem is recording the modified instruction in an
    unambiguous manner given SMP instruction cache (in)coherence. That is,
    when modifying an instruction concurrently any solution with one or
    multiple timestamps is not sufficient:
    
    	CPU0				CPU1
     0
     1	write insn A
     2					execute insn A
     3	sync-I$
     4
    
    Due to I$, CPU1 might execute either the old or new A. No matter where
    we record tracepoints on CPU0, one simply cannot tell what CPU1 will
    have observed, except that at 0 it must be the old one and at 4 it
    must be the new one.
    
    To solve this, take inspiration from x86 text poking, which has to
    solve this exact problem due to variable length instruction encoding
    and I-fetch windows.
    
     1) overwrite the instruction with a breakpoint and sync I$
    
    This guarantees that that code flow will never hit the target
    instruction anymore, on any CPU (or rather, it will cause an
    exception).
    
     2) issue the TEXT_POKE event
    
     3) overwrite the breakpoint with the new instruction and sync I$
    
    Now we know that any execution after the TEXT_POKE event will either
    observe the breakpoint (and hit the exception) or the new instruction.
    
    So by guarding the TEXT_POKE event with an exception on either side;
    we can now tell, without doubt, which instruction another CPU will
    have observed.
    Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20200512121922.8997-2-adrian.hunter@intel.com
    e17d43b9
core.c 310 KB