Merge branch 'linus' into perf/core, to refresh the branch
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
69
tools/perf/arch/powerpc/include/perf_regs.h
Normal file
69
tools/perf/arch/powerpc/include/perf_regs.h
Normal file
@@ -0,0 +1,69 @@
|
||||
#ifndef ARCH_PERF_REGS_H
|
||||
#define ARCH_PERF_REGS_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/perf_regs.h>
|
||||
|
||||
#define PERF_REGS_MASK ((1ULL << PERF_REG_POWERPC_MAX) - 1)
|
||||
#define PERF_REGS_MAX PERF_REG_POWERPC_MAX
|
||||
#ifdef __powerpc64__
|
||||
#define PERF_SAMPLE_REGS_ABI PERF_SAMPLE_REGS_ABI_64
|
||||
#else
|
||||
#define PERF_SAMPLE_REGS_ABI PERF_SAMPLE_REGS_ABI_32
|
||||
#endif
|
||||
|
||||
#define PERF_REG_IP PERF_REG_POWERPC_NIP
|
||||
#define PERF_REG_SP PERF_REG_POWERPC_R1
|
||||
|
||||
static const char *reg_names[] = {
|
||||
[PERF_REG_POWERPC_R0] = "r0",
|
||||
[PERF_REG_POWERPC_R1] = "r1",
|
||||
[PERF_REG_POWERPC_R2] = "r2",
|
||||
[PERF_REG_POWERPC_R3] = "r3",
|
||||
[PERF_REG_POWERPC_R4] = "r4",
|
||||
[PERF_REG_POWERPC_R5] = "r5",
|
||||
[PERF_REG_POWERPC_R6] = "r6",
|
||||
[PERF_REG_POWERPC_R7] = "r7",
|
||||
[PERF_REG_POWERPC_R8] = "r8",
|
||||
[PERF_REG_POWERPC_R9] = "r9",
|
||||
[PERF_REG_POWERPC_R10] = "r10",
|
||||
[PERF_REG_POWERPC_R11] = "r11",
|
||||
[PERF_REG_POWERPC_R12] = "r12",
|
||||
[PERF_REG_POWERPC_R13] = "r13",
|
||||
[PERF_REG_POWERPC_R14] = "r14",
|
||||
[PERF_REG_POWERPC_R15] = "r15",
|
||||
[PERF_REG_POWERPC_R16] = "r16",
|
||||
[PERF_REG_POWERPC_R17] = "r17",
|
||||
[PERF_REG_POWERPC_R18] = "r18",
|
||||
[PERF_REG_POWERPC_R19] = "r19",
|
||||
[PERF_REG_POWERPC_R20] = "r20",
|
||||
[PERF_REG_POWERPC_R21] = "r21",
|
||||
[PERF_REG_POWERPC_R22] = "r22",
|
||||
[PERF_REG_POWERPC_R23] = "r23",
|
||||
[PERF_REG_POWERPC_R24] = "r24",
|
||||
[PERF_REG_POWERPC_R25] = "r25",
|
||||
[PERF_REG_POWERPC_R26] = "r26",
|
||||
[PERF_REG_POWERPC_R27] = "r27",
|
||||
[PERF_REG_POWERPC_R28] = "r28",
|
||||
[PERF_REG_POWERPC_R29] = "r29",
|
||||
[PERF_REG_POWERPC_R30] = "r30",
|
||||
[PERF_REG_POWERPC_R31] = "r31",
|
||||
[PERF_REG_POWERPC_NIP] = "nip",
|
||||
[PERF_REG_POWERPC_MSR] = "msr",
|
||||
[PERF_REG_POWERPC_ORIG_R3] = "orig_r3",
|
||||
[PERF_REG_POWERPC_CTR] = "ctr",
|
||||
[PERF_REG_POWERPC_LINK] = "link",
|
||||
[PERF_REG_POWERPC_XER] = "xer",
|
||||
[PERF_REG_POWERPC_CCR] = "ccr",
|
||||
[PERF_REG_POWERPC_SOFTE] = "softe",
|
||||
[PERF_REG_POWERPC_TRAP] = "trap",
|
||||
[PERF_REG_POWERPC_DAR] = "dar",
|
||||
[PERF_REG_POWERPC_DSISR] = "dsisr"
|
||||
};
|
||||
|
||||
static inline const char *perf_reg_name(int id)
|
||||
{
|
||||
return reg_names[id];
|
||||
}
|
||||
#endif /* ARCH_PERF_REGS_H */
|
@@ -1,6 +1,8 @@
|
||||
libperf-y += header.o
|
||||
libperf-y += sym-handling.o
|
||||
libperf-y += kvm-stat.o
|
||||
libperf-y += perf_regs.o
|
||||
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
libperf-$(CONFIG_DWARF) += skip-callchain-idx.o
|
||||
libperf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
|
||||
|
49
tools/perf/arch/powerpc/util/perf_regs.c
Normal file
49
tools/perf/arch/powerpc/util/perf_regs.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include "../../perf.h"
|
||||
#include "../../util/perf_regs.h"
|
||||
|
||||
const struct sample_reg sample_reg_masks[] = {
|
||||
SMPL_REG(r0, PERF_REG_POWERPC_R0),
|
||||
SMPL_REG(r1, PERF_REG_POWERPC_R1),
|
||||
SMPL_REG(r2, PERF_REG_POWERPC_R2),
|
||||
SMPL_REG(r3, PERF_REG_POWERPC_R3),
|
||||
SMPL_REG(r4, PERF_REG_POWERPC_R4),
|
||||
SMPL_REG(r5, PERF_REG_POWERPC_R5),
|
||||
SMPL_REG(r6, PERF_REG_POWERPC_R6),
|
||||
SMPL_REG(r7, PERF_REG_POWERPC_R7),
|
||||
SMPL_REG(r8, PERF_REG_POWERPC_R8),
|
||||
SMPL_REG(r9, PERF_REG_POWERPC_R9),
|
||||
SMPL_REG(r10, PERF_REG_POWERPC_R10),
|
||||
SMPL_REG(r11, PERF_REG_POWERPC_R11),
|
||||
SMPL_REG(r12, PERF_REG_POWERPC_R12),
|
||||
SMPL_REG(r13, PERF_REG_POWERPC_R13),
|
||||
SMPL_REG(r14, PERF_REG_POWERPC_R14),
|
||||
SMPL_REG(r15, PERF_REG_POWERPC_R15),
|
||||
SMPL_REG(r16, PERF_REG_POWERPC_R16),
|
||||
SMPL_REG(r17, PERF_REG_POWERPC_R17),
|
||||
SMPL_REG(r18, PERF_REG_POWERPC_R18),
|
||||
SMPL_REG(r19, PERF_REG_POWERPC_R19),
|
||||
SMPL_REG(r20, PERF_REG_POWERPC_R20),
|
||||
SMPL_REG(r21, PERF_REG_POWERPC_R21),
|
||||
SMPL_REG(r22, PERF_REG_POWERPC_R22),
|
||||
SMPL_REG(r23, PERF_REG_POWERPC_R23),
|
||||
SMPL_REG(r24, PERF_REG_POWERPC_R24),
|
||||
SMPL_REG(r25, PERF_REG_POWERPC_R25),
|
||||
SMPL_REG(r26, PERF_REG_POWERPC_R26),
|
||||
SMPL_REG(r27, PERF_REG_POWERPC_R27),
|
||||
SMPL_REG(r28, PERF_REG_POWERPC_R28),
|
||||
SMPL_REG(r29, PERF_REG_POWERPC_R29),
|
||||
SMPL_REG(r30, PERF_REG_POWERPC_R30),
|
||||
SMPL_REG(r31, PERF_REG_POWERPC_R31),
|
||||
SMPL_REG(nip, PERF_REG_POWERPC_NIP),
|
||||
SMPL_REG(msr, PERF_REG_POWERPC_MSR),
|
||||
SMPL_REG(orig_r3, PERF_REG_POWERPC_ORIG_R3),
|
||||
SMPL_REG(ctr, PERF_REG_POWERPC_CTR),
|
||||
SMPL_REG(link, PERF_REG_POWERPC_LINK),
|
||||
SMPL_REG(xer, PERF_REG_POWERPC_XER),
|
||||
SMPL_REG(ccr, PERF_REG_POWERPC_CCR),
|
||||
SMPL_REG(softe, PERF_REG_POWERPC_SOFTE),
|
||||
SMPL_REG(trap, PERF_REG_POWERPC_TRAP),
|
||||
SMPL_REG(dar, PERF_REG_POWERPC_DAR),
|
||||
SMPL_REG(dsisr, PERF_REG_POWERPC_DSISR),
|
||||
SMPL_REG_END
|
||||
};
|
96
tools/perf/arch/powerpc/util/unwind-libunwind.c
Normal file
96
tools/perf/arch/powerpc/util/unwind-libunwind.c
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright 2016 Chandan Kumar, IBM Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <libunwind.h>
|
||||
#include <asm/perf_regs.h>
|
||||
#include "../../util/unwind.h"
|
||||
#include "../../util/debug.h"
|
||||
|
||||
int libunwind__arch_reg_id(int regnum)
|
||||
{
|
||||
switch (regnum) {
|
||||
case UNW_PPC64_R0:
|
||||
return PERF_REG_POWERPC_R0;
|
||||
case UNW_PPC64_R1:
|
||||
return PERF_REG_POWERPC_R1;
|
||||
case UNW_PPC64_R2:
|
||||
return PERF_REG_POWERPC_R2;
|
||||
case UNW_PPC64_R3:
|
||||
return PERF_REG_POWERPC_R3;
|
||||
case UNW_PPC64_R4:
|
||||
return PERF_REG_POWERPC_R4;
|
||||
case UNW_PPC64_R5:
|
||||
return PERF_REG_POWERPC_R5;
|
||||
case UNW_PPC64_R6:
|
||||
return PERF_REG_POWERPC_R6;
|
||||
case UNW_PPC64_R7:
|
||||
return PERF_REG_POWERPC_R7;
|
||||
case UNW_PPC64_R8:
|
||||
return PERF_REG_POWERPC_R8;
|
||||
case UNW_PPC64_R9:
|
||||
return PERF_REG_POWERPC_R9;
|
||||
case UNW_PPC64_R10:
|
||||
return PERF_REG_POWERPC_R10;
|
||||
case UNW_PPC64_R11:
|
||||
return PERF_REG_POWERPC_R11;
|
||||
case UNW_PPC64_R12:
|
||||
return PERF_REG_POWERPC_R12;
|
||||
case UNW_PPC64_R13:
|
||||
return PERF_REG_POWERPC_R13;
|
||||
case UNW_PPC64_R14:
|
||||
return PERF_REG_POWERPC_R14;
|
||||
case UNW_PPC64_R15:
|
||||
return PERF_REG_POWERPC_R15;
|
||||
case UNW_PPC64_R16:
|
||||
return PERF_REG_POWERPC_R16;
|
||||
case UNW_PPC64_R17:
|
||||
return PERF_REG_POWERPC_R17;
|
||||
case UNW_PPC64_R18:
|
||||
return PERF_REG_POWERPC_R18;
|
||||
case UNW_PPC64_R19:
|
||||
return PERF_REG_POWERPC_R19;
|
||||
case UNW_PPC64_R20:
|
||||
return PERF_REG_POWERPC_R20;
|
||||
case UNW_PPC64_R21:
|
||||
return PERF_REG_POWERPC_R21;
|
||||
case UNW_PPC64_R22:
|
||||
return PERF_REG_POWERPC_R22;
|
||||
case UNW_PPC64_R23:
|
||||
return PERF_REG_POWERPC_R23;
|
||||
case UNW_PPC64_R24:
|
||||
return PERF_REG_POWERPC_R24;
|
||||
case UNW_PPC64_R25:
|
||||
return PERF_REG_POWERPC_R25;
|
||||
case UNW_PPC64_R26:
|
||||
return PERF_REG_POWERPC_R26;
|
||||
case UNW_PPC64_R27:
|
||||
return PERF_REG_POWERPC_R27;
|
||||
case UNW_PPC64_R28:
|
||||
return PERF_REG_POWERPC_R28;
|
||||
case UNW_PPC64_R29:
|
||||
return PERF_REG_POWERPC_R29;
|
||||
case UNW_PPC64_R30:
|
||||
return PERF_REG_POWERPC_R30;
|
||||
case UNW_PPC64_R31:
|
||||
return PERF_REG_POWERPC_R31;
|
||||
case UNW_PPC64_LR:
|
||||
return PERF_REG_POWERPC_LINK;
|
||||
case UNW_PPC64_CTR:
|
||||
return PERF_REG_POWERPC_CTR;
|
||||
case UNW_PPC64_XER:
|
||||
return PERF_REG_POWERPC_XER;
|
||||
case UNW_PPC64_NIP:
|
||||
return PERF_REG_POWERPC_NIP;
|
||||
default:
|
||||
pr_err("unwind: invalid reg id %d\n", regnum);
|
||||
return -EINVAL;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
@@ -23,6 +23,12 @@ $(call detected_var,ARCH)
|
||||
|
||||
NO_PERF_REGS := 1
|
||||
|
||||
# Additional ARCH settings for ppc
|
||||
ifeq ($(ARCH),powerpc)
|
||||
NO_PERF_REGS := 0
|
||||
LIBUNWIND_LIBS := -lunwind -lunwind-ppc64
|
||||
endif
|
||||
|
||||
# Additional ARCH settings for x86
|
||||
ifeq ($(ARCH),x86)
|
||||
$(call detected,CONFIG_X86)
|
||||
|
@@ -73,7 +73,7 @@ int test__openat_syscall_event_on_all_cpus(int subtest __maybe_unused)
|
||||
}
|
||||
|
||||
/*
|
||||
* Here we need to explicitely preallocate the counts, as if
|
||||
* Here we need to explicitly preallocate the counts, as if
|
||||
* we use the auto allocation it will allocate just for 1 cpu,
|
||||
* as we start by cpu 0.
|
||||
*/
|
||||
|
@@ -839,7 +839,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
|
||||
perf_evsel__set_sample_bit(evsel, PERIOD);
|
||||
|
||||
/*
|
||||
* When the user explicitely disabled time don't force it here.
|
||||
* When the user explicitly disabled time don't force it here.
|
||||
*/
|
||||
if (opts->sample_time &&
|
||||
(!perf_missing_features.sample_id_all &&
|
||||
|
@@ -363,7 +363,7 @@ out_err:
|
||||
}
|
||||
|
||||
/*
|
||||
* Caller must eventually drop thread->refcnt returned with a successfull
|
||||
* Caller must eventually drop thread->refcnt returned with a successful
|
||||
* lookup/new thread inserted.
|
||||
*/
|
||||
static struct thread *____machine__findnew_thread(struct machine *machine,
|
||||
|
@@ -1657,7 +1657,7 @@ static void parse_events_print_error(struct parse_events_error *err,
|
||||
|
||||
buf = _buf;
|
||||
|
||||
/* We're cutting from the beggining. */
|
||||
/* We're cutting from the beginning. */
|
||||
if (err->idx > max_err_idx)
|
||||
cut = err->idx - max_err_idx;
|
||||
|
||||
|
@@ -12,18 +12,18 @@ int perf_reg_value(u64 *valp, struct regs_dump *regs, int id)
|
||||
int i, idx = 0;
|
||||
u64 mask = regs->mask;
|
||||
|
||||
if (regs->cache_mask & (1 << id))
|
||||
if (regs->cache_mask & (1ULL << id))
|
||||
goto out;
|
||||
|
||||
if (!(mask & (1 << id)))
|
||||
if (!(mask & (1ULL << id)))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < id; i++) {
|
||||
if (mask & (1 << i))
|
||||
if (mask & (1ULL << i))
|
||||
idx++;
|
||||
}
|
||||
|
||||
regs->cache_mask |= (1 << id);
|
||||
regs->cache_mask |= (1ULL << id);
|
||||
regs->cache_regs[id] = regs->regs[idx];
|
||||
|
||||
out:
|
||||
|
@@ -557,7 +557,7 @@ static u8 revbyte(u8 b)
|
||||
|
||||
/*
|
||||
* XXX this is hack in attempt to carry flags bitfield
|
||||
* throught endian village. ABI says:
|
||||
* through endian village. ABI says:
|
||||
*
|
||||
* Bit-fields are allocated from right to left (least to most significant)
|
||||
* on little-endian implementations and from left to right (most to least
|
||||
|
Reference in New Issue
Block a user