• Kan Liang's avatar
    perf regs x86: Add X86 specific arch__intr_reg_mask() · 6466ec14
    Kan Liang authored
    XMM registers can be collected on Icelake and later platforms.
    
    Add specific arch__intr_reg_mask(), which creating an event to check if
    the kernel and hardware can collect XMM registers.
    
    Test on Skylake which doesn't support XMM registers collection. There is
    nothing changed.
    
       #perf record -I?
       available registers: AX BX CX DX SI DI BP SP IP FLAGS CS SS R8 R9
       R10 R11 R12 R13 R14 R15
    
       Usage: perf record [<options>] [<command>]
        or: perf record [<options>] -- <command> [<options>]
    
        -I, --intr-regs[=<any register>]
                              sample selected machine registers on
       interrupt, use '-I?' to list register names
    
       #perf record -I
       [ perf record: Woken up 1 times to write data ]
       [ perf record: Captured and wrote 0.905 MB perf.data (2520 samples) ]
    
       #perf evlist -v
       cycles: size: 112, { sample_period, sample_freq }: 4000, sample_type:
       IP|TID|TIME|CPU|PERIOD|REGS_INTR, read_format: ID, disabled: 1,
       inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, precise_ip: 3,
       sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1, ksymbol:
       1, bpf_event: 1, sample_regs_intr: 0xff0fff
    
    Test on Icelake which support XMM registers collection.
    
       #perf record -I?
       available registers: AX BX CX DX SI DI BP SP IP FLAGS CS SS R8 R9 R10
       R11 R12 R13 R14 R15 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 XMM8 XMM9
       XMM10 XMM11 XMM12 XMM13 XMM14 XMM15
    
       Usage: perf record [<options>] [<command>]
        or: perf record [<options>] -- <command> [<options>]
    
        -I, --intr-regs[=<any register>]
                              sample selected machine registers on
       interrupt, use '-I?' to list register names
    
       #perf record -I
       [ perf record: Woken up 1 times to write data ]
       [ perf record: Captured and wrote 0.800 MB perf.data (318 samples) ]
    
       #perf evlist -v
       cycles: size: 112, { sample_period, sample_freq }: 4000, sample_type:
       IP|TID|TIME|CPU|PERIOD|REGS_INTR, read_format: ID, disabled: 1,
       inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, precise_ip: 3,
       sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1, ksymbol:
       1, bpf_event: 1, sample_regs_intr: 0xffffffff00ff0fff
    
    Committer notes:
    
    Don't set attr.sample_period as a named struct init, as it is part of an
    unnamed union in 'struct perf_event_attr', and doing so breaks the build
    on older gcc versions, such as:
    
      gcc version 4.1.2 20080704 (Red Hat 4.1.2-55)
      gcc version 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC)
    
      arch/x86/util/perf_regs.c: In function 'arch__intr_reg_mask':
      arch/x86/util/perf_regs.c:279: error: unknown field 'sample_period' specified in initializer
      cc1: warnings being treated as errors
      arch/x86/util/perf_regs.c:279: warning: missing braces around initializer
      arch/x86/util/perf_regs.c:279: warning: (near initialization for 'attr.<anonymous>')
    Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
    [ Only on a lenovo t480s, a skylake machine, where the XMM registers didn't show up in -I?/--user-regs=? as expected ]
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Link: http://lkml.kernel.org/r/1557865174-56264-3-git-send-email-kan.liang@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    6466ec14
perf_regs.c 7.61 KB