• Namhyung Kim's avatar
    perf annotate-data: Handle ADD instructions · eb9190af
    Namhyung Kim authored
    There are different patterns for percpu variable access using a constant
    value added to the base.
    
      2aeb:  mov    -0x7da0f7e0(,%rax,8),%r14  # r14 = __per_cpu_offset[cpu]
      2af3:  mov    $0x34740,%rax              # rax = address of runqueues
    * 2afa:  add    %rax,%r14                  # r14 = &per_cpu(runqueues, cpu)
      2bfd:  cmpl   $0x0,0x10(%r14)            # cpu_rq(cpu)->has_blocked_load
      2b03:  je     0x2b36
    
    At the first instruction, r14 has the __per_cpu_offset.  And then rax
    has an immediate value and then added to r14 to calculate the address of
    a per-cpu variable.  So it needs to track the immediate values and ADD
    instructions.
    
    Similar but a little different case is to use "this_cpu_off" instead of
    "__per_cpu_offset" for the current CPU.  This time the variable address
    comes with PC-rel addressing.
    
      89:  mov     $0x34740,%rax                # rax = address of runqueues
    * 90:  add     %gs:0x7f015f60(%rip),%rax    # 19a78  <this_cpu_off>
      98:  incl    0xd8c(%rax)                  # cpu_rq(cpu)->sched_count
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Link: https://lore.kernel.org/r/20240319055115.4063940-21-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    eb9190af
annotate-data.c 39.8 KB