forked from Minki/linux
Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf updates from Ingo Molnar: "Kernel side changes: - Clean up the x86 instruction decoder (Masami Hiramatsu) - Add new uprobes optimization for PUSH instructions on x86 (Yonghong Song) - Add MSR_IA32_THERM_STATUS to the MSR events (Stephane Eranian) - Fix misc bugs, update documentation, plus various cleanups (Jiri Olsa) There's a large number of tooling side improvements: - Intel-PT/BTS improvements (Adrian Hunter) - Numerous 'perf trace' improvements (Arnaldo Carvalho de Melo) - Introduce an errno code to string facility (Hendrik Brueckner) - Various build system improvements (Jiri Olsa) - Add support for CoreSight trace decoding by making the perf tools use the external openCSD (Mathieu Poirier, Tor Jeremiassen) - Add ARM Statistical Profiling Extensions (SPE) support (Kim Phillips) - libtraceevent updates (Steven Rostedt) - Intel vendor event JSON updates (Andi Kleen) - Introduce 'perf report --mmaps' and 'perf report --tasks' to show info present in 'perf.data' (Jiri Olsa, Arnaldo Carvalho de Melo) - Add infrastructure to record first and last sample time to the perf.data file header, so that when processing all samples in a 'perf record' session, such as when doing build-id processing, or when specifically requesting that that info be recorded, use that in 'perf report --time', that also got support for percent slices in addition to absolute ones. I.e. now it is possible to ask for the samples in the 10%-20% time slice of a perf.data file (Jin Yao) - Allow system wide 'perf stat --per-thread', sorting the result (Jin Yao) E.g.: [root@jouet ~]# perf stat --per-thread --metrics IPC ^C Performance counter stats for 'system wide': make-22229 23,012,094,032 inst_retired.any # 0.8 IPC cc1-22419 692,027,497 inst_retired.any # 0.8 IPC gcc-22418 328,231,855 inst_retired.any # 0.9 IPC cc1-22509 220,853,647 inst_retired.any # 0.8 IPC gcc-22486 199,874,810 inst_retired.any # 1.0 IPC as-22466 177,896,365 inst_retired.any # 0.9 IPC cc1-22465 150,732,374 inst_retired.any # 0.8 IPC gcc-22508 112,555,593 inst_retired.any # 0.9 IPC cc1-22487 108,964,079 inst_retired.any # 0.7 IPC qemu-system-x86-2697 21,330,550 inst_retired.any # 0.3 IPC systemd-journal-551 20,642,951 inst_retired.any # 0.4 IPC docker-containe-17651 9,552,892 inst_retired.any # 0.5 IPC dockerd-current-9809 7,528,586 inst_retired.any # 0.5 IPC make-22153 12,504,194,380 inst_retired.any # 0.8 IPC python2-22429 12,081,290,954 inst_retired.any # 0.8 IPC <SNIP> python2-22429 15,026,328,103 cpu_clk_unhalted.thread cc1-22419 826,660,193 cpu_clk_unhalted.thread gcc-22418 365,321,295 cpu_clk_unhalted.thread cc1-22509 279,169,362 cpu_clk_unhalted.thread gcc-22486 210,156,950 cpu_clk_unhalted.thread <SNIP> 5.638075538 seconds time elapsed [root@jouet ~]# - Improve shell auto-completion of perf events (Jin Yao) - 'perf probe' improvements (Masami Hiramatsu) - Improve PMU infrastructure to support amp64's ThunderX2 implementation defined core events (Ganapatrao Kulkarni) - Various annotation related improvements and fixes (Thomas Richter) - Clarify usage of 'overwrite' and 'backward' in the evlist/mmap code, removing the 'overwrite' parameter from several functions as it was always used it as 'false' (Wang Nan) - Fix/improve 'perf record' reverse recording support (Wang Nan) - Improve command line options documentation (Sihyeon Jang) - Optimize sample parsing for ordering events, where we don't need to parse all the PERF_SAMPLE_ bits, just the ones leading to the timestamp needed to reorder events (Jiri Olsa) - Generalize the annotation code to support other source information besides objdump/DWARF obtained ones, starting with python scripts, that will is slated to be merged soon (Jiri Olsa) - ... and a lot more that I failed to list, see the shortlog and changelog for details" * 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (262 commits) perf trace beauty flock: Move to separate object file perf evlist: Remove fcntl.h from evlist.h perf trace beauty futex: Beautify FUTEX_BITSET_MATCH_ANY perf trace: Do not print from time delta for interrupted syscall lines perf trace: Add --print-sample perf bpf: Remove misplaced __maybe_unused attribute MAINTAINERS: Adding entry for CoreSight trace decoding perf tools: Add mechanic to synthesise CoreSight trace packets perf tools: Add full support for CoreSight trace decoding pert tools: Add queue management functionality perf tools: Add functionality to communicate with the openCSD decoder perf tools: Add support for decoding CoreSight trace data perf tools: Add decoder mechanic to support dumping trace data perf tools: Add processing of coresight metadata perf tools: Add initial entry point for decoder CoreSight traces perf tools: Integrating the CoreSight decoding library perf vendor events intel: Update IvyTown files to V20 perf vendor events intel: Update IvyBridge files to V20 perf vendor events intel: Update BroadwellDE events to V7 perf vendor events intel: Update SkylakeX events to V1.06 ...
This commit is contained in:
commit
d8b91dde38
@ -118,6 +118,7 @@ we might work for today, have in the past, or will in the future.
|
||||
- Mike Marshall
|
||||
- Chris Mason
|
||||
- Paul E. McKenney
|
||||
- Arnaldo Carvalho de Melo
|
||||
- David S. Miller
|
||||
- Ingo Molnar
|
||||
- Kuninori Morimoto
|
||||
|
@ -1327,7 +1327,8 @@ F: tools/perf/arch/arm/util/pmu.c
|
||||
F: tools/perf/arch/arm/util/auxtrace.c
|
||||
F: tools/perf/arch/arm/util/cs-etm.c
|
||||
F: tools/perf/arch/arm/util/cs-etm.h
|
||||
F: tools/perf/util/cs-etm.h
|
||||
F: tools/perf/util/cs-etm.*
|
||||
F: tools/perf/util/cs-etm-decoder/*
|
||||
|
||||
ARM/CORGI MACHINE SUPPORT
|
||||
M: Richard Purdie <rpurdie@rpsys.net>
|
||||
|
@ -10,7 +10,9 @@ enum perf_msr_id {
|
||||
PERF_MSR_SMI = 4,
|
||||
PERF_MSR_PTSC = 5,
|
||||
PERF_MSR_IRPERF = 6,
|
||||
|
||||
PERF_MSR_THERM = 7,
|
||||
PERF_MSR_THERM_SNAP = 8,
|
||||
PERF_MSR_THERM_UNIT = 9,
|
||||
PERF_MSR_EVENT_MAX,
|
||||
};
|
||||
|
||||
@ -29,6 +31,11 @@ static bool test_irperf(int idx)
|
||||
return boot_cpu_has(X86_FEATURE_IRPERF);
|
||||
}
|
||||
|
||||
static bool test_therm_status(int idx)
|
||||
{
|
||||
return boot_cpu_has(X86_FEATURE_DTHERM);
|
||||
}
|
||||
|
||||
static bool test_intel(int idx)
|
||||
{
|
||||
if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ||
|
||||
@ -95,22 +102,28 @@ struct perf_msr {
|
||||
bool (*test)(int idx);
|
||||
};
|
||||
|
||||
PMU_EVENT_ATTR_STRING(tsc, evattr_tsc, "event=0x00");
|
||||
PMU_EVENT_ATTR_STRING(aperf, evattr_aperf, "event=0x01");
|
||||
PMU_EVENT_ATTR_STRING(mperf, evattr_mperf, "event=0x02");
|
||||
PMU_EVENT_ATTR_STRING(pperf, evattr_pperf, "event=0x03");
|
||||
PMU_EVENT_ATTR_STRING(smi, evattr_smi, "event=0x04");
|
||||
PMU_EVENT_ATTR_STRING(ptsc, evattr_ptsc, "event=0x05");
|
||||
PMU_EVENT_ATTR_STRING(irperf, evattr_irperf, "event=0x06");
|
||||
PMU_EVENT_ATTR_STRING(tsc, evattr_tsc, "event=0x00" );
|
||||
PMU_EVENT_ATTR_STRING(aperf, evattr_aperf, "event=0x01" );
|
||||
PMU_EVENT_ATTR_STRING(mperf, evattr_mperf, "event=0x02" );
|
||||
PMU_EVENT_ATTR_STRING(pperf, evattr_pperf, "event=0x03" );
|
||||
PMU_EVENT_ATTR_STRING(smi, evattr_smi, "event=0x04" );
|
||||
PMU_EVENT_ATTR_STRING(ptsc, evattr_ptsc, "event=0x05" );
|
||||
PMU_EVENT_ATTR_STRING(irperf, evattr_irperf, "event=0x06" );
|
||||
PMU_EVENT_ATTR_STRING(cpu_thermal_margin, evattr_therm, "event=0x07" );
|
||||
PMU_EVENT_ATTR_STRING(cpu_thermal_margin.snapshot, evattr_therm_snap, "1" );
|
||||
PMU_EVENT_ATTR_STRING(cpu_thermal_margin.unit, evattr_therm_unit, "C" );
|
||||
|
||||
static struct perf_msr msr[] = {
|
||||
[PERF_MSR_TSC] = { 0, &evattr_tsc, NULL, },
|
||||
[PERF_MSR_APERF] = { MSR_IA32_APERF, &evattr_aperf, test_aperfmperf, },
|
||||
[PERF_MSR_MPERF] = { MSR_IA32_MPERF, &evattr_mperf, test_aperfmperf, },
|
||||
[PERF_MSR_PPERF] = { MSR_PPERF, &evattr_pperf, test_intel, },
|
||||
[PERF_MSR_SMI] = { MSR_SMI_COUNT, &evattr_smi, test_intel, },
|
||||
[PERF_MSR_PTSC] = { MSR_F15H_PTSC, &evattr_ptsc, test_ptsc, },
|
||||
[PERF_MSR_IRPERF] = { MSR_F17H_IRPERF, &evattr_irperf, test_irperf, },
|
||||
[PERF_MSR_TSC] = { 0, &evattr_tsc, NULL, },
|
||||
[PERF_MSR_APERF] = { MSR_IA32_APERF, &evattr_aperf, test_aperfmperf, },
|
||||
[PERF_MSR_MPERF] = { MSR_IA32_MPERF, &evattr_mperf, test_aperfmperf, },
|
||||
[PERF_MSR_PPERF] = { MSR_PPERF, &evattr_pperf, test_intel, },
|
||||
[PERF_MSR_SMI] = { MSR_SMI_COUNT, &evattr_smi, test_intel, },
|
||||
[PERF_MSR_PTSC] = { MSR_F15H_PTSC, &evattr_ptsc, test_ptsc, },
|
||||
[PERF_MSR_IRPERF] = { MSR_F17H_IRPERF, &evattr_irperf, test_irperf, },
|
||||
[PERF_MSR_THERM] = { MSR_IA32_THERM_STATUS, &evattr_therm, test_therm_status, },
|
||||
[PERF_MSR_THERM_SNAP] = { MSR_IA32_THERM_STATUS, &evattr_therm_snap, test_therm_status, },
|
||||
[PERF_MSR_THERM_UNIT] = { MSR_IA32_THERM_STATUS, &evattr_therm_unit, test_therm_status, },
|
||||
};
|
||||
|
||||
static struct attribute *events_attrs[PERF_MSR_EVENT_MAX + 1] = {
|
||||
@ -161,9 +174,9 @@ static int msr_event_init(struct perf_event *event)
|
||||
if (!msr[cfg].attr)
|
||||
return -EINVAL;
|
||||
|
||||
event->hw.idx = -1;
|
||||
event->hw.event_base = msr[cfg].msr;
|
||||
event->hw.config = cfg;
|
||||
event->hw.idx = -1;
|
||||
event->hw.event_base = msr[cfg].msr;
|
||||
event->hw.config = cfg;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -184,7 +197,7 @@ static void msr_event_update(struct perf_event *event)
|
||||
u64 prev, now;
|
||||
s64 delta;
|
||||
|
||||
/* Careful, an NMI might modify the previous event value. */
|
||||
/* Careful, an NMI might modify the previous event value: */
|
||||
again:
|
||||
prev = local64_read(&event->hw.prev_count);
|
||||
now = msr_read_counter(event);
|
||||
@ -193,17 +206,22 @@ again:
|
||||
goto again;
|
||||
|
||||
delta = now - prev;
|
||||
if (unlikely(event->hw.event_base == MSR_SMI_COUNT))
|
||||
if (unlikely(event->hw.event_base == MSR_SMI_COUNT)) {
|
||||
delta = sign_extend64(delta, 31);
|
||||
|
||||
local64_add(delta, &event->count);
|
||||
local64_add(delta, &event->count);
|
||||
} else if (unlikely(event->hw.event_base == MSR_IA32_THERM_STATUS)) {
|
||||
/* If valid, extract digital readout, otherwise set to -1: */
|
||||
now = now & (1ULL << 31) ? (now >> 16) & 0x3f : -1;
|
||||
local64_set(&event->count, now);
|
||||
} else {
|
||||
local64_add(delta, &event->count);
|
||||
}
|
||||
}
|
||||
|
||||
static void msr_event_start(struct perf_event *event, int flags)
|
||||
{
|
||||
u64 now;
|
||||
u64 now = msr_read_counter(event);
|
||||
|
||||
now = msr_read_counter(event);
|
||||
local64_set(&event->hw.prev_count, now);
|
||||
}
|
||||
|
||||
@ -250,9 +268,7 @@ static int __init msr_init(void)
|
||||
for (i = PERF_MSR_TSC + 1; i < PERF_MSR_EVENT_MAX; i++) {
|
||||
u64 val;
|
||||
|
||||
/*
|
||||
* Virt sucks arse; you cannot tell if a R/O MSR is present :/
|
||||
*/
|
||||
/* Virt sucks; you cannot tell if a R/O MSR is present :/ */
|
||||
if (!msr[i].test(i) || rdmsrl_safe(msr[i].msr, &val))
|
||||
msr[i].attr = NULL;
|
||||
}
|
||||
|
@ -53,6 +53,10 @@ struct arch_uprobe {
|
||||
u8 fixups;
|
||||
u8 ilen;
|
||||
} defparam;
|
||||
struct {
|
||||
u8 reg_offset; /* to the start of pt_regs */
|
||||
u8 ilen;
|
||||
} push;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -528,11 +528,11 @@ static int default_pre_xol_op(struct arch_uprobe *auprobe, struct pt_regs *regs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int push_ret_address(struct pt_regs *regs, unsigned long ip)
|
||||
static int emulate_push_stack(struct pt_regs *regs, unsigned long val)
|
||||
{
|
||||
unsigned long new_sp = regs->sp - sizeof_long();
|
||||
|
||||
if (copy_to_user((void __user *)new_sp, &ip, sizeof_long()))
|
||||
if (copy_to_user((void __user *)new_sp, &val, sizeof_long()))
|
||||
return -EFAULT;
|
||||
|
||||
regs->sp = new_sp;
|
||||
@ -566,7 +566,7 @@ static int default_post_xol_op(struct arch_uprobe *auprobe, struct pt_regs *regs
|
||||
regs->ip += correction;
|
||||
} else if (auprobe->defparam.fixups & UPROBE_FIX_CALL) {
|
||||
regs->sp += sizeof_long(); /* Pop incorrect return address */
|
||||
if (push_ret_address(regs, utask->vaddr + auprobe->defparam.ilen))
|
||||
if (emulate_push_stack(regs, utask->vaddr + auprobe->defparam.ilen))
|
||||
return -ERESTART;
|
||||
}
|
||||
/* popf; tell the caller to not touch TF */
|
||||
@ -655,7 +655,7 @@ static bool branch_emulate_op(struct arch_uprobe *auprobe, struct pt_regs *regs)
|
||||
*
|
||||
* But there is corner case, see the comment in ->post_xol().
|
||||
*/
|
||||
if (push_ret_address(regs, new_ip))
|
||||
if (emulate_push_stack(regs, new_ip))
|
||||
return false;
|
||||
} else if (!check_jmp_cond(auprobe, regs)) {
|
||||
offs = 0;
|
||||
@ -665,6 +665,16 @@ static bool branch_emulate_op(struct arch_uprobe *auprobe, struct pt_regs *regs)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool push_emulate_op(struct arch_uprobe *auprobe, struct pt_regs *regs)
|
||||
{
|
||||
unsigned long *src_ptr = (void *)regs + auprobe->push.reg_offset;
|
||||
|
||||
if (emulate_push_stack(regs, *src_ptr))
|
||||
return false;
|
||||
regs->ip += auprobe->push.ilen;
|
||||
return true;
|
||||
}
|
||||
|
||||
static int branch_post_xol_op(struct arch_uprobe *auprobe, struct pt_regs *regs)
|
||||
{
|
||||
BUG_ON(!branch_is_call(auprobe));
|
||||
@ -703,6 +713,10 @@ static const struct uprobe_xol_ops branch_xol_ops = {
|
||||
.post_xol = branch_post_xol_op,
|
||||
};
|
||||
|
||||
static const struct uprobe_xol_ops push_xol_ops = {
|
||||
.emulate = push_emulate_op,
|
||||
};
|
||||
|
||||
/* Returns -ENOSYS if branch_xol_ops doesn't handle this insn */
|
||||
static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
{
|
||||
@ -750,6 +764,87 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Returns -ENOSYS if push_xol_ops doesn't handle this insn */
|
||||
static int push_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
{
|
||||
u8 opc1 = OPCODE1(insn), reg_offset = 0;
|
||||
|
||||
if (opc1 < 0x50 || opc1 > 0x57)
|
||||
return -ENOSYS;
|
||||
|
||||
if (insn->length > 2)
|
||||
return -ENOSYS;
|
||||
if (insn->length == 2) {
|
||||
/* only support rex_prefix 0x41 (x64 only) */
|
||||
#ifdef CONFIG_X86_64
|
||||
if (insn->rex_prefix.nbytes != 1 ||
|
||||
insn->rex_prefix.bytes[0] != 0x41)
|
||||
return -ENOSYS;
|
||||
|
||||
switch (opc1) {
|
||||
case 0x50:
|
||||
reg_offset = offsetof(struct pt_regs, r8);
|
||||
break;
|
||||
case 0x51:
|
||||
reg_offset = offsetof(struct pt_regs, r9);
|
||||
break;
|
||||
case 0x52:
|
||||
reg_offset = offsetof(struct pt_regs, r10);
|
||||
break;
|
||||
case 0x53:
|
||||
reg_offset = offsetof(struct pt_regs, r11);
|
||||
break;
|
||||
case 0x54:
|
||||
reg_offset = offsetof(struct pt_regs, r12);
|
||||
break;
|
||||
case 0x55:
|
||||
reg_offset = offsetof(struct pt_regs, r13);
|
||||
break;
|
||||
case 0x56:
|
||||
reg_offset = offsetof(struct pt_regs, r14);
|
||||
break;
|
||||
case 0x57:
|
||||
reg_offset = offsetof(struct pt_regs, r15);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
return -ENOSYS;
|
||||
#endif
|
||||
} else {
|
||||
switch (opc1) {
|
||||
case 0x50:
|
||||
reg_offset = offsetof(struct pt_regs, ax);
|
||||
break;
|
||||
case 0x51:
|
||||
reg_offset = offsetof(struct pt_regs, cx);
|
||||
break;
|
||||
case 0x52:
|
||||
reg_offset = offsetof(struct pt_regs, dx);
|
||||
break;
|
||||
case 0x53:
|
||||
reg_offset = offsetof(struct pt_regs, bx);
|
||||
break;
|
||||
case 0x54:
|
||||
reg_offset = offsetof(struct pt_regs, sp);
|
||||
break;
|
||||
case 0x55:
|
||||
reg_offset = offsetof(struct pt_regs, bp);
|
||||
break;
|
||||
case 0x56:
|
||||
reg_offset = offsetof(struct pt_regs, si);
|
||||
break;
|
||||
case 0x57:
|
||||
reg_offset = offsetof(struct pt_regs, di);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
auprobe->push.reg_offset = reg_offset;
|
||||
auprobe->push.ilen = insn->length;
|
||||
auprobe->ops = &push_xol_ops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_uprobe_analyze_insn - instruction analysis including validity and fixups.
|
||||
* @mm: the probed address space.
|
||||
@ -771,6 +866,10 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
|
||||
if (ret != -ENOSYS)
|
||||
return ret;
|
||||
|
||||
ret = push_setup_xol_ops(auprobe, &insn);
|
||||
if (ret != -ENOSYS)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Figure out which fixups default_post_xol_op() will need to perform,
|
||||
* and annotate defparam->fixups accordingly.
|
||||
|
@ -13,28 +13,28 @@ else
|
||||
posttest_64bit = -n
|
||||
endif
|
||||
|
||||
distill_awk = $(srctree)/arch/x86/tools/distill.awk
|
||||
reformatter = $(srctree)/arch/x86/tools/objdump_reformat.awk
|
||||
chkobjdump = $(srctree)/arch/x86/tools/chkobjdump.awk
|
||||
|
||||
quiet_cmd_posttest = TEST $@
|
||||
cmd_posttest = ($(OBJDUMP) -v | $(AWK) -f $(chkobjdump)) || $(OBJDUMP) -d -j .text $(objtree)/vmlinux | $(AWK) -f $(distill_awk) | $(obj)/test_get_len $(posttest_64bit) $(posttest_verbose)
|
||||
cmd_posttest = ($(OBJDUMP) -v | $(AWK) -f $(chkobjdump)) || $(OBJDUMP) -d -j .text $(objtree)/vmlinux | $(AWK) -f $(reformatter) | $(obj)/insn_decoder_test $(posttest_64bit) $(posttest_verbose)
|
||||
|
||||
quiet_cmd_sanitytest = TEST $@
|
||||
cmd_sanitytest = $(obj)/insn_sanity $(posttest_64bit) -m 1000000
|
||||
|
||||
posttest: $(obj)/test_get_len vmlinux $(obj)/insn_sanity
|
||||
posttest: $(obj)/insn_decoder_test vmlinux $(obj)/insn_sanity
|
||||
$(call cmd,posttest)
|
||||
$(call cmd,sanitytest)
|
||||
|
||||
hostprogs-y += test_get_len insn_sanity
|
||||
hostprogs-y += insn_decoder_test insn_sanity
|
||||
|
||||
# -I needed for generated C source and C source which in the kernel tree.
|
||||
HOSTCFLAGS_test_get_len.o := -Wall -I$(objtree)/arch/x86/lib/ -I$(srctree)/arch/x86/include/uapi/ -I$(srctree)/arch/x86/include/ -I$(srctree)/arch/x86/lib/ -I$(srctree)/include/uapi/
|
||||
HOSTCFLAGS_insn_decoder_test.o := -Wall -I$(objtree)/arch/x86/lib/ -I$(srctree)/arch/x86/include/uapi/ -I$(srctree)/arch/x86/include/ -I$(srctree)/arch/x86/lib/ -I$(srctree)/include/uapi/
|
||||
|
||||
HOSTCFLAGS_insn_sanity.o := -Wall -I$(objtree)/arch/x86/lib/ -I$(srctree)/arch/x86/include/ -I$(srctree)/arch/x86/lib/ -I$(srctree)/include/
|
||||
|
||||
# Dependencies are also needed.
|
||||
$(obj)/test_get_len.o: $(srctree)/arch/x86/lib/insn.c $(srctree)/arch/x86/lib/inat.c $(srctree)/arch/x86/include/asm/inat_types.h $(srctree)/arch/x86/include/asm/inat.h $(srctree)/arch/x86/include/asm/insn.h $(objtree)/arch/x86/lib/inat-tables.c
|
||||
$(obj)/insn_decoder_test.o: $(srctree)/arch/x86/lib/insn.c $(srctree)/arch/x86/lib/inat.c $(srctree)/arch/x86/include/asm/inat_types.h $(srctree)/arch/x86/include/asm/inat.h $(srctree)/arch/x86/include/asm/insn.h $(objtree)/arch/x86/lib/inat-tables.c
|
||||
|
||||
$(obj)/insn_sanity.o: $(srctree)/arch/x86/lib/insn.c $(srctree)/arch/x86/lib/inat.c $(srctree)/arch/x86/include/asm/inat_types.h $(srctree)/arch/x86/include/asm/inat.h $(srctree)/arch/x86/include/asm/insn.h $(objtree)/arch/x86/lib/inat-tables.c
|
||||
|
||||
|
@ -9,10 +9,6 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Copyright (C) IBM Corporation, 2009
|
||||
*/
|
||||
|
||||
@ -21,6 +17,7 @@
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define unlikely(cond) (cond)
|
||||
|
||||
@ -33,7 +30,7 @@
|
||||
* particular. See if insn_get_length() and the disassembler agree
|
||||
* on the length of each instruction in an elf disassembly.
|
||||
*
|
||||
* Usage: objdump -d a.out | awk -f distill.awk | ./test_get_len
|
||||
* Usage: objdump -d a.out | awk -f objdump_reformat.awk | ./insn_decoder_test
|
||||
*/
|
||||
|
||||
const char *prog;
|
||||
@ -42,8 +39,8 @@ static int x86_64;
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: objdump -d a.out | awk -f distill.awk |"
|
||||
" %s [-y|-n] [-v]\n", prog);
|
||||
fprintf(stderr, "Usage: objdump -d a.out | awk -f objdump_reformat.awk"
|
||||
" | %s [-y|-n] [-v]\n", prog);
|
||||
fprintf(stderr, "\t-y 64bit mode\n");
|
||||
fprintf(stderr, "\t-n 32bit mode\n");
|
||||
fprintf(stderr, "\t-v verbose mode\n");
|
||||
@ -52,10 +49,21 @@ static void usage(void)
|
||||
|
||||
static void malformed_line(const char *line, int line_nr)
|
||||
{
|
||||
fprintf(stderr, "%s: malformed line %d:\n%s", prog, line_nr, line);
|
||||
fprintf(stderr, "%s: error: malformed line %d:\n%s",
|
||||
prog, line_nr, line);
|
||||
exit(3);
|
||||
}
|
||||
|
||||
static void pr_warn(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
fprintf(stderr, "%s: warning: ", prog);
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
static void dump_field(FILE *fp, const char *name, const char *indent,
|
||||
struct insn_field *field)
|
||||
{
|
||||
@ -153,21 +161,20 @@ int main(int argc, char **argv)
|
||||
insn_get_length(&insn);
|
||||
if (insn.length != nb) {
|
||||
warnings++;
|
||||
fprintf(stderr, "Warning: %s found difference at %s\n",
|
||||
prog, sym);
|
||||
fprintf(stderr, "Warning: %s", line);
|
||||
fprintf(stderr, "Warning: objdump says %d bytes, but "
|
||||
"insn_get_length() says %d\n", nb,
|
||||
insn.length);
|
||||
pr_warn("Found an x86 instruction decoder bug, "
|
||||
"please report this.\n", sym);
|
||||
pr_warn("%s", line);
|
||||
pr_warn("objdump says %d bytes, but insn_get_length() "
|
||||
"says %d\n", nb, insn.length);
|
||||
if (verbose)
|
||||
dump_insn(stderr, &insn);
|
||||
}
|
||||
}
|
||||
if (warnings)
|
||||
fprintf(stderr, "Warning: decoded and checked %d"
|
||||
" instructions with %d warnings\n", insns, warnings);
|
||||
pr_warn("Decoded and checked %d instructions with %d "
|
||||
"failures\n", insns, warnings);
|
||||
else
|
||||
fprintf(stdout, "Success: decoded and checked %d"
|
||||
" instructions\n", insns);
|
||||
fprintf(stdout, "%s: success: Decoded and checked %d"
|
||||
" instructions\n", prog, insns);
|
||||
return 0;
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
#!/bin/awk -f
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Usage: objdump -d a.out | awk -f distill.awk | ./test_get_len
|
||||
# Distills the disassembly as follows:
|
||||
# Usage: objdump -d a.out | awk -f objdump_reformat.awk | ./insn_decoder_test
|
||||
# Reformats the disassembly as follows:
|
||||
# - Removes all lines except the disassembled instructions.
|
||||
# - For instructions that exceed 1 line (7 bytes), crams all the hex bytes
|
||||
# into a single line.
|
@ -612,9 +612,12 @@ struct perf_event_mmap_page {
|
||||
*/
|
||||
#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12)
|
||||
/*
|
||||
* PERF_RECORD_MISC_MMAP_DATA and PERF_RECORD_MISC_COMM_EXEC are used on
|
||||
* different events so can reuse the same bit position.
|
||||
* Ditto PERF_RECORD_MISC_SWITCH_OUT.
|
||||
* Following PERF_RECORD_MISC_* are used on different
|
||||
* events, so can reuse the same bit position:
|
||||
*
|
||||
* PERF_RECORD_MISC_MMAP_DATA - PERF_RECORD_MMAP* events
|
||||
* PERF_RECORD_MISC_COMM_EXEC - PERF_RECORD_COMM event
|
||||
* PERF_RECORD_MISC_SWITCH_OUT - PERF_RECORD_SWITCH* events
|
||||
*/
|
||||
#define PERF_RECORD_MISC_MMAP_DATA (1 << 13)
|
||||
#define PERF_RECORD_MISC_COMM_EXEC (1 << 13)
|
||||
@ -864,6 +867,7 @@ enum perf_event_type {
|
||||
* struct perf_event_header header;
|
||||
* u32 pid;
|
||||
* u32 tid;
|
||||
* struct sample_id sample_id;
|
||||
* };
|
||||
*/
|
||||
PERF_RECORD_ITRACE_START = 12,
|
||||
|
@ -178,21 +178,6 @@ put_callchain_entry(int rctx)
|
||||
put_recursion_context(this_cpu_ptr(callchain_recursion), rctx);
|
||||
}
|
||||
|
||||
struct perf_callchain_entry *
|
||||
perf_callchain(struct perf_event *event, struct pt_regs *regs)
|
||||
{
|
||||
bool kernel = !event->attr.exclude_callchain_kernel;
|
||||
bool user = !event->attr.exclude_callchain_user;
|
||||
/* Disallow cross-task user callchains. */
|
||||
bool crosstask = event->ctx->task && event->ctx->task != current;
|
||||
const u32 max_stack = event->attr.sample_max_stack;
|
||||
|
||||
if (!kernel && !user)
|
||||
return NULL;
|
||||
|
||||
return get_perf_callchain(regs, 0, kernel, user, max_stack, crosstask, true);
|
||||
}
|
||||
|
||||
struct perf_callchain_entry *
|
||||
get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
|
||||
u32 max_stack, bool crosstask, bool add_mark)
|
||||
|
@ -5824,19 +5824,11 @@ void perf_output_sample(struct perf_output_handle *handle,
|
||||
perf_output_read(handle, event);
|
||||
|
||||
if (sample_type & PERF_SAMPLE_CALLCHAIN) {
|
||||
if (data->callchain) {
|
||||
int size = 1;
|
||||
int size = 1;
|
||||
|
||||
if (data->callchain)
|
||||
size += data->callchain->nr;
|
||||
|
||||
size *= sizeof(u64);
|
||||
|
||||
__output_copy(handle, data->callchain, size);
|
||||
} else {
|
||||
u64 nr = 0;
|
||||
perf_output_put(handle, nr);
|
||||
}
|
||||
size += data->callchain->nr;
|
||||
size *= sizeof(u64);
|
||||
__output_copy(handle, data->callchain, size);
|
||||
}
|
||||
|
||||
if (sample_type & PERF_SAMPLE_RAW) {
|
||||
@ -5989,6 +5981,26 @@ static u64 perf_virt_to_phys(u64 virt)
|
||||
return phys_addr;
|
||||
}
|
||||
|
||||
static struct perf_callchain_entry __empty_callchain = { .nr = 0, };
|
||||
|
||||
static struct perf_callchain_entry *
|
||||
perf_callchain(struct perf_event *event, struct pt_regs *regs)
|
||||
{
|
||||
bool kernel = !event->attr.exclude_callchain_kernel;
|
||||
bool user = !event->attr.exclude_callchain_user;
|
||||
/* Disallow cross-task user callchains. */
|
||||
bool crosstask = event->ctx->task && event->ctx->task != current;
|
||||
const u32 max_stack = event->attr.sample_max_stack;
|
||||
struct perf_callchain_entry *callchain;
|
||||
|
||||
if (!kernel && !user)
|
||||
return &__empty_callchain;
|
||||
|
||||
callchain = get_perf_callchain(regs, 0, kernel, user,
|
||||
max_stack, crosstask, true);
|
||||
return callchain ?: &__empty_callchain;
|
||||
}
|
||||
|
||||
void perf_prepare_sample(struct perf_event_header *header,
|
||||
struct perf_sample_data *data,
|
||||
struct perf_event *event,
|
||||
@ -6011,9 +6023,7 @@ void perf_prepare_sample(struct perf_event_header *header,
|
||||
int size = 1;
|
||||
|
||||
data->callchain = perf_callchain(event, regs);
|
||||
|
||||
if (data->callchain)
|
||||
size += data->callchain->nr;
|
||||
size += data->callchain->nr;
|
||||
|
||||
header->size += size * sizeof(u64);
|
||||
}
|
||||
@ -10740,6 +10750,19 @@ inherit_event(struct perf_event *parent_event,
|
||||
if (IS_ERR(child_event))
|
||||
return child_event;
|
||||
|
||||
|
||||
if ((child_event->attach_state & PERF_ATTACH_TASK_DATA) &&
|
||||
!child_ctx->task_ctx_data) {
|
||||
struct pmu *pmu = child_event->pmu;
|
||||
|
||||
child_ctx->task_ctx_data = kzalloc(pmu->task_ctx_size,
|
||||
GFP_KERNEL);
|
||||
if (!child_ctx->task_ctx_data) {
|
||||
free_event(child_event);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* is_orphaned_event() and list_add_tail(&parent_event->child_list)
|
||||
* must be under the same lock in order to serialize against
|
||||
@ -10750,6 +10773,7 @@ inherit_event(struct perf_event *parent_event,
|
||||
if (is_orphaned_event(parent_event) ||
|
||||
!atomic_long_inc_not_zero(&parent_event->refcount)) {
|
||||
mutex_unlock(&parent_event->child_mutex);
|
||||
/* task_ctx_data is freed with child_ctx */
|
||||
free_event(child_event);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -201,10 +201,6 @@ arch_perf_out_copy_user(void *dst, const void *src, unsigned long n)
|
||||
|
||||
DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user)
|
||||
|
||||
/* Callchain handling */
|
||||
extern struct perf_callchain_entry *
|
||||
perf_callchain(struct perf_event *event, struct pt_regs *regs);
|
||||
|
||||
static inline int get_recursion_context(int *recursion)
|
||||
{
|
||||
int rctx;
|
||||
|
128
tools/arch/alpha/include/uapi/asm/errno.h
Normal file
128
tools/arch/alpha/include/uapi/asm/errno.h
Normal file
@ -0,0 +1,128 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ALPHA_ERRNO_H
|
||||
#define _ALPHA_ERRNO_H
|
||||
|
||||
#include <asm-generic/errno-base.h>
|
||||
|
||||
#undef EAGAIN /* 11 in errno-base.h */
|
||||
|
||||
#define EDEADLK 11 /* Resource deadlock would occur */
|
||||
|
||||
#define EAGAIN 35 /* Try again */
|
||||
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
||||
#define EINPROGRESS 36 /* Operation now in progress */
|
||||
#define EALREADY 37 /* Operation already in progress */
|
||||
#define ENOTSOCK 38 /* Socket operation on non-socket */
|
||||
#define EDESTADDRREQ 39 /* Destination address required */
|
||||
#define EMSGSIZE 40 /* Message too long */
|
||||
#define EPROTOTYPE 41 /* Protocol wrong type for socket */
|
||||
#define ENOPROTOOPT 42 /* Protocol not available */
|
||||
#define EPROTONOSUPPORT 43 /* Protocol not supported */
|
||||
#define ESOCKTNOSUPPORT 44 /* Socket type not supported */
|
||||
#define EOPNOTSUPP 45 /* Operation not supported on transport endpoint */
|
||||
#define EPFNOSUPPORT 46 /* Protocol family not supported */
|
||||
#define EAFNOSUPPORT 47 /* Address family not supported by protocol */
|
||||
#define EADDRINUSE 48 /* Address already in use */
|
||||
#define EADDRNOTAVAIL 49 /* Cannot assign requested address */
|
||||
#define ENETDOWN 50 /* Network is down */
|
||||
#define ENETUNREACH 51 /* Network is unreachable */
|
||||
#define ENETRESET 52 /* Network dropped connection because of reset */
|
||||
#define ECONNABORTED 53 /* Software caused connection abort */
|
||||
#define ECONNRESET 54 /* Connection reset by peer */
|
||||
#define ENOBUFS 55 /* No buffer space available */
|
||||
#define EISCONN 56 /* Transport endpoint is already connected */
|
||||
#define ENOTCONN 57 /* Transport endpoint is not connected */
|
||||
#define ESHUTDOWN 58 /* Cannot send after transport endpoint shutdown */
|
||||
#define ETOOMANYREFS 59 /* Too many references: cannot splice */
|
||||
#define ETIMEDOUT 60 /* Connection timed out */
|
||||
#define ECONNREFUSED 61 /* Connection refused */
|
||||
#define ELOOP 62 /* Too many symbolic links encountered */
|
||||
#define ENAMETOOLONG 63 /* File name too long */
|
||||
#define EHOSTDOWN 64 /* Host is down */
|
||||
#define EHOSTUNREACH 65 /* No route to host */
|
||||
#define ENOTEMPTY 66 /* Directory not empty */
|
||||
|
||||
#define EUSERS 68 /* Too many users */
|
||||
#define EDQUOT 69 /* Quota exceeded */
|
||||
#define ESTALE 70 /* Stale file handle */
|
||||
#define EREMOTE 71 /* Object is remote */
|
||||
|
||||
#define ENOLCK 77 /* No record locks available */
|
||||
#define ENOSYS 78 /* Function not implemented */
|
||||
|
||||
#define ENOMSG 80 /* No message of desired type */
|
||||
#define EIDRM 81 /* Identifier removed */
|
||||
#define ENOSR 82 /* Out of streams resources */
|
||||
#define ETIME 83 /* Timer expired */
|
||||
#define EBADMSG 84 /* Not a data message */
|
||||
#define EPROTO 85 /* Protocol error */
|
||||
#define ENODATA 86 /* No data available */
|
||||
#define ENOSTR 87 /* Device not a stream */
|
||||
|
||||
#define ENOPKG 92 /* Package not installed */
|
||||
|
||||
#define EILSEQ 116 /* Illegal byte sequence */
|
||||
|
||||
/* The following are just random noise.. */
|
||||
#define ECHRNG 88 /* Channel number out of range */
|
||||
#define EL2NSYNC 89 /* Level 2 not synchronized */
|
||||
#define EL3HLT 90 /* Level 3 halted */
|
||||
#define EL3RST 91 /* Level 3 reset */
|
||||
|
||||
#define ELNRNG 93 /* Link number out of range */
|
||||
#define EUNATCH 94 /* Protocol driver not attached */
|
||||
#define ENOCSI 95 /* No CSI structure available */
|
||||
#define EL2HLT 96 /* Level 2 halted */
|
||||
#define EBADE 97 /* Invalid exchange */
|
||||
#define EBADR 98 /* Invalid request descriptor */
|
||||
#define EXFULL 99 /* Exchange full */
|
||||
#define ENOANO 100 /* No anode */
|
||||
#define EBADRQC 101 /* Invalid request code */
|
||||
#define EBADSLT 102 /* Invalid slot */
|
||||
|
||||
#define EDEADLOCK EDEADLK
|
||||
|
||||
#define EBFONT 104 /* Bad font file format */
|
||||
#define ENONET 105 /* Machine is not on the network */
|
||||
#define ENOLINK 106 /* Link has been severed */
|
||||
#define EADV 107 /* Advertise error */
|
||||
#define ESRMNT 108 /* Srmount error */
|
||||
#define ECOMM 109 /* Communication error on send */
|
||||
#define EMULTIHOP 110 /* Multihop attempted */
|
||||
#define EDOTDOT 111 /* RFS specific error */
|
||||
#define EOVERFLOW 112 /* Value too large for defined data type */
|
||||
#define ENOTUNIQ 113 /* Name not unique on network */
|
||||
#define EBADFD 114 /* File descriptor in bad state */
|
||||
#define EREMCHG 115 /* Remote address changed */
|
||||
|
||||
#define EUCLEAN 117 /* Structure needs cleaning */
|
||||
#define ENOTNAM 118 /* Not a XENIX named type file */
|
||||
#define ENAVAIL 119 /* No XENIX semaphores available */
|
||||
#define EISNAM 120 /* Is a named type file */
|
||||
#define EREMOTEIO 121 /* Remote I/O error */
|
||||
|
||||
#define ELIBACC 122 /* Can not access a needed shared library */
|
||||
#define ELIBBAD 123 /* Accessing a corrupted shared library */
|
||||
#define ELIBSCN 124 /* .lib section in a.out corrupted */
|
||||
#define ELIBMAX 125 /* Attempting to link in too many shared libraries */
|
||||
#define ELIBEXEC 126 /* Cannot exec a shared library directly */
|
||||
#define ERESTART 127 /* Interrupted system call should be restarted */
|
||||
#define ESTRPIPE 128 /* Streams pipe error */
|
||||
|
||||
#define ENOMEDIUM 129 /* No medium found */
|
||||
#define EMEDIUMTYPE 130 /* Wrong medium type */
|
||||
#define ECANCELED 131 /* Operation Cancelled */
|
||||
#define ENOKEY 132 /* Required key not available */
|
||||
#define EKEYEXPIRED 133 /* Key has expired */
|
||||
#define EKEYREVOKED 134 /* Key has been revoked */
|
||||
#define EKEYREJECTED 135 /* Key was rejected by service */
|
||||
|
||||
/* for robust mutexes */
|
||||
#define EOWNERDEAD 136 /* Owner died */
|
||||
#define ENOTRECOVERABLE 137 /* State not recoverable */
|
||||
|
||||
#define ERFKILL 138 /* Operation not possible due to RF-kill */
|
||||
|
||||
#define EHWPOISON 139 /* Memory page has hardware error */
|
||||
|
||||
#endif
|
17
tools/arch/mips/include/asm/errno.h
Normal file
17
tools/arch/mips/include/asm/errno.h
Normal file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 1995, 1999, 2001, 2002 by Ralf Baechle
|
||||
*/
|
||||
#ifndef _ASM_ERRNO_H
|
||||
#define _ASM_ERRNO_H
|
||||
|
||||
#include <uapi/asm/errno.h>
|
||||
|
||||
|
||||
/* The biggest error number defined here or in <linux/errno.h>. */
|
||||
#define EMAXERRNO 1133
|
||||
|
||||
#endif /* _ASM_ERRNO_H */
|
130
tools/arch/mips/include/uapi/asm/errno.h
Normal file
130
tools/arch/mips/include/uapi/asm/errno.h
Normal file
@ -0,0 +1,130 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 1995, 1999, 2001, 2002 by Ralf Baechle
|
||||
*/
|
||||
#ifndef _UAPI_ASM_ERRNO_H
|
||||
#define _UAPI_ASM_ERRNO_H
|
||||
|
||||
/*
|
||||
* These error numbers are intended to be MIPS ABI compatible
|
||||
*/
|
||||
|
||||
#include <asm-generic/errno-base.h>
|
||||
|
||||
#define ENOMSG 35 /* No message of desired type */
|
||||
#define EIDRM 36 /* Identifier removed */
|
||||
#define ECHRNG 37 /* Channel number out of range */
|
||||
#define EL2NSYNC 38 /* Level 2 not synchronized */
|
||||
#define EL3HLT 39 /* Level 3 halted */
|
||||
#define EL3RST 40 /* Level 3 reset */
|
||||
#define ELNRNG 41 /* Link number out of range */
|
||||
#define EUNATCH 42 /* Protocol driver not attached */
|
||||
#define ENOCSI 43 /* No CSI structure available */
|
||||
#define EL2HLT 44 /* Level 2 halted */
|
||||
#define EDEADLK 45 /* Resource deadlock would occur */
|
||||
#define ENOLCK 46 /* No record locks available */
|
||||
#define EBADE 50 /* Invalid exchange */
|
||||
#define EBADR 51 /* Invalid request descriptor */
|
||||
#define EXFULL 52 /* Exchange full */
|
||||
#define ENOANO 53 /* No anode */
|
||||
#define EBADRQC 54 /* Invalid request code */
|
||||
#define EBADSLT 55 /* Invalid slot */
|
||||
#define EDEADLOCK 56 /* File locking deadlock error */
|
||||
#define EBFONT 59 /* Bad font file format */
|
||||
#define ENOSTR 60 /* Device not a stream */
|
||||
#define ENODATA 61 /* No data available */
|
||||
#define ETIME 62 /* Timer expired */
|
||||
#define ENOSR 63 /* Out of streams resources */
|
||||
#define ENONET 64 /* Machine is not on the network */
|
||||
#define ENOPKG 65 /* Package not installed */
|
||||
#define EREMOTE 66 /* Object is remote */
|
||||
#define ENOLINK 67 /* Link has been severed */
|
||||
#define EADV 68 /* Advertise error */
|
||||
#define ESRMNT 69 /* Srmount error */
|
||||
#define ECOMM 70 /* Communication error on send */
|
||||
#define EPROTO 71 /* Protocol error */
|
||||
#define EDOTDOT 73 /* RFS specific error */
|
||||
#define EMULTIHOP 74 /* Multihop attempted */
|
||||
#define EBADMSG 77 /* Not a data message */
|
||||
#define ENAMETOOLONG 78 /* File name too long */
|
||||
#define EOVERFLOW 79 /* Value too large for defined data type */
|
||||
#define ENOTUNIQ 80 /* Name not unique on network */
|
||||
#define EBADFD 81 /* File descriptor in bad state */
|
||||
#define EREMCHG 82 /* Remote address changed */
|
||||
#define ELIBACC 83 /* Can not access a needed shared library */
|
||||
#define ELIBBAD 84 /* Accessing a corrupted shared library */
|
||||
#define ELIBSCN 85 /* .lib section in a.out corrupted */
|
||||
#define ELIBMAX 86 /* Attempting to link in too many shared libraries */
|
||||
#define ELIBEXEC 87 /* Cannot exec a shared library directly */
|
||||
#define EILSEQ 88 /* Illegal byte sequence */
|
||||
#define ENOSYS 89 /* Function not implemented */
|
||||
#define ELOOP 90 /* Too many symbolic links encountered */
|
||||
#define ERESTART 91 /* Interrupted system call should be restarted */
|
||||
#define ESTRPIPE 92 /* Streams pipe error */
|
||||
#define ENOTEMPTY 93 /* Directory not empty */
|
||||
#define EUSERS 94 /* Too many users */
|
||||
#define ENOTSOCK 95 /* Socket operation on non-socket */
|
||||
#define EDESTADDRREQ 96 /* Destination address required */
|
||||
#define EMSGSIZE 97 /* Message too long */
|
||||
#define EPROTOTYPE 98 /* Protocol wrong type for socket */
|
||||
#define ENOPROTOOPT 99 /* Protocol not available */
|
||||
#define EPROTONOSUPPORT 120 /* Protocol not supported */
|
||||
#define ESOCKTNOSUPPORT 121 /* Socket type not supported */
|
||||
#define EOPNOTSUPP 122 /* Operation not supported on transport endpoint */
|
||||
#define EPFNOSUPPORT 123 /* Protocol family not supported */
|
||||
#define EAFNOSUPPORT 124 /* Address family not supported by protocol */
|
||||
#define EADDRINUSE 125 /* Address already in use */
|
||||
#define EADDRNOTAVAIL 126 /* Cannot assign requested address */
|
||||
#define ENETDOWN 127 /* Network is down */
|
||||
#define ENETUNREACH 128 /* Network is unreachable */
|
||||
#define ENETRESET 129 /* Network dropped connection because of reset */
|
||||
#define ECONNABORTED 130 /* Software caused connection abort */
|
||||
#define ECONNRESET 131 /* Connection reset by peer */
|
||||
#define ENOBUFS 132 /* No buffer space available */
|
||||
#define EISCONN 133 /* Transport endpoint is already connected */
|
||||
#define ENOTCONN 134 /* Transport endpoint is not connected */
|
||||
#define EUCLEAN 135 /* Structure needs cleaning */
|
||||
#define ENOTNAM 137 /* Not a XENIX named type file */
|
||||
#define ENAVAIL 138 /* No XENIX semaphores available */
|
||||
#define EISNAM 139 /* Is a named type file */
|
||||
#define EREMOTEIO 140 /* Remote I/O error */
|
||||
#define EINIT 141 /* Reserved */
|
||||
#define EREMDEV 142 /* Error 142 */
|
||||
#define ESHUTDOWN 143 /* Cannot send after transport endpoint shutdown */
|
||||
#define ETOOMANYREFS 144 /* Too many references: cannot splice */
|
||||
#define ETIMEDOUT 145 /* Connection timed out */
|
||||
#define ECONNREFUSED 146 /* Connection refused */
|
||||
#define EHOSTDOWN 147 /* Host is down */
|
||||
#define EHOSTUNREACH 148 /* No route to host */
|
||||
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
||||
#define EALREADY 149 /* Operation already in progress */
|
||||
#define EINPROGRESS 150 /* Operation now in progress */
|
||||
#define ESTALE 151 /* Stale file handle */
|
||||
#define ECANCELED 158 /* AIO operation canceled */
|
||||
|
||||
/*
|
||||
* These error are Linux extensions.
|
||||
*/
|
||||
#define ENOMEDIUM 159 /* No medium found */
|
||||
#define EMEDIUMTYPE 160 /* Wrong medium type */
|
||||
#define ENOKEY 161 /* Required key not available */
|
||||
#define EKEYEXPIRED 162 /* Key has expired */
|
||||
#define EKEYREVOKED 163 /* Key has been revoked */
|
||||
#define EKEYREJECTED 164 /* Key was rejected by service */
|
||||
|
||||
/* for robust mutexes */
|
||||
#define EOWNERDEAD 165 /* Owner died */
|
||||
#define ENOTRECOVERABLE 166 /* State not recoverable */
|
||||
|
||||
#define ERFKILL 167 /* Operation not possible due to RF-kill */
|
||||
|
||||
#define EHWPOISON 168 /* Memory page has hardware error */
|
||||
|
||||
#define EDQUOT 1133 /* Quota exceeded */
|
||||
|
||||
|
||||
#endif /* _UAPI_ASM_ERRNO_H */
|
128
tools/arch/parisc/include/uapi/asm/errno.h
Normal file
128
tools/arch/parisc/include/uapi/asm/errno.h
Normal file
@ -0,0 +1,128 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _PARISC_ERRNO_H
|
||||
#define _PARISC_ERRNO_H
|
||||
|
||||
#include <asm-generic/errno-base.h>
|
||||
|
||||
#define ENOMSG 35 /* No message of desired type */
|
||||
#define EIDRM 36 /* Identifier removed */
|
||||
#define ECHRNG 37 /* Channel number out of range */
|
||||
#define EL2NSYNC 38 /* Level 2 not synchronized */
|
||||
#define EL3HLT 39 /* Level 3 halted */
|
||||
#define EL3RST 40 /* Level 3 reset */
|
||||
#define ELNRNG 41 /* Link number out of range */
|
||||
#define EUNATCH 42 /* Protocol driver not attached */
|
||||
#define ENOCSI 43 /* No CSI structure available */
|
||||
#define EL2HLT 44 /* Level 2 halted */
|
||||
#define EDEADLK 45 /* Resource deadlock would occur */
|
||||
#define EDEADLOCK EDEADLK
|
||||
#define ENOLCK 46 /* No record locks available */
|
||||
#define EILSEQ 47 /* Illegal byte sequence */
|
||||
|
||||
#define ENONET 50 /* Machine is not on the network */
|
||||
#define ENODATA 51 /* No data available */
|
||||
#define ETIME 52 /* Timer expired */
|
||||
#define ENOSR 53 /* Out of streams resources */
|
||||
#define ENOSTR 54 /* Device not a stream */
|
||||
#define ENOPKG 55 /* Package not installed */
|
||||
|
||||
#define ENOLINK 57 /* Link has been severed */
|
||||
#define EADV 58 /* Advertise error */
|
||||
#define ESRMNT 59 /* Srmount error */
|
||||
#define ECOMM 60 /* Communication error on send */
|
||||
#define EPROTO 61 /* Protocol error */
|
||||
|
||||
#define EMULTIHOP 64 /* Multihop attempted */
|
||||
|
||||
#define EDOTDOT 66 /* RFS specific error */
|
||||
#define EBADMSG 67 /* Not a data message */
|
||||
#define EUSERS 68 /* Too many users */
|
||||
#define EDQUOT 69 /* Quota exceeded */
|
||||
#define ESTALE 70 /* Stale file handle */
|
||||
#define EREMOTE 71 /* Object is remote */
|
||||
#define EOVERFLOW 72 /* Value too large for defined data type */
|
||||
|
||||
/* these errnos are defined by Linux but not HPUX. */
|
||||
|
||||
#define EBADE 160 /* Invalid exchange */
|
||||
#define EBADR 161 /* Invalid request descriptor */
|
||||
#define EXFULL 162 /* Exchange full */
|
||||
#define ENOANO 163 /* No anode */
|
||||
#define EBADRQC 164 /* Invalid request code */
|
||||
#define EBADSLT 165 /* Invalid slot */
|
||||
#define EBFONT 166 /* Bad font file format */
|
||||
#define ENOTUNIQ 167 /* Name not unique on network */
|
||||
#define EBADFD 168 /* File descriptor in bad state */
|
||||
#define EREMCHG 169 /* Remote address changed */
|
||||
#define ELIBACC 170 /* Can not access a needed shared library */
|
||||
#define ELIBBAD 171 /* Accessing a corrupted shared library */
|
||||
#define ELIBSCN 172 /* .lib section in a.out corrupted */
|
||||
#define ELIBMAX 173 /* Attempting to link in too many shared libraries */
|
||||
#define ELIBEXEC 174 /* Cannot exec a shared library directly */
|
||||
#define ERESTART 175 /* Interrupted system call should be restarted */
|
||||
#define ESTRPIPE 176 /* Streams pipe error */
|
||||
#define EUCLEAN 177 /* Structure needs cleaning */
|
||||
#define ENOTNAM 178 /* Not a XENIX named type file */
|
||||
#define ENAVAIL 179 /* No XENIX semaphores available */
|
||||
#define EISNAM 180 /* Is a named type file */
|
||||
#define EREMOTEIO 181 /* Remote I/O error */
|
||||
#define ENOMEDIUM 182 /* No medium found */
|
||||
#define EMEDIUMTYPE 183 /* Wrong medium type */
|
||||
#define ENOKEY 184 /* Required key not available */
|
||||
#define EKEYEXPIRED 185 /* Key has expired */
|
||||
#define EKEYREVOKED 186 /* Key has been revoked */
|
||||
#define EKEYREJECTED 187 /* Key was rejected by service */
|
||||
|
||||
/* We now return you to your regularly scheduled HPUX. */
|
||||
|
||||
#define ENOSYM 215 /* symbol does not exist in executable */
|
||||
#define ENOTSOCK 216 /* Socket operation on non-socket */
|
||||
#define EDESTADDRREQ 217 /* Destination address required */
|
||||
#define EMSGSIZE 218 /* Message too long */
|
||||
#define EPROTOTYPE 219 /* Protocol wrong type for socket */
|
||||
#define ENOPROTOOPT 220 /* Protocol not available */
|
||||
#define EPROTONOSUPPORT 221 /* Protocol not supported */
|
||||
#define ESOCKTNOSUPPORT 222 /* Socket type not supported */
|
||||
#define EOPNOTSUPP 223 /* Operation not supported on transport endpoint */
|
||||
#define EPFNOSUPPORT 224 /* Protocol family not supported */
|
||||
#define EAFNOSUPPORT 225 /* Address family not supported by protocol */
|
||||
#define EADDRINUSE 226 /* Address already in use */
|
||||
#define EADDRNOTAVAIL 227 /* Cannot assign requested address */
|
||||
#define ENETDOWN 228 /* Network is down */
|
||||
#define ENETUNREACH 229 /* Network is unreachable */
|
||||
#define ENETRESET 230 /* Network dropped connection because of reset */
|
||||
#define ECONNABORTED 231 /* Software caused connection abort */
|
||||
#define ECONNRESET 232 /* Connection reset by peer */
|
||||
#define ENOBUFS 233 /* No buffer space available */
|
||||
#define EISCONN 234 /* Transport endpoint is already connected */
|
||||
#define ENOTCONN 235 /* Transport endpoint is not connected */
|
||||
#define ESHUTDOWN 236 /* Cannot send after transport endpoint shutdown */
|
||||
#define ETOOMANYREFS 237 /* Too many references: cannot splice */
|
||||
#define ETIMEDOUT 238 /* Connection timed out */
|
||||
#define ECONNREFUSED 239 /* Connection refused */
|
||||
#define EREFUSED ECONNREFUSED /* for HP's NFS apparently */
|
||||
#define EREMOTERELEASE 240 /* Remote peer released connection */
|
||||
#define EHOSTDOWN 241 /* Host is down */
|
||||
#define EHOSTUNREACH 242 /* No route to host */
|
||||
|
||||
#define EALREADY 244 /* Operation already in progress */
|
||||
#define EINPROGRESS 245 /* Operation now in progress */
|
||||
#define EWOULDBLOCK EAGAIN /* Operation would block (Not HPUX compliant) */
|
||||
#define ENOTEMPTY 247 /* Directory not empty */
|
||||
#define ENAMETOOLONG 248 /* File name too long */
|
||||
#define ELOOP 249 /* Too many symbolic links encountered */
|
||||
#define ENOSYS 251 /* Function not implemented */
|
||||
|
||||
#define ENOTSUP 252 /* Function not implemented (POSIX.4 / HPUX) */
|
||||
#define ECANCELLED 253 /* aio request was canceled before complete (POSIX.4 / HPUX) */
|
||||
#define ECANCELED ECANCELLED /* SuSv3 and Solaris wants one 'L' */
|
||||
|
||||
/* for robust mutexes */
|
||||
#define EOWNERDEAD 254 /* Owner died */
|
||||
#define ENOTRECOVERABLE 255 /* State not recoverable */
|
||||
|
||||
#define ERFKILL 256 /* Operation not possible due to RF-kill */
|
||||
|
||||
#define EHWPOISON 257 /* Memory page has hardware error */
|
||||
|
||||
#endif
|
10
tools/arch/powerpc/include/uapi/asm/errno.h
Normal file
10
tools/arch/powerpc/include/uapi/asm/errno.h
Normal file
@ -0,0 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_POWERPC_ERRNO_H
|
||||
#define _ASM_POWERPC_ERRNO_H
|
||||
|
||||
#include <asm-generic/errno.h>
|
||||
|
||||
#undef EDEADLOCK
|
||||
#define EDEADLOCK 58 /* File locking deadlock error */
|
||||
|
||||
#endif /* _ASM_POWERPC_ERRNO_H */
|
412
tools/arch/s390/include/uapi/asm/unistd.h
Normal file
412
tools/arch/s390/include/uapi/asm/unistd.h
Normal file
@ -0,0 +1,412 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/unistd.h"
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_ASM_S390_UNISTD_H_
|
||||
#define _UAPI_ASM_S390_UNISTD_H_
|
||||
|
||||
/*
|
||||
* This file contains the system call numbers.
|
||||
*/
|
||||
|
||||
#define __NR_exit 1
|
||||
#define __NR_fork 2
|
||||
#define __NR_read 3
|
||||
#define __NR_write 4
|
||||
#define __NR_open 5
|
||||
#define __NR_close 6
|
||||
#define __NR_restart_syscall 7
|
||||
#define __NR_creat 8
|
||||
#define __NR_link 9
|
||||
#define __NR_unlink 10
|
||||
#define __NR_execve 11
|
||||
#define __NR_chdir 12
|
||||
#define __NR_mknod 14
|
||||
#define __NR_chmod 15
|
||||
#define __NR_lseek 19
|
||||
#define __NR_getpid 20
|
||||
#define __NR_mount 21
|
||||
#define __NR_umount 22
|
||||
#define __NR_ptrace 26
|
||||
#define __NR_alarm 27
|
||||
#define __NR_pause 29
|
||||
#define __NR_utime 30
|
||||
#define __NR_access 33
|
||||
#define __NR_nice 34
|
||||
#define __NR_sync 36
|
||||
#define __NR_kill 37
|
||||
#define __NR_rename 38
|
||||
#define __NR_mkdir 39
|
||||
#define __NR_rmdir 40
|
||||
#define __NR_dup 41
|
||||
#define __NR_pipe 42
|
||||
#define __NR_times 43
|
||||
#define __NR_brk 45
|
||||
#define __NR_signal 48
|
||||
#define __NR_acct 51
|
||||
#define __NR_umount2 52
|
||||
#define __NR_ioctl 54
|
||||
#define __NR_fcntl 55
|
||||
#define __NR_setpgid 57
|
||||
#define __NR_umask 60
|
||||
#define __NR_chroot 61
|
||||
#define __NR_ustat 62
|
||||
#define __NR_dup2 63
|
||||
#define __NR_getppid 64
|
||||
#define __NR_getpgrp 65
|
||||
#define __NR_setsid 66
|
||||
#define __NR_sigaction 67
|
||||
#define __NR_sigsuspend 72
|
||||
#define __NR_sigpending 73
|
||||
#define __NR_sethostname 74
|
||||
#define __NR_setrlimit 75
|
||||
#define __NR_getrusage 77
|
||||
#define __NR_gettimeofday 78
|
||||
#define __NR_settimeofday 79
|
||||
#define __NR_symlink 83
|
||||
#define __NR_readlink 85
|
||||
#define __NR_uselib 86
|
||||
#define __NR_swapon 87
|
||||
#define __NR_reboot 88
|
||||
#define __NR_readdir 89
|
||||
#define __NR_mmap 90
|
||||
#define __NR_munmap 91
|
||||
#define __NR_truncate 92
|
||||
#define __NR_ftruncate 93
|
||||
#define __NR_fchmod 94
|
||||
#define __NR_getpriority 96
|
||||
#define __NR_setpriority 97
|
||||
#define __NR_statfs 99
|
||||
#define __NR_fstatfs 100
|
||||
#define __NR_socketcall 102
|
||||
#define __NR_syslog 103
|
||||
#define __NR_setitimer 104
|
||||
#define __NR_getitimer 105
|
||||
#define __NR_stat 106
|
||||
#define __NR_lstat 107
|
||||
#define __NR_fstat 108
|
||||
#define __NR_lookup_dcookie 110
|
||||
#define __NR_vhangup 111
|
||||
#define __NR_idle 112
|
||||
#define __NR_wait4 114
|
||||
#define __NR_swapoff 115
|
||||
#define __NR_sysinfo 116
|
||||
#define __NR_ipc 117
|
||||
#define __NR_fsync 118
|
||||
#define __NR_sigreturn 119
|
||||
#define __NR_clone 120
|
||||
#define __NR_setdomainname 121
|
||||
#define __NR_uname 122
|
||||
#define __NR_adjtimex 124
|
||||
#define __NR_mprotect 125
|
||||
#define __NR_sigprocmask 126
|
||||
#define __NR_create_module 127
|
||||
#define __NR_init_module 128
|
||||
#define __NR_delete_module 129
|
||||
#define __NR_get_kernel_syms 130
|
||||
#define __NR_quotactl 131
|
||||
#define __NR_getpgid 132
|
||||
#define __NR_fchdir 133
|
||||
#define __NR_bdflush 134
|
||||
#define __NR_sysfs 135
|
||||
#define __NR_personality 136
|
||||
#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
|
||||
#define __NR_getdents 141
|
||||
#define __NR_flock 143
|
||||
#define __NR_msync 144
|
||||
#define __NR_readv 145
|
||||
#define __NR_writev 146
|
||||
#define __NR_getsid 147
|
||||
#define __NR_fdatasync 148
|
||||
#define __NR__sysctl 149
|
||||
#define __NR_mlock 150
|
||||
#define __NR_munlock 151
|
||||
#define __NR_mlockall 152
|
||||
#define __NR_munlockall 153
|
||||
#define __NR_sched_setparam 154
|
||||
#define __NR_sched_getparam 155
|
||||
#define __NR_sched_setscheduler 156
|
||||
#define __NR_sched_getscheduler 157
|
||||
#define __NR_sched_yield 158
|
||||
#define __NR_sched_get_priority_max 159
|
||||
#define __NR_sched_get_priority_min 160
|
||||
#define __NR_sched_rr_get_interval 161
|
||||
#define __NR_nanosleep 162
|
||||
#define __NR_mremap 163
|
||||
#define __NR_query_module 167
|
||||
#define __NR_poll 168
|
||||
#define __NR_nfsservctl 169
|
||||
#define __NR_prctl 172
|
||||
#define __NR_rt_sigreturn 173
|
||||
#define __NR_rt_sigaction 174
|
||||
#define __NR_rt_sigprocmask 175
|
||||
#define __NR_rt_sigpending 176
|
||||
#define __NR_rt_sigtimedwait 177
|
||||
#define __NR_rt_sigqueueinfo 178
|
||||
#define __NR_rt_sigsuspend 179
|
||||
#define __NR_pread64 180
|
||||
#define __NR_pwrite64 181
|
||||
#define __NR_getcwd 183
|
||||
#define __NR_capget 184
|
||||
#define __NR_capset 185
|
||||
#define __NR_sigaltstack 186
|
||||
#define __NR_sendfile 187
|
||||
#define __NR_getpmsg 188
|
||||
#define __NR_putpmsg 189
|
||||
#define __NR_vfork 190
|
||||
#define __NR_pivot_root 217
|
||||
#define __NR_mincore 218
|
||||
#define __NR_madvise 219
|
||||
#define __NR_getdents64 220
|
||||
#define __NR_readahead 222
|
||||
#define __NR_setxattr 224
|
||||
#define __NR_lsetxattr 225
|
||||
#define __NR_fsetxattr 226
|
||||
#define __NR_getxattr 227
|
||||
#define __NR_lgetxattr 228
|
||||
#define __NR_fgetxattr 229
|
||||
#define __NR_listxattr 230
|
||||
#define __NR_llistxattr 231
|
||||
#define __NR_flistxattr 232
|
||||
#define __NR_removexattr 233
|
||||
#define __NR_lremovexattr 234
|
||||
#define __NR_fremovexattr 235
|
||||
#define __NR_gettid 236
|
||||
#define __NR_tkill 237
|
||||
#define __NR_futex 238
|
||||
#define __NR_sched_setaffinity 239
|
||||
#define __NR_sched_getaffinity 240
|
||||
#define __NR_tgkill 241
|
||||
/* Number 242 is reserved for tux */
|
||||
#define __NR_io_setup 243
|
||||
#define __NR_io_destroy 244
|
||||
#define __NR_io_getevents 245
|
||||
#define __NR_io_submit 246
|
||||
#define __NR_io_cancel 247
|
||||
#define __NR_exit_group 248
|
||||
#define __NR_epoll_create 249
|
||||
#define __NR_epoll_ctl 250
|
||||
#define __NR_epoll_wait 251
|
||||
#define __NR_set_tid_address 252
|
||||
#define __NR_fadvise64 253
|
||||
#define __NR_timer_create 254
|
||||
#define __NR_timer_settime 255
|
||||
#define __NR_timer_gettime 256
|
||||
#define __NR_timer_getoverrun 257
|
||||
#define __NR_timer_delete 258
|
||||
#define __NR_clock_settime 259
|
||||
#define __NR_clock_gettime 260
|
||||
#define __NR_clock_getres 261
|
||||
#define __NR_clock_nanosleep 262
|
||||
/* Number 263 is reserved for vserver */
|
||||
#define __NR_statfs64 265
|
||||
#define __NR_fstatfs64 266
|
||||
#define __NR_remap_file_pages 267
|
||||
#define __NR_mbind 268
|
||||
#define __NR_get_mempolicy 269
|
||||
#define __NR_set_mempolicy 270
|
||||
#define __NR_mq_open 271
|
||||
#define __NR_mq_unlink 272
|
||||
#define __NR_mq_timedsend 273
|
||||
#define __NR_mq_timedreceive 274
|
||||
#define __NR_mq_notify 275
|
||||
#define __NR_mq_getsetattr 276
|
||||
#define __NR_kexec_load 277
|
||||
#define __NR_add_key 278
|
||||
#define __NR_request_key 279
|
||||
#define __NR_keyctl 280
|
||||
#define __NR_waitid 281
|
||||
#define __NR_ioprio_set 282
|
||||
#define __NR_ioprio_get 283
|
||||
#define __NR_inotify_init 284
|
||||
#define __NR_inotify_add_watch 285
|
||||
#define __NR_inotify_rm_watch 286
|
||||
#define __NR_migrate_pages 287
|
||||
#define __NR_openat 288
|
||||
#define __NR_mkdirat 289
|
||||
#define __NR_mknodat 290
|
||||
#define __NR_fchownat 291
|
||||
#define __NR_futimesat 292
|
||||
#define __NR_unlinkat 294
|
||||
#define __NR_renameat 295
|
||||
#define __NR_linkat 296
|
||||
#define __NR_symlinkat 297
|
||||
#define __NR_readlinkat 298
|
||||
#define __NR_fchmodat 299
|
||||
#define __NR_faccessat 300
|
||||
#define __NR_pselect6 301
|
||||
#define __NR_ppoll 302
|
||||
#define __NR_unshare 303
|
||||
#define __NR_set_robust_list 304
|
||||
#define __NR_get_robust_list 305
|
||||
#define __NR_splice 306
|
||||
#define __NR_sync_file_range 307
|
||||
#define __NR_tee 308
|
||||
#define __NR_vmsplice 309
|
||||
#define __NR_move_pages 310
|
||||
#define __NR_getcpu 311
|
||||
#define __NR_epoll_pwait 312
|
||||
#define __NR_utimes 313
|
||||
#define __NR_fallocate 314
|
||||
#define __NR_utimensat 315
|
||||
#define __NR_signalfd 316
|
||||
#define __NR_timerfd 317
|
||||
#define __NR_eventfd 318
|
||||
#define __NR_timerfd_create 319
|
||||
#define __NR_timerfd_settime 320
|
||||
#define __NR_timerfd_gettime 321
|
||||
#define __NR_signalfd4 322
|
||||
#define __NR_eventfd2 323
|
||||
#define __NR_inotify_init1 324
|
||||
#define __NR_pipe2 325
|
||||
#define __NR_dup3 326
|
||||
#define __NR_epoll_create1 327
|
||||
#define __NR_preadv 328
|
||||
#define __NR_pwritev 329
|
||||
#define __NR_rt_tgsigqueueinfo 330
|
||||
#define __NR_perf_event_open 331
|
||||
#define __NR_fanotify_init 332
|
||||
#define __NR_fanotify_mark 333
|
||||
#define __NR_prlimit64 334
|
||||
#define __NR_name_to_handle_at 335
|
||||
#define __NR_open_by_handle_at 336
|
||||
#define __NR_clock_adjtime 337
|
||||
#define __NR_syncfs 338
|
||||
#define __NR_setns 339
|
||||
#define __NR_process_vm_readv 340
|
||||
#define __NR_process_vm_writev 341
|
||||
#define __NR_s390_runtime_instr 342
|
||||
#define __NR_kcmp 343
|
||||
#define __NR_finit_module 344
|
||||
#define __NR_sched_setattr 345
|
||||
#define __NR_sched_getattr 346
|
||||
#define __NR_renameat2 347
|
||||
#define __NR_seccomp 348
|
||||
#define __NR_getrandom 349
|
||||
#define __NR_memfd_create 350
|
||||
#define __NR_bpf 351
|
||||
#define __NR_s390_pci_mmio_write 352
|
||||
#define __NR_s390_pci_mmio_read 353
|
||||
#define __NR_execveat 354
|
||||
#define __NR_userfaultfd 355
|
||||
#define __NR_membarrier 356
|
||||
#define __NR_recvmmsg 357
|
||||
#define __NR_sendmmsg 358
|
||||
#define __NR_socket 359
|
||||
#define __NR_socketpair 360
|
||||
#define __NR_bind 361
|
||||
#define __NR_connect 362
|
||||
#define __NR_listen 363
|
||||
#define __NR_accept4 364
|
||||
#define __NR_getsockopt 365
|
||||
#define __NR_setsockopt 366
|
||||
#define __NR_getsockname 367
|
||||
#define __NR_getpeername 368
|
||||
#define __NR_sendto 369
|
||||
#define __NR_sendmsg 370
|
||||
#define __NR_recvfrom 371
|
||||
#define __NR_recvmsg 372
|
||||
#define __NR_shutdown 373
|
||||
#define __NR_mlock2 374
|
||||
#define __NR_copy_file_range 375
|
||||
#define __NR_preadv2 376
|
||||
#define __NR_pwritev2 377
|
||||
#define __NR_s390_guarded_storage 378
|
||||
#define __NR_statx 379
|
||||
#define __NR_s390_sthyi 380
|
||||
#define NR_syscalls 381
|
||||
|
||||
/*
|
||||
* There are some system calls that are not present on 64 bit, some
|
||||
* have a different name although they do the same (e.g. __NR_chown32
|
||||
* is __NR_chown on 64 bit).
|
||||
*/
|
||||
#ifndef __s390x__
|
||||
|
||||
#define __NR_time 13
|
||||
#define __NR_lchown 16
|
||||
#define __NR_setuid 23
|
||||
#define __NR_getuid 24
|
||||
#define __NR_stime 25
|
||||
#define __NR_setgid 46
|
||||
#define __NR_getgid 47
|
||||
#define __NR_geteuid 49
|
||||
#define __NR_getegid 50
|
||||
#define __NR_setreuid 70
|
||||
#define __NR_setregid 71
|
||||
#define __NR_getrlimit 76
|
||||
#define __NR_getgroups 80
|
||||
#define __NR_setgroups 81
|
||||
#define __NR_fchown 95
|
||||
#define __NR_ioperm 101
|
||||
#define __NR_setfsuid 138
|
||||
#define __NR_setfsgid 139
|
||||
#define __NR__llseek 140
|
||||
#define __NR__newselect 142
|
||||
#define __NR_setresuid 164
|
||||
#define __NR_getresuid 165
|
||||
#define __NR_setresgid 170
|
||||
#define __NR_getresgid 171
|
||||
#define __NR_chown 182
|
||||
#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */
|
||||
#define __NR_mmap2 192
|
||||
#define __NR_truncate64 193
|
||||
#define __NR_ftruncate64 194
|
||||
#define __NR_stat64 195
|
||||
#define __NR_lstat64 196
|
||||
#define __NR_fstat64 197
|
||||
#define __NR_lchown32 198
|
||||
#define __NR_getuid32 199
|
||||
#define __NR_getgid32 200
|
||||
#define __NR_geteuid32 201
|
||||
#define __NR_getegid32 202
|
||||
#define __NR_setreuid32 203
|
||||
#define __NR_setregid32 204
|
||||
#define __NR_getgroups32 205
|
||||
#define __NR_setgroups32 206
|
||||
#define __NR_fchown32 207
|
||||
#define __NR_setresuid32 208
|
||||
#define __NR_getresuid32 209
|
||||
#define __NR_setresgid32 210
|
||||
#define __NR_getresgid32 211
|
||||
#define __NR_chown32 212
|
||||
#define __NR_setuid32 213
|
||||
#define __NR_setgid32 214
|
||||
#define __NR_setfsuid32 215
|
||||
#define __NR_setfsgid32 216
|
||||
#define __NR_fcntl64 221
|
||||
#define __NR_sendfile64 223
|
||||
#define __NR_fadvise64_64 264
|
||||
#define __NR_fstatat64 293
|
||||
|
||||
#else
|
||||
|
||||
#define __NR_select 142
|
||||
#define __NR_getrlimit 191 /* SuS compliant getrlimit */
|
||||
#define __NR_lchown 198
|
||||
#define __NR_getuid 199
|
||||
#define __NR_getgid 200
|
||||
#define __NR_geteuid 201
|
||||
#define __NR_getegid 202
|
||||
#define __NR_setreuid 203
|
||||
#define __NR_setregid 204
|
||||
#define __NR_getgroups 205
|
||||
#define __NR_setgroups 206
|
||||
#define __NR_fchown 207
|
||||
#define __NR_setresuid 208
|
||||
#define __NR_getresuid 209
|
||||
#define __NR_setresgid 210
|
||||
#define __NR_getresgid 211
|
||||
#define __NR_chown 212
|
||||
#define __NR_setuid 213
|
||||
#define __NR_setgid 214
|
||||
#define __NR_setfsuid 215
|
||||
#define __NR_setfsgid 216
|
||||
#define __NR_newfstatat 293
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _UAPI_ASM_S390_UNISTD_H_ */
|
118
tools/arch/sparc/include/uapi/asm/errno.h
Normal file
118
tools/arch/sparc/include/uapi/asm/errno.h
Normal file
@ -0,0 +1,118 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _SPARC_ERRNO_H
|
||||
#define _SPARC_ERRNO_H
|
||||
|
||||
/* These match the SunOS error numbering scheme. */
|
||||
|
||||
#include <asm-generic/errno-base.h>
|
||||
|
||||
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
||||
#define EINPROGRESS 36 /* Operation now in progress */
|
||||
#define EALREADY 37 /* Operation already in progress */
|
||||
#define ENOTSOCK 38 /* Socket operation on non-socket */
|
||||
#define EDESTADDRREQ 39 /* Destination address required */
|
||||
#define EMSGSIZE 40 /* Message too long */
|
||||
#define EPROTOTYPE 41 /* Protocol wrong type for socket */
|
||||
#define ENOPROTOOPT 42 /* Protocol not available */
|
||||
#define EPROTONOSUPPORT 43 /* Protocol not supported */
|
||||
#define ESOCKTNOSUPPORT 44 /* Socket type not supported */
|
||||
#define EOPNOTSUPP 45 /* Op not supported on transport endpoint */
|
||||
#define EPFNOSUPPORT 46 /* Protocol family not supported */
|
||||
#define EAFNOSUPPORT 47 /* Address family not supported by protocol */
|
||||
#define EADDRINUSE 48 /* Address already in use */
|
||||
#define EADDRNOTAVAIL 49 /* Cannot assign requested address */
|
||||
#define ENETDOWN 50 /* Network is down */
|
||||
#define ENETUNREACH 51 /* Network is unreachable */
|
||||
#define ENETRESET 52 /* Net dropped connection because of reset */
|
||||
#define ECONNABORTED 53 /* Software caused connection abort */
|
||||
#define ECONNRESET 54 /* Connection reset by peer */
|
||||
#define ENOBUFS 55 /* No buffer space available */
|
||||
#define EISCONN 56 /* Transport endpoint is already connected */
|
||||
#define ENOTCONN 57 /* Transport endpoint is not connected */
|
||||
#define ESHUTDOWN 58 /* No send after transport endpoint shutdown */
|
||||
#define ETOOMANYREFS 59 /* Too many references: cannot splice */
|
||||
#define ETIMEDOUT 60 /* Connection timed out */
|
||||
#define ECONNREFUSED 61 /* Connection refused */
|
||||
#define ELOOP 62 /* Too many symbolic links encountered */
|
||||
#define ENAMETOOLONG 63 /* File name too long */
|
||||
#define EHOSTDOWN 64 /* Host is down */
|
||||
#define EHOSTUNREACH 65 /* No route to host */
|
||||
#define ENOTEMPTY 66 /* Directory not empty */
|
||||
#define EPROCLIM 67 /* SUNOS: Too many processes */
|
||||
#define EUSERS 68 /* Too many users */
|
||||
#define EDQUOT 69 /* Quota exceeded */
|
||||
#define ESTALE 70 /* Stale file handle */
|
||||
#define EREMOTE 71 /* Object is remote */
|
||||
#define ENOSTR 72 /* Device not a stream */
|
||||
#define ETIME 73 /* Timer expired */
|
||||
#define ENOSR 74 /* Out of streams resources */
|
||||
#define ENOMSG 75 /* No message of desired type */
|
||||
#define EBADMSG 76 /* Not a data message */
|
||||
#define EIDRM 77 /* Identifier removed */
|
||||
#define EDEADLK 78 /* Resource deadlock would occur */
|
||||
#define ENOLCK 79 /* No record locks available */
|
||||
#define ENONET 80 /* Machine is not on the network */
|
||||
#define ERREMOTE 81 /* SunOS: Too many lvls of remote in path */
|
||||
#define ENOLINK 82 /* Link has been severed */
|
||||
#define EADV 83 /* Advertise error */
|
||||
#define ESRMNT 84 /* Srmount error */
|
||||
#define ECOMM 85 /* Communication error on send */
|
||||
#define EPROTO 86 /* Protocol error */
|
||||
#define EMULTIHOP 87 /* Multihop attempted */
|
||||
#define EDOTDOT 88 /* RFS specific error */
|
||||
#define EREMCHG 89 /* Remote address changed */
|
||||
#define ENOSYS 90 /* Function not implemented */
|
||||
|
||||
/* The rest have no SunOS equivalent. */
|
||||
#define ESTRPIPE 91 /* Streams pipe error */
|
||||
#define EOVERFLOW 92 /* Value too large for defined data type */
|
||||
#define EBADFD 93 /* File descriptor in bad state */
|
||||
#define ECHRNG 94 /* Channel number out of range */
|
||||
#define EL2NSYNC 95 /* Level 2 not synchronized */
|
||||
#define EL3HLT 96 /* Level 3 halted */
|
||||
#define EL3RST 97 /* Level 3 reset */
|
||||
#define ELNRNG 98 /* Link number out of range */
|
||||
#define EUNATCH 99 /* Protocol driver not attached */
|
||||
#define ENOCSI 100 /* No CSI structure available */
|
||||
#define EL2HLT 101 /* Level 2 halted */
|
||||
#define EBADE 102 /* Invalid exchange */
|
||||
#define EBADR 103 /* Invalid request descriptor */
|
||||
#define EXFULL 104 /* Exchange full */
|
||||
#define ENOANO 105 /* No anode */
|
||||
#define EBADRQC 106 /* Invalid request code */
|
||||
#define EBADSLT 107 /* Invalid slot */
|
||||
#define EDEADLOCK 108 /* File locking deadlock error */
|
||||
#define EBFONT 109 /* Bad font file format */
|
||||
#define ELIBEXEC 110 /* Cannot exec a shared library directly */
|
||||
#define ENODATA 111 /* No data available */
|
||||
#define ELIBBAD 112 /* Accessing a corrupted shared library */
|
||||
#define ENOPKG 113 /* Package not installed */
|
||||
#define ELIBACC 114 /* Can not access a needed shared library */
|
||||
#define ENOTUNIQ 115 /* Name not unique on network */
|
||||
#define ERESTART 116 /* Interrupted syscall should be restarted */
|
||||
#define EUCLEAN 117 /* Structure needs cleaning */
|
||||
#define ENOTNAM 118 /* Not a XENIX named type file */
|
||||
#define ENAVAIL 119 /* No XENIX semaphores available */
|
||||
#define EISNAM 120 /* Is a named type file */
|
||||
#define EREMOTEIO 121 /* Remote I/O error */
|
||||
#define EILSEQ 122 /* Illegal byte sequence */
|
||||
#define ELIBMAX 123 /* Atmpt to link in too many shared libs */
|
||||
#define ELIBSCN 124 /* .lib section in a.out corrupted */
|
||||
|
||||
#define ENOMEDIUM 125 /* No medium found */
|
||||
#define EMEDIUMTYPE 126 /* Wrong medium type */
|
||||
#define ECANCELED 127 /* Operation Cancelled */
|
||||
#define ENOKEY 128 /* Required key not available */
|
||||
#define EKEYEXPIRED 129 /* Key has expired */
|
||||
#define EKEYREVOKED 130 /* Key has been revoked */
|
||||
#define EKEYREJECTED 131 /* Key was rejected by service */
|
||||
|
||||
/* for robust mutexes */
|
||||
#define EOWNERDEAD 132 /* Owner died */
|
||||
#define ENOTRECOVERABLE 133 /* State not recoverable */
|
||||
|
||||
#define ERFKILL 134 /* Operation not possible due to RF-kill */
|
||||
|
||||
#define EHWPOISON 135 /* Memory page has hardware error */
|
||||
|
||||
#endif
|
@ -197,11 +197,12 @@
|
||||
#define X86_FEATURE_CAT_L3 ( 7*32+ 4) /* Cache Allocation Technology L3 */
|
||||
#define X86_FEATURE_CAT_L2 ( 7*32+ 5) /* Cache Allocation Technology L2 */
|
||||
#define X86_FEATURE_CDP_L3 ( 7*32+ 6) /* Code and Data Prioritization L3 */
|
||||
#define X86_FEATURE_INVPCID_SINGLE ( 7*32+ 7) /* Effectively INVPCID && CR4.PCIDE=1 */
|
||||
|
||||
#define X86_FEATURE_HW_PSTATE ( 7*32+ 8) /* AMD HW-PState */
|
||||
#define X86_FEATURE_PROC_FEEDBACK ( 7*32+ 9) /* AMD ProcFeedbackInterface */
|
||||
#define X86_FEATURE_SME ( 7*32+10) /* AMD Secure Memory Encryption */
|
||||
|
||||
#define X86_FEATURE_PTI ( 7*32+11) /* Kernel Page Table Isolation enabled */
|
||||
#define X86_FEATURE_INTEL_PPIN ( 7*32+14) /* Intel Processor Inventory Number */
|
||||
#define X86_FEATURE_INTEL_PT ( 7*32+15) /* Intel Processor Trace */
|
||||
#define X86_FEATURE_AVX512_4VNNIW ( 7*32+16) /* AVX-512 Neural Network Instructions */
|
||||
@ -340,5 +341,6 @@
|
||||
#define X86_BUG_SWAPGS_FENCE X86_BUG(11) /* SWAPGS without input dep on GS */
|
||||
#define X86_BUG_MONITOR X86_BUG(12) /* IPI required to wake up remote CPU */
|
||||
#define X86_BUG_AMD_E400 X86_BUG(13) /* CPU is among the affected by Erratum 400 */
|
||||
#define X86_BUG_CPU_MELTDOWN X86_BUG(14) /* CPU is affected by meltdown attack and needs kernel page table isolation */
|
||||
|
||||
#endif /* _ASM_X86_CPUFEATURES_H */
|
||||
|
@ -50,6 +50,12 @@
|
||||
# define DISABLE_LA57 (1<<(X86_FEATURE_LA57 & 31))
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PAGE_TABLE_ISOLATION
|
||||
# define DISABLE_PTI 0
|
||||
#else
|
||||
# define DISABLE_PTI (1 << (X86_FEATURE_PTI & 31))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Make sure to add features to the correct mask
|
||||
*/
|
||||
@ -60,7 +66,7 @@
|
||||
#define DISABLED_MASK4 (DISABLE_PCID)
|
||||
#define DISABLED_MASK5 0
|
||||
#define DISABLED_MASK6 0
|
||||
#define DISABLED_MASK7 0
|
||||
#define DISABLED_MASK7 (DISABLE_PTI)
|
||||
#define DISABLED_MASK8 0
|
||||
#define DISABLED_MASK9 (DISABLE_MPX)
|
||||
#define DISABLED_MASK10 0
|
||||
|
1
tools/arch/x86/include/uapi/asm/errno.h
Normal file
1
tools/arch/x86/include/uapi/asm/errno.h
Normal file
@ -0,0 +1 @@
|
||||
#include <asm-generic/errno.h>
|
@ -56,6 +56,7 @@ FEATURE_TESTS_BASIC := \
|
||||
libunwind-arm \
|
||||
libunwind-aarch64 \
|
||||
pthread-attr-setaffinity-np \
|
||||
pthread-barrier \
|
||||
stackprotector-all \
|
||||
timerfd \
|
||||
libdw-dwarf-unwind \
|
||||
@ -65,7 +66,8 @@ FEATURE_TESTS_BASIC := \
|
||||
bpf \
|
||||
sched_getcpu \
|
||||
sdt \
|
||||
setns
|
||||
setns \
|
||||
libopencsd
|
||||
|
||||
# FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
|
||||
# of all feature tests
|
||||
|
@ -37,6 +37,7 @@ FILES= \
|
||||
test-libunwind-debug-frame-arm.bin \
|
||||
test-libunwind-debug-frame-aarch64.bin \
|
||||
test-pthread-attr-setaffinity-np.bin \
|
||||
test-pthread-barrier.bin \
|
||||
test-stackprotector-all.bin \
|
||||
test-timerfd.bin \
|
||||
test-libdw-dwarf-unwind.bin \
|
||||
@ -51,7 +52,8 @@ FILES= \
|
||||
test-cxx.bin \
|
||||
test-jvmti.bin \
|
||||
test-sched_getcpu.bin \
|
||||
test-setns.bin
|
||||
test-setns.bin \
|
||||
test-libopencsd.bin
|
||||
|
||||
FILES := $(addprefix $(OUTPUT),$(FILES))
|
||||
|
||||
@ -79,6 +81,9 @@ $(OUTPUT)test-hello.bin:
|
||||
$(OUTPUT)test-pthread-attr-setaffinity-np.bin:
|
||||
$(BUILD) -D_GNU_SOURCE -lpthread
|
||||
|
||||
$(OUTPUT)test-pthread-barrier.bin:
|
||||
$(BUILD) -lpthread
|
||||
|
||||
$(OUTPUT)test-stackprotector-all.bin:
|
||||
$(BUILD) -fstack-protector-all
|
||||
|
||||
@ -100,6 +105,10 @@ $(OUTPUT)test-sched_getcpu.bin:
|
||||
$(OUTPUT)test-setns.bin:
|
||||
$(BUILD)
|
||||
|
||||
$(OUTPUT)test-libopencsd.bin:
|
||||
$(BUILD) # -lopencsd_c_api -lopencsd provided by
|
||||
# $(FEATURE_CHECK_LDFLAGS-libopencsd)
|
||||
|
||||
DWARFLIBS := -ldw
|
||||
ifeq ($(findstring -static,${LDFLAGS}),-static)
|
||||
DWARFLIBS += -lelf -lebl -lz -llzma -lbz2
|
||||
|
@ -118,6 +118,10 @@
|
||||
# include "test-pthread-attr-setaffinity-np.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_pthread_barrier
|
||||
# include "test-pthread-barrier.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_sched_getcpu
|
||||
# include "test-sched_getcpu.c"
|
||||
#undef main
|
||||
@ -158,6 +162,10 @@
|
||||
# include "test-setns.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_libopencsd
|
||||
# include "test-libopencsd.c"
|
||||
#undef main
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
main_test_libpython();
|
||||
@ -187,6 +195,7 @@ int main(int argc, char *argv[])
|
||||
main_test_sync_compare_and_swap(argc, argv);
|
||||
main_test_zlib();
|
||||
main_test_pthread_attr_setaffinity_np();
|
||||
main_test_pthread_barrier();
|
||||
main_test_lzma();
|
||||
main_test_get_cpuid();
|
||||
main_test_bpf();
|
||||
@ -194,6 +203,7 @@ int main(int argc, char *argv[])
|
||||
main_test_sched_getcpu();
|
||||
main_test_sdt();
|
||||
main_test_setns();
|
||||
main_test_libopencsd();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
8
tools/build/feature/test-libopencsd.c
Normal file
8
tools/build/feature/test-libopencsd.c
Normal file
@ -0,0 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <opencsd/c_api/opencsd_c_api.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
(void)ocsd_get_version();
|
||||
return 0;
|
||||
}
|
12
tools/build/feature/test-pthread-barrier.c
Normal file
12
tools/build/feature/test-pthread-barrier.c
Normal file
@ -0,0 +1,12 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <stdint.h>
|
||||
#include <pthread.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
pthread_barrier_t barrier;
|
||||
|
||||
pthread_barrier_init(&barrier, NULL, 1);
|
||||
pthread_barrier_wait(&barrier);
|
||||
return pthread_barrier_destroy(&barrier);
|
||||
}
|
40
tools/include/uapi/asm-generic/errno-base.h
Normal file
40
tools/include/uapi/asm-generic/errno-base.h
Normal file
@ -0,0 +1,40 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_GENERIC_ERRNO_BASE_H
|
||||
#define _ASM_GENERIC_ERRNO_BASE_H
|
||||
|
||||
#define EPERM 1 /* Operation not permitted */
|
||||
#define ENOENT 2 /* No such file or directory */
|
||||
#define ESRCH 3 /* No such process */
|
||||
#define EINTR 4 /* Interrupted system call */
|
||||
#define EIO 5 /* I/O error */
|
||||
#define ENXIO 6 /* No such device or address */
|
||||
#define E2BIG 7 /* Argument list too long */
|
||||
#define ENOEXEC 8 /* Exec format error */
|
||||
#define EBADF 9 /* Bad file number */
|
||||
#define ECHILD 10 /* No child processes */
|
||||
#define EAGAIN 11 /* Try again */
|
||||
#define ENOMEM 12 /* Out of memory */
|
||||
#define EACCES 13 /* Permission denied */
|
||||
#define EFAULT 14 /* Bad address */
|
||||
#define ENOTBLK 15 /* Block device required */
|
||||
#define EBUSY 16 /* Device or resource busy */
|
||||
#define EEXIST 17 /* File exists */
|
||||
#define EXDEV 18 /* Cross-device link */
|
||||
#define ENODEV 19 /* No such device */
|
||||
#define ENOTDIR 20 /* Not a directory */
|
||||
#define EISDIR 21 /* Is a directory */
|
||||
#define EINVAL 22 /* Invalid argument */
|
||||
#define ENFILE 23 /* File table overflow */
|
||||
#define EMFILE 24 /* Too many open files */
|
||||
#define ENOTTY 25 /* Not a typewriter */
|
||||
#define ETXTBSY 26 /* Text file busy */
|
||||
#define EFBIG 27 /* File too large */
|
||||
#define ENOSPC 28 /* No space left on device */
|
||||
#define ESPIPE 29 /* Illegal seek */
|
||||
#define EROFS 30 /* Read-only file system */
|
||||
#define EMLINK 31 /* Too many links */
|
||||
#define EPIPE 32 /* Broken pipe */
|
||||
#define EDOM 33 /* Math argument out of domain of func */
|
||||
#define ERANGE 34 /* Math result not representable */
|
||||
|
||||
#endif
|
123
tools/include/uapi/asm-generic/errno.h
Normal file
123
tools/include/uapi/asm-generic/errno.h
Normal file
@ -0,0 +1,123 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_GENERIC_ERRNO_H
|
||||
#define _ASM_GENERIC_ERRNO_H
|
||||
|
||||
#include <asm-generic/errno-base.h>
|
||||
|
||||
#define EDEADLK 35 /* Resource deadlock would occur */
|
||||
#define ENAMETOOLONG 36 /* File name too long */
|
||||
#define ENOLCK 37 /* No record locks available */
|
||||
|
||||
/*
|
||||
* This error code is special: arch syscall entry code will return
|
||||
* -ENOSYS if users try to call a syscall that doesn't exist. To keep
|
||||
* failures of syscalls that really do exist distinguishable from
|
||||
* failures due to attempts to use a nonexistent syscall, syscall
|
||||
* implementations should refrain from returning -ENOSYS.
|
||||
*/
|
||||
#define ENOSYS 38 /* Invalid system call number */
|
||||
|
||||
#define ENOTEMPTY 39 /* Directory not empty */
|
||||
#define ELOOP 40 /* Too many symbolic links encountered */
|
||||
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
||||
#define ENOMSG 42 /* No message of desired type */
|
||||
#define EIDRM 43 /* Identifier removed */
|
||||
#define ECHRNG 44 /* Channel number out of range */
|
||||
#define EL2NSYNC 45 /* Level 2 not synchronized */
|
||||
#define EL3HLT 46 /* Level 3 halted */
|
||||
#define EL3RST 47 /* Level 3 reset */
|
||||
#define ELNRNG 48 /* Link number out of range */
|
||||
#define EUNATCH 49 /* Protocol driver not attached */
|
||||
#define ENOCSI 50 /* No CSI structure available */
|
||||
#define EL2HLT 51 /* Level 2 halted */
|
||||
#define EBADE 52 /* Invalid exchange */
|
||||
#define EBADR 53 /* Invalid request descriptor */
|
||||
#define EXFULL 54 /* Exchange full */
|
||||
#define ENOANO 55 /* No anode */
|
||||
#define EBADRQC 56 /* Invalid request code */
|
||||
#define EBADSLT 57 /* Invalid slot */
|
||||
|
||||
#define EDEADLOCK EDEADLK
|
||||
|
||||
#define EBFONT 59 /* Bad font file format */
|
||||
#define ENOSTR 60 /* Device not a stream */
|
||||
#define ENODATA 61 /* No data available */
|
||||
#define ETIME 62 /* Timer expired */
|
||||
#define ENOSR 63 /* Out of streams resources */
|
||||
#define ENONET 64 /* Machine is not on the network */
|
||||
#define ENOPKG 65 /* Package not installed */
|
||||
#define EREMOTE 66 /* Object is remote */
|
||||
#define ENOLINK 67 /* Link has been severed */
|
||||
#define EADV 68 /* Advertise error */
|
||||
#define ESRMNT 69 /* Srmount error */
|
||||
#define ECOMM 70 /* Communication error on send */
|
||||
#define EPROTO 71 /* Protocol error */
|
||||
#define EMULTIHOP 72 /* Multihop attempted */
|
||||
#define EDOTDOT 73 /* RFS specific error */
|
||||
#define EBADMSG 74 /* Not a data message */
|
||||
#define EOVERFLOW 75 /* Value too large for defined data type */
|
||||
#define ENOTUNIQ 76 /* Name not unique on network */
|
||||
#define EBADFD 77 /* File descriptor in bad state */
|
||||
#define EREMCHG 78 /* Remote address changed */
|
||||
#define ELIBACC 79 /* Can not access a needed shared library */
|
||||
#define ELIBBAD 80 /* Accessing a corrupted shared library */
|
||||
#define ELIBSCN 81 /* .lib section in a.out corrupted */
|
||||
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
|
||||
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
|
||||
#define EILSEQ 84 /* Illegal byte sequence */
|
||||
#define ERESTART 85 /* Interrupted system call should be restarted */
|
||||
#define ESTRPIPE 86 /* Streams pipe error */
|
||||
#define EUSERS 87 /* Too many users */
|
||||
#define ENOTSOCK 88 /* Socket operation on non-socket */
|
||||
#define EDESTADDRREQ 89 /* Destination address required */
|
||||
#define EMSGSIZE 90 /* Message too long */
|
||||
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
|
||||
#define ENOPROTOOPT 92 /* Protocol not available */
|
||||
#define EPROTONOSUPPORT 93 /* Protocol not supported */
|
||||
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
|
||||
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
|
||||
#define EPFNOSUPPORT 96 /* Protocol family not supported */
|
||||
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
|
||||
#define EADDRINUSE 98 /* Address already in use */
|
||||
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
|
||||
#define ENETDOWN 100 /* Network is down */
|
||||
#define ENETUNREACH 101 /* Network is unreachable */
|
||||
#define ENETRESET 102 /* Network dropped connection because of reset */
|
||||
#define ECONNABORTED 103 /* Software caused connection abort */
|
||||
#define ECONNRESET 104 /* Connection reset by peer */
|
||||
#define ENOBUFS 105 /* No buffer space available */
|
||||
#define EISCONN 106 /* Transport endpoint is already connected */
|
||||
#define ENOTCONN 107 /* Transport endpoint is not connected */
|
||||
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
|
||||
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
|
||||
#define ETIMEDOUT 110 /* Connection timed out */
|
||||
#define ECONNREFUSED 111 /* Connection refused */
|
||||
#define EHOSTDOWN 112 /* Host is down */
|
||||
#define EHOSTUNREACH 113 /* No route to host */
|
||||
#define EALREADY 114 /* Operation already in progress */
|
||||
#define EINPROGRESS 115 /* Operation now in progress */
|
||||
#define ESTALE 116 /* Stale file handle */
|
||||
#define EUCLEAN 117 /* Structure needs cleaning */
|
||||
#define ENOTNAM 118 /* Not a XENIX named type file */
|
||||
#define ENAVAIL 119 /* No XENIX semaphores available */
|
||||
#define EISNAM 120 /* Is a named type file */
|
||||
#define EREMOTEIO 121 /* Remote I/O error */
|
||||
#define EDQUOT 122 /* Quota exceeded */
|
||||
|
||||
#define ENOMEDIUM 123 /* No medium found */
|
||||
#define EMEDIUMTYPE 124 /* Wrong medium type */
|
||||
#define ECANCELED 125 /* Operation Canceled */
|
||||
#define ENOKEY 126 /* Required key not available */
|
||||
#define EKEYEXPIRED 127 /* Key has expired */
|
||||
#define EKEYREVOKED 128 /* Key has been revoked */
|
||||
#define EKEYREJECTED 129 /* Key was rejected by service */
|
||||
|
||||
/* for robust mutexes */
|
||||
#define EOWNERDEAD 130 /* Owner died */
|
||||
#define ENOTRECOVERABLE 131 /* State not recoverable */
|
||||
|
||||
#define ERFKILL 132 /* Operation not possible due to RF-kill */
|
||||
|
||||
#define EHWPOISON 133 /* Memory page has hardware error */
|
||||
|
||||
#endif
|
@ -612,9 +612,12 @@ struct perf_event_mmap_page {
|
||||
*/
|
||||
#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12)
|
||||
/*
|
||||
* PERF_RECORD_MISC_MMAP_DATA and PERF_RECORD_MISC_COMM_EXEC are used on
|
||||
* different events so can reuse the same bit position.
|
||||
* Ditto PERF_RECORD_MISC_SWITCH_OUT.
|
||||
* Following PERF_RECORD_MISC_* are used on different
|
||||
* events, so can reuse the same bit position:
|
||||
*
|
||||
* PERF_RECORD_MISC_MMAP_DATA - PERF_RECORD_MMAP* events
|
||||
* PERF_RECORD_MISC_COMM_EXEC - PERF_RECORD_COMM event
|
||||
* PERF_RECORD_MISC_SWITCH_OUT - PERF_RECORD_SWITCH* events
|
||||
*/
|
||||
#define PERF_RECORD_MISC_MMAP_DATA (1 << 13)
|
||||
#define PERF_RECORD_MISC_COMM_EXEC (1 << 13)
|
||||
@ -864,6 +867,7 @@ enum perf_event_type {
|
||||
* struct perf_event_header header;
|
||||
* u32 pid;
|
||||
* u32 tid;
|
||||
* struct sample_id sample_id;
|
||||
* };
|
||||
*/
|
||||
PERF_RECORD_ITRACE_START = 12,
|
||||
|
@ -1094,7 +1094,7 @@ static enum event_type __read_token(char **tok)
|
||||
if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
|
||||
free(*tok);
|
||||
*tok = NULL;
|
||||
return force_token("\"\%s\" ", tok);
|
||||
return force_token("\"%s\" ", tok);
|
||||
} else if (strcmp(*tok, "STA_PR_FMT") == 0) {
|
||||
free(*tok);
|
||||
*tok = NULL;
|
||||
@ -3970,6 +3970,11 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
||||
val &= ~fval;
|
||||
}
|
||||
}
|
||||
if (val) {
|
||||
if (print && arg->flags.delim)
|
||||
trace_seq_puts(s, arg->flags.delim);
|
||||
trace_seq_printf(s, "0x%llx", val);
|
||||
}
|
||||
break;
|
||||
case PRINT_SYMBOL:
|
||||
val = eval_num_arg(data, size, event, arg->symbol.field);
|
||||
@ -3980,6 +3985,8 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!flag)
|
||||
trace_seq_printf(s, "0x%llx", val);
|
||||
break;
|
||||
case PRINT_HEX:
|
||||
case PRINT_HEX_STR:
|
||||
@ -4293,6 +4300,26 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
|
||||
goto process_again;
|
||||
case 'p':
|
||||
ls = 1;
|
||||
if (isalnum(ptr[1])) {
|
||||
ptr++;
|
||||
/* Check for special pointers */
|
||||
switch (*ptr) {
|
||||
case 's':
|
||||
case 'S':
|
||||
case 'f':
|
||||
case 'F':
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* Older kernels do not process
|
||||
* dereferenced pointers.
|
||||
* Only process if the pointer
|
||||
* value is a printable.
|
||||
*/
|
||||
if (isprint(*(char *)bptr))
|
||||
goto process_string;
|
||||
}
|
||||
}
|
||||
/* fall through */
|
||||
case 'd':
|
||||
case 'u':
|
||||
@ -4345,6 +4372,7 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
|
||||
|
||||
break;
|
||||
case 's':
|
||||
process_string:
|
||||
arg = alloc_arg();
|
||||
if (!arg) {
|
||||
do_warning_event(event, "%s(%d): not enough memory!",
|
||||
@ -4949,21 +4977,27 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
|
||||
else
|
||||
ls = 2;
|
||||
|
||||
if (*(ptr+1) == 'F' || *(ptr+1) == 'f' ||
|
||||
*(ptr+1) == 'S' || *(ptr+1) == 's') {
|
||||
if (isalnum(ptr[1]))
|
||||
ptr++;
|
||||
|
||||
if (arg->type == PRINT_BSTRING) {
|
||||
trace_seq_puts(s, arg->string.string);
|
||||
break;
|
||||
}
|
||||
|
||||
if (*ptr == 'F' || *ptr == 'f' ||
|
||||
*ptr == 'S' || *ptr == 's') {
|
||||
show_func = *ptr;
|
||||
} else if (*(ptr+1) == 'M' || *(ptr+1) == 'm') {
|
||||
print_mac_arg(s, *(ptr+1), data, size, event, arg);
|
||||
ptr++;
|
||||
} else if (*ptr == 'M' || *ptr == 'm') {
|
||||
print_mac_arg(s, *ptr, data, size, event, arg);
|
||||
arg = arg->next;
|
||||
break;
|
||||
} else if (*(ptr+1) == 'I' || *(ptr+1) == 'i') {
|
||||
} else if (*ptr == 'I' || *ptr == 'i') {
|
||||
int n;
|
||||
|
||||
n = print_ip_arg(s, ptr+1, data, size, event, arg);
|
||||
n = print_ip_arg(s, ptr, data, size, event, arg);
|
||||
if (n > 0) {
|
||||
ptr += n;
|
||||
ptr += n - 1;
|
||||
arg = arg->next;
|
||||
break;
|
||||
}
|
||||
@ -5532,8 +5566,14 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
|
||||
|
||||
event = pevent_find_event_by_record(pevent, record);
|
||||
if (!event) {
|
||||
do_warning("ug! no event found for type %d",
|
||||
trace_parse_common_type(pevent, record->data));
|
||||
int i;
|
||||
int type = trace_parse_common_type(pevent, record->data);
|
||||
|
||||
do_warning("ug! no event found for type %d", type);
|
||||
trace_seq_printf(s, "[UNKNOWN TYPE %d]", type);
|
||||
for (i = 0; i < record->size; i++)
|
||||
trace_seq_printf(s, " %02x",
|
||||
((unsigned char *)record->data)[i]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -120,12 +120,12 @@ char **traceevent_plugin_list_options(void)
|
||||
for (op = reg->options; op->name; op++) {
|
||||
char *alias = op->plugin_alias ? op->plugin_alias : op->file;
|
||||
char **temp = list;
|
||||
int ret;
|
||||
|
||||
name = malloc(strlen(op->name) + strlen(alias) + 2);
|
||||
if (!name)
|
||||
ret = asprintf(&name, "%s:%s", alias, op->name);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
sprintf(name, "%s:%s", alias, op->name);
|
||||
list = realloc(list, count + 2);
|
||||
if (!list) {
|
||||
list = temp;
|
||||
@ -290,17 +290,14 @@ load_plugin(struct pevent *pevent, const char *path,
|
||||
const char *alias;
|
||||
char *plugin;
|
||||
void *handle;
|
||||
int ret;
|
||||
|
||||
plugin = malloc(strlen(path) + strlen(file) + 2);
|
||||
if (!plugin) {
|
||||
ret = asprintf(&plugin, "%s/%s", path, file);
|
||||
if (ret < 0) {
|
||||
warning("could not allocate plugin memory\n");
|
||||
return;
|
||||
}
|
||||
|
||||
strcpy(plugin, path);
|
||||
strcat(plugin, "/");
|
||||
strcat(plugin, file);
|
||||
|
||||
handle = dlopen(plugin, RTLD_NOW | RTLD_GLOBAL);
|
||||
if (!handle) {
|
||||
warning("could not load plugin '%s'\n%s\n",
|
||||
@ -391,6 +388,7 @@ load_plugins(struct pevent *pevent, const char *suffix,
|
||||
char *home;
|
||||
char *path;
|
||||
char *envdir;
|
||||
int ret;
|
||||
|
||||
if (pevent->flags & PEVENT_DISABLE_PLUGINS)
|
||||
return;
|
||||
@ -421,16 +419,12 @@ load_plugins(struct pevent *pevent, const char *suffix,
|
||||
if (!home)
|
||||
return;
|
||||
|
||||
path = malloc(strlen(home) + strlen(LOCAL_PLUGIN_DIR) + 2);
|
||||
if (!path) {
|
||||
ret = asprintf(&path, "%s/%s", home, LOCAL_PLUGIN_DIR);
|
||||
if (ret < 0) {
|
||||
warning("could not allocate plugin memory\n");
|
||||
return;
|
||||
}
|
||||
|
||||
strcpy(path, home);
|
||||
strcat(path, "/");
|
||||
strcat(path, LOCAL_PLUGIN_DIR);
|
||||
|
||||
load_plugins_dir(pevent, suffix, path, load_plugin, data);
|
||||
|
||||
free(path);
|
||||
|
@ -24,8 +24,8 @@
|
||||
|
||||
#include "kbuffer.h"
|
||||
|
||||
#define MISSING_EVENTS (1 << 31)
|
||||
#define MISSING_STORED (1 << 30)
|
||||
#define MISSING_EVENTS (1UL << 31)
|
||||
#define MISSING_STORED (1UL << 30)
|
||||
|
||||
#define COMMIT_MASK ((1 << 27) - 1)
|
||||
|
||||
|
@ -287,12 +287,10 @@ find_event(struct pevent *pevent, struct event_list **events,
|
||||
sys_name = NULL;
|
||||
}
|
||||
|
||||
reg = malloc(strlen(event_name) + 3);
|
||||
if (reg == NULL)
|
||||
ret = asprintf(®, "^%s$", event_name);
|
||||
if (ret < 0)
|
||||
return PEVENT_ERRNO__MEM_ALLOC_FAILED;
|
||||
|
||||
sprintf(reg, "^%s$", event_name);
|
||||
|
||||
ret = regcomp(&ereg, reg, REG_ICASE|REG_NOSUB);
|
||||
free(reg);
|
||||
|
||||
@ -300,13 +298,12 @@ find_event(struct pevent *pevent, struct event_list **events,
|
||||
return PEVENT_ERRNO__INVALID_EVENT_NAME;
|
||||
|
||||
if (sys_name) {
|
||||
reg = malloc(strlen(sys_name) + 3);
|
||||
if (reg == NULL) {
|
||||
ret = asprintf(®, "^%s$", sys_name);
|
||||
if (ret < 0) {
|
||||
regfree(&ereg);
|
||||
return PEVENT_ERRNO__MEM_ALLOC_FAILED;
|
||||
}
|
||||
|
||||
sprintf(reg, "^%s$", sys_name);
|
||||
ret = regcomp(&sreg, reg, REG_ICASE|REG_NOSUB);
|
||||
free(reg);
|
||||
if (ret) {
|
||||
@ -1634,6 +1631,7 @@ int pevent_filter_clear_trivial(struct event_filter *filter,
|
||||
case FILTER_TRIVIAL_FALSE:
|
||||
if (filter_type->filter->boolean.value)
|
||||
continue;
|
||||
break;
|
||||
case FILTER_TRIVIAL_TRUE:
|
||||
if (!filter_type->filter->boolean.value)
|
||||
continue;
|
||||
@ -1879,17 +1877,25 @@ static const char *get_field_str(struct filter_arg *arg, struct pevent_record *r
|
||||
struct pevent *pevent;
|
||||
unsigned long long addr;
|
||||
const char *val = NULL;
|
||||
unsigned int size;
|
||||
char hex[64];
|
||||
|
||||
/* If the field is not a string convert it */
|
||||
if (arg->str.field->flags & FIELD_IS_STRING) {
|
||||
val = record->data + arg->str.field->offset;
|
||||
size = arg->str.field->size;
|
||||
|
||||
if (arg->str.field->flags & FIELD_IS_DYNAMIC) {
|
||||
addr = *(unsigned int *)val;
|
||||
val = record->data + (addr & 0xffff);
|
||||
size = addr >> 16;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to copy the data since we can't be sure the field
|
||||
* is null terminated.
|
||||
*/
|
||||
if (*(val + arg->str.field->size - 1)) {
|
||||
if (*(val + size - 1)) {
|
||||
/* copy it */
|
||||
memcpy(arg->str.buffer, val, arg->str.field->size);
|
||||
/* the buffer is already NULL terminated */
|
||||
|
@ -25,7 +25,7 @@ perf-y += builtin-data.o
|
||||
perf-y += builtin-version.o
|
||||
perf-y += builtin-c2c.o
|
||||
|
||||
perf-$(CONFIG_AUDIT) += builtin-trace.o
|
||||
perf-$(CONFIG_TRACE) += builtin-trace.o
|
||||
perf-$(CONFIG_LIBELF) += builtin-probe.o
|
||||
|
||||
perf-y += bench/
|
||||
@ -50,6 +50,6 @@ libperf-y += util/
|
||||
libperf-y += arch/
|
||||
libperf-y += ui/
|
||||
libperf-y += scripts/
|
||||
libperf-$(CONFIG_AUDIT) += trace/beauty/
|
||||
libperf-$(CONFIG_TRACE) += trace/beauty/
|
||||
|
||||
gtk-y += ui/gtk/
|
||||
|
@ -24,6 +24,9 @@ OPTIONS
|
||||
-a::
|
||||
--add=::
|
||||
Add specified file to the cache.
|
||||
-f::
|
||||
--force::
|
||||
Don't complain, do it.
|
||||
-k::
|
||||
--kcore::
|
||||
Add specified kcore file to the cache. For the current host that is
|
||||
|
@ -20,6 +20,10 @@ OPTIONS
|
||||
--input=::
|
||||
Input file name. (default: perf.data unless stdin is a fifo)
|
||||
|
||||
-f::
|
||||
--force::
|
||||
Don't complain, do it.
|
||||
|
||||
-F::
|
||||
--freq=::
|
||||
Show just the sample frequency used for each event.
|
||||
|
@ -60,6 +60,10 @@ include::itrace.txt[]
|
||||
found in the jitdumps files captured in the input perf.data file. Use this option
|
||||
if you are monitoring environment using JIT runtimes, such as Java, DART or V8.
|
||||
|
||||
-f::
|
||||
--force::
|
||||
Don't complain, do it.
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkperf:perf-record[1], linkperf:perf-report[1], linkperf:perf-archive[1]
|
||||
|
@ -42,6 +42,10 @@ COMMON OPTIONS
|
||||
--dump-raw-trace::
|
||||
Dump raw trace in ASCII.
|
||||
|
||||
-f::
|
||||
--force::
|
||||
Don't complan, do it.
|
||||
|
||||
REPORT OPTIONS
|
||||
--------------
|
||||
|
||||
|
@ -170,7 +170,7 @@ Probe points are defined by following syntax.
|
||||
or,
|
||||
sdt_PROVIDER:SDTEVENT
|
||||
|
||||
'EVENT' specifies the name of new event, if omitted, it will be set the name of the probed function. You can also specify a group name by 'GROUP', if omitted, set 'probe' is used for kprobe and 'probe_<bin>' is used for uprobe.
|
||||
'EVENT' specifies the name of new event, if omitted, it will be set the name of the probed function, and for return probes, a "\_\_return" suffix is automatically added to the function name. You can also specify a group name by 'GROUP', if omitted, set 'probe' is used for kprobe and 'probe_<bin>' is used for uprobe.
|
||||
Note that using existing group name can conflict with other events. Especially, using the group name reserved for kernel modules can hide embedded events in the
|
||||
modules.
|
||||
'FUNC' specifies a probed function name, and it may have one of the following options; '+OFFS' is the offset from function entry address in bytes, ':RLN' is the relative-line number from function entry line, and '%return' means that it probes function return. And ';PTN' means lazy matching pattern (see LAZY MATCHING). Note that ';PTN' must be the end of the probe point definition. In addition, '@SRC' specifies a source file which has that function.
|
||||
@ -182,6 +182,14 @@ Note that before using the SDT event, the target binary (on which SDT events are
|
||||
For details of the SDT, see below.
|
||||
https://sourceware.org/gdb/onlinedocs/gdb/Static-Probe-Points.html
|
||||
|
||||
ESCAPED CHARACTER
|
||||
-----------------
|
||||
|
||||
In the probe syntax, '=', '@', '+', ':' and ';' are treated as a special character. You can use a backslash ('\') to escape the special characters.
|
||||
This is useful if you need to probe on a specific versioned symbols, like @GLIBC_... suffixes, or also you need to specify a source file which includes the special characters.
|
||||
Note that usually single backslash is consumed by shell, so you might need to pass double backslash (\\) or wrapping with single quotes (\'AAA\@BBB').
|
||||
See EXAMPLES how it is used.
|
||||
|
||||
PROBE ARGUMENT
|
||||
--------------
|
||||
Each probe argument follows below syntax.
|
||||
@ -277,6 +285,14 @@ Add a USDT probe to a target process running in a different mount namespace
|
||||
|
||||
./perf probe --target-ns <target pid> -x /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el7_3.x86_64/jre/lib/amd64/server/libjvm.so %sdt_hotspot:thread__sleep__end
|
||||
|
||||
Add a probe on specific versioned symbol by backslash escape
|
||||
|
||||
./perf probe -x /lib64/libc-2.25.so 'malloc_get_state\@GLIBC_2.2.5'
|
||||
|
||||
Add a probe in a source file using special characters by backslash escape
|
||||
|
||||
./perf probe -x /opt/test/a.out 'foo\+bar.c:4'
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
|
@ -430,6 +430,9 @@ Configure all used events to run in user space.
|
||||
--timestamp-filename
|
||||
Append timestamp to output file name.
|
||||
|
||||
--timestamp-boundary::
|
||||
Record timestamp boundary (time of first/last samples).
|
||||
|
||||
--switch-output[=mode]::
|
||||
Generate multiple perf.data files, timestamp prefixed, switching to a new one
|
||||
based on 'mode' value:
|
||||
|
@ -402,6 +402,26 @@ OPTIONS
|
||||
stop time is not given (i.e, time string is 'x.y,') then analysis goes
|
||||
to end of file.
|
||||
|
||||
Also support time percent with multiple time range. Time string is
|
||||
'a%/n,b%/m,...' or 'a%-b%,c%-%d,...'.
|
||||
|
||||
For example:
|
||||
Select the second 10% time slice:
|
||||
|
||||
perf report --time 10%/2
|
||||
|
||||
Select from 0% to 10% time slice:
|
||||
|
||||
perf report --time 0%-10%
|
||||
|
||||
Select the first and second 10% time slices:
|
||||
|
||||
perf report --time 10%/1,10%/2
|
||||
|
||||
Select from 0% to 10% and 30% to 40% slices:
|
||||
|
||||
perf report --time 0%-10%,30%-40%
|
||||
|
||||
--itrace::
|
||||
Options for decoding instruction tracing data. The options are:
|
||||
|
||||
@ -437,8 +457,23 @@ include::itrace.txt[]
|
||||
will be printed. Each entry is function name or file/line. Enabled by
|
||||
default, disable with --no-inline.
|
||||
|
||||
--mmaps::
|
||||
Show --tasks output plus mmap information in a format similar to
|
||||
/proc/<PID>/maps.
|
||||
|
||||
Please note that not all mmaps are stored, options affecting which ones
|
||||
are include 'perf record --data', for instance.
|
||||
|
||||
--stats::
|
||||
Display overall events statistics without any further processing.
|
||||
(like the one at the end of the perf report -D command)
|
||||
|
||||
--tasks::
|
||||
Display monitored tasks stored in perf data. Displaying pid/tid/ppid
|
||||
plus the command string aligned to distinguish parent and child tasks.
|
||||
|
||||
include::callchain-overhead-calculation.txt[]
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkperf:perf-stat[1], linkperf:perf-annotate[1]
|
||||
linkperf:perf-stat[1], linkperf:perf-annotate[1], linkperf:perf-record[1]
|
||||
|
@ -74,6 +74,10 @@ OPTIONS
|
||||
--dump-raw-trace=::
|
||||
Display verbose dump of the sched data.
|
||||
|
||||
-f::
|
||||
--force::
|
||||
Don't complain, do it.
|
||||
|
||||
OPTIONS for 'perf sched map'
|
||||
----------------------------
|
||||
|
||||
|
@ -117,7 +117,7 @@ OPTIONS
|
||||
Comma separated list of fields to print. Options are:
|
||||
comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff,
|
||||
srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, brstackinsn,
|
||||
brstackoff, callindent, insn, insnlen, synth, phys_addr.
|
||||
brstackoff, callindent, insn, insnlen, synth, phys_addr, metric, misc.
|
||||
Field list can be prepended with the type, trace, sw or hw,
|
||||
to indicate to which event type the field list applies.
|
||||
e.g., -F sw:comm,tid,time,ip,sym and -F trace:time,cpu,trace
|
||||
@ -217,6 +217,32 @@ OPTIONS
|
||||
|
||||
The brstackoff field will print an offset into a specific dso/binary.
|
||||
|
||||
With the metric option perf script can compute metrics for
|
||||
sampling periods, similar to perf stat. This requires
|
||||
specifying a group with multiple metrics with the :S option
|
||||
for perf record. perf will sample on the first event, and
|
||||
compute metrics for all the events in the group. Please note
|
||||
that the metric computed is averaged over the whole sampling
|
||||
period, not just for the sample point.
|
||||
|
||||
For sample events it's possible to display misc field with -F +misc option,
|
||||
following letters are displayed for each bit:
|
||||
|
||||
PERF_RECORD_MISC_KERNEL K
|
||||
PERF_RECORD_MISC_USER U
|
||||
PERF_RECORD_MISC_HYPERVISOR H
|
||||
PERF_RECORD_MISC_GUEST_KERNEL G
|
||||
PERF_RECORD_MISC_GUEST_USER g
|
||||
PERF_RECORD_MISC_MMAP_DATA* M
|
||||
PERF_RECORD_MISC_COMM_EXEC E
|
||||
PERF_RECORD_MISC_SWITCH_OUT S
|
||||
|
||||
$ perf script -F +misc ...
|
||||
sched-messaging 1414 K 28690.636582: 4590 cycles ...
|
||||
sched-messaging 1407 U 28690.636600: 325620 cycles ...
|
||||
sched-messaging 1414 K 28690.636608: 19473 cycles ...
|
||||
misc field ___________/
|
||||
|
||||
-k::
|
||||
--vmlinux=<file>::
|
||||
vmlinux pathname
|
||||
@ -274,6 +300,9 @@ OPTIONS
|
||||
Display context switch events i.e. events of type PERF_RECORD_SWITCH or
|
||||
PERF_RECORD_SWITCH_CPU_WIDE.
|
||||
|
||||
--show-lost-events
|
||||
Display lost events i.e. events of type PERF_RECORD_LOST.
|
||||
|
||||
--demangle::
|
||||
Demangle symbol names to human readable form. It's enabled by default,
|
||||
disable with --no-demangle.
|
||||
@ -321,6 +350,22 @@ include::itrace.txt[]
|
||||
stop time is not given (i.e, time string is 'x.y,') then analysis goes
|
||||
to end of file.
|
||||
|
||||
Also support time percent with multipe time range. Time string is
|
||||
'a%/n,b%/m,...' or 'a%-b%,c%-%d,...'.
|
||||
|
||||
For example:
|
||||
Select the second 10% time slice:
|
||||
perf script --time 10%/2
|
||||
|
||||
Select from 0% to 10% time slice:
|
||||
perf script --time 0%-10%
|
||||
|
||||
Select the first and second 10% time slices:
|
||||
perf script --time 10%/1,10%/2
|
||||
|
||||
Select from 0% to 10% and 30% to 40% slices:
|
||||
perf script --time 0%-10%,30%-40%
|
||||
|
||||
--max-blocks::
|
||||
Set the maximum number of program blocks to print with brstackasm for
|
||||
each sample.
|
||||
|
@ -50,7 +50,9 @@ TIMECHART OPTIONS
|
||||
-p::
|
||||
--process::
|
||||
Select the processes to display, by name or PID
|
||||
|
||||
-f::
|
||||
--force::
|
||||
Don't complain, do it.
|
||||
--symfs=<directory>::
|
||||
Look for files with symbols relative to this directory.
|
||||
-n::
|
||||
|
@ -268,6 +268,12 @@ INTERACTIVE PROMPTING KEYS
|
||||
[S]::
|
||||
Stop annotation, return to full profile display.
|
||||
|
||||
[K]::
|
||||
Hide kernel symbols.
|
||||
|
||||
[U]::
|
||||
Hide user symbols.
|
||||
|
||||
[z]::
|
||||
Toggle event count zeroing across display updates.
|
||||
|
||||
|
@ -86,18 +86,18 @@ comma-separated list with no space: 0,1. Ranges of CPUs are specified with -: 0-
|
||||
In per-thread mode with inheritance mode on (default), Events are captured only when
|
||||
the thread executes on the designated CPUs. Default is to monitor all CPUs.
|
||||
|
||||
--duration:
|
||||
--duration::
|
||||
Show only events that had a duration greater than N.M ms.
|
||||
|
||||
--sched:
|
||||
--sched::
|
||||
Accrue thread runtime and provide a summary at the end of the session.
|
||||
|
||||
-i
|
||||
--input
|
||||
-i::
|
||||
--input::
|
||||
Process events from a given perf data file.
|
||||
|
||||
-T
|
||||
--time
|
||||
-T::
|
||||
--time::
|
||||
Print full timestamp rather time relative to first sample.
|
||||
|
||||
--comm::
|
||||
@ -117,6 +117,10 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs.
|
||||
Show tool stats such as number of times fd->pathname was discovered thru
|
||||
hooking the open syscall return + vfs_getname or via reading /proc/pid/fd, etc.
|
||||
|
||||
-f::
|
||||
--force::
|
||||
Don't complain, do it.
|
||||
|
||||
-F=[all|min|maj]::
|
||||
--pf=[all|min|maj]::
|
||||
Trace pagefaults. Optionally, you can specify whether you want minor,
|
||||
@ -159,6 +163,10 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs.
|
||||
Implies '--call-graph dwarf' when --call-graph not present on the
|
||||
command line, on systems where DWARF unwinding was built in.
|
||||
|
||||
--print-sample::
|
||||
Print the PERF_RECORD_SAMPLE PERF_SAMPLE_ info for the
|
||||
raw_syscalls:sys_{enter,exit} tracepoints, for debugging.
|
||||
|
||||
--proc-map-timeout::
|
||||
When processing pre-existing threads /proc/XXX/mmap, it may take a long time,
|
||||
because the file may be huge. A time out is needed in such cases.
|
||||
|
@ -238,6 +238,33 @@ struct auxtrace_index {
|
||||
struct auxtrace_index_entry entries[PERF_AUXTRACE_INDEX_ENTRY_COUNT];
|
||||
};
|
||||
|
||||
HEADER_STAT = 19,
|
||||
|
||||
This is merely a flag signifying that the data section contains data
|
||||
recorded from perf stat record.
|
||||
|
||||
HEADER_CACHE = 20,
|
||||
|
||||
Description of the cache hierarchy. Based on the Linux sysfs format
|
||||
in /sys/devices/system/cpu/cpu*/cache/
|
||||
|
||||
u32 version Currently always 1
|
||||
u32 number_of_cache_levels
|
||||
|
||||
struct {
|
||||
u32 level;
|
||||
u32 line_size;
|
||||
u32 sets;
|
||||
u32 ways;
|
||||
struct perf_header_string type;
|
||||
struct perf_header_string size;
|
||||
struct perf_header_string map;
|
||||
}[number_of_cache_levels];
|
||||
|
||||
HEADER_SAMPLE_TIME = 21,
|
||||
|
||||
Two uint64_t for the time of first sample and the time of last sample.
|
||||
|
||||
other bits are reserved and should ignored for now
|
||||
HEADER_FEAT_BITS = 256,
|
||||
|
||||
|
@ -32,3 +32,5 @@ Order by the overhead of source file name and line number: perf report -s srclin
|
||||
System-wide collection from all CPUs: perf record -a
|
||||
Show current config key-value pairs: perf config --list
|
||||
Show user configuration overrides: perf config --user --list
|
||||
To add Node.js USDT(User-Level Statically Defined Tracing): perf buildid-cache --add `which node`
|
||||
To report cacheline events from previous recording: perf c2c report
|
||||
|
@ -22,6 +22,7 @@ include $(srctree)/tools/scripts/Makefile.arch
|
||||
$(call detected_var,SRCARCH)
|
||||
|
||||
NO_PERF_REGS := 1
|
||||
NO_SYSCALL_TABLE := 1
|
||||
|
||||
# Additional ARCH settings for ppc
|
||||
ifeq ($(SRCARCH),powerpc)
|
||||
@ -33,7 +34,8 @@ endif
|
||||
ifeq ($(SRCARCH),x86)
|
||||
$(call detected,CONFIG_X86)
|
||||
ifeq (${IS_64_BIT}, 1)
|
||||
CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT -DHAVE_SYSCALL_TABLE -I$(OUTPUT)arch/x86/include/generated
|
||||
NO_SYSCALL_TABLE := 0
|
||||
CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT -I$(OUTPUT)arch/x86/include/generated
|
||||
ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
|
||||
LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma
|
||||
$(call detected,CONFIG_X86_64)
|
||||
@ -55,12 +57,18 @@ endif
|
||||
|
||||
ifeq ($(ARCH),s390)
|
||||
NO_PERF_REGS := 0
|
||||
NO_SYSCALL_TABLE := 0
|
||||
CFLAGS += -fPIC -I$(OUTPUT)arch/s390/include/generated
|
||||
endif
|
||||
|
||||
ifeq ($(NO_PERF_REGS),0)
|
||||
$(call detected,CONFIG_PERF_REGS)
|
||||
endif
|
||||
|
||||
ifneq ($(NO_SYSCALL_TABLE),1)
|
||||
CFLAGS += -DHAVE_SYSCALL_TABLE
|
||||
endif
|
||||
|
||||
# So far there's only x86 and arm libdw unwind support merged in perf.
|
||||
# Disable it on all other architectures in case libdw unwind
|
||||
# support is detected in system. Add supported architectures
|
||||
@ -97,6 +105,16 @@ FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
|
||||
FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS)
|
||||
FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
|
||||
|
||||
ifdef CSINCLUDES
|
||||
LIBOPENCSD_CFLAGS := -I$(CSINCLUDES)
|
||||
endif
|
||||
OPENCSDLIBS := -lopencsd_c_api -lopencsd
|
||||
ifdef CSLIBS
|
||||
LIBOPENCSD_LDFLAGS := -L$(CSLIBS)
|
||||
endif
|
||||
FEATURE_CHECK_CFLAGS-libopencsd := $(LIBOPENCSD_CFLAGS)
|
||||
FEATURE_CHECK_LDFLAGS-libopencsd := $(LIBOPENCSD_LDFLAGS) $(OPENCSDLIBS)
|
||||
|
||||
ifeq ($(NO_PERF_REGS),0)
|
||||
CFLAGS += -DHAVE_PERF_REGS_SUPPORT
|
||||
endif
|
||||
@ -265,6 +283,10 @@ ifeq ($(feature-pthread-attr-setaffinity-np), 1)
|
||||
CFLAGS += -DHAVE_PTHREAD_ATTR_SETAFFINITY_NP
|
||||
endif
|
||||
|
||||
ifeq ($(feature-pthread-barrier), 1)
|
||||
CFLAGS += -DHAVE_PTHREAD_BARRIER
|
||||
endif
|
||||
|
||||
ifndef NO_BIONIC
|
||||
$(call feature_check,bionic)
|
||||
ifeq ($(feature-bionic), 1)
|
||||
@ -341,6 +363,21 @@ ifeq ($(feature-setns), 1)
|
||||
$(call detected,CONFIG_SETNS)
|
||||
endif
|
||||
|
||||
ifndef NO_CORESIGHT
|
||||
ifeq ($(feature-libopencsd), 1)
|
||||
CFLAGS += -DHAVE_CSTRACE_SUPPORT $(LIBOPENCSD_CFLAGS)
|
||||
LDFLAGS += $(LIBOPENCSD_LDFLAGS)
|
||||
EXTLIBS += $(OPENCSDLIBS)
|
||||
$(call detected,CONFIG_LIBOPENCSD)
|
||||
ifdef CSTRACE_RAW
|
||||
CFLAGS += -DCS_DEBUG_RAW
|
||||
ifeq (${CSTRACE_RAW}, packed)
|
||||
CFLAGS += -DCS_RAW_PACKED
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifndef NO_LIBELF
|
||||
CFLAGS += -DHAVE_LIBELF_SUPPORT
|
||||
EXTLIBS += -lelf
|
||||
@ -519,14 +556,18 @@ ifndef NO_LIBUNWIND
|
||||
EXTLIBS += $(EXTLIBS_LIBUNWIND)
|
||||
endif
|
||||
|
||||
ifndef NO_LIBAUDIT
|
||||
ifneq ($(feature-libaudit), 1)
|
||||
msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
|
||||
NO_LIBAUDIT := 1
|
||||
else
|
||||
CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
|
||||
EXTLIBS += -laudit
|
||||
$(call detected,CONFIG_AUDIT)
|
||||
ifeq ($(NO_SYSCALL_TABLE),0)
|
||||
$(call detected,CONFIG_TRACE)
|
||||
else
|
||||
ifndef NO_LIBAUDIT
|
||||
ifneq ($(feature-libaudit), 1)
|
||||
msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
|
||||
NO_LIBAUDIT := 1
|
||||
else
|
||||
CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
|
||||
EXTLIBS += -laudit
|
||||
$(call detected,CONFIG_TRACE)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
@ -768,7 +809,7 @@ else
|
||||
NO_PERF_READ_VDSOX32 := 1
|
||||
endif
|
||||
|
||||
ifdef LIBBABELTRACE
|
||||
ifndef NO_LIBBABELTRACE
|
||||
$(call feature_check,libbabeltrace)
|
||||
ifeq ($(feature-libbabeltrace), 1)
|
||||
CFLAGS += -DHAVE_LIBBABELTRACE_SUPPORT $(LIBBABELTRACE_CFLAGS)
|
||||
@ -935,6 +976,10 @@ define print_var_code
|
||||
endef
|
||||
|
||||
ifeq ($(VF),1)
|
||||
# Display EXTRA features which are detected manualy
|
||||
# from here with feature_check call and thus cannot
|
||||
# be partof global state output.
|
||||
$(foreach feat,$(FEATURE_TESTS_EXTRA),$(call feature_print_status,$(feat),))
|
||||
$(call print_var,prefix)
|
||||
$(call print_var,bindir)
|
||||
$(call print_var,libdir)
|
||||
|
@ -77,7 +77,7 @@ include ../scripts/utilities.mak
|
||||
#
|
||||
# Define NO_ZLIB if you do not want to support compressed kernel modules
|
||||
#
|
||||
# Define LIBBABELTRACE if you DO want libbabeltrace support
|
||||
# Define NO_LIBBABELTRACE if you do not want libbabeltrace support
|
||||
# for CTF data format.
|
||||
#
|
||||
# Define NO_LZMA if you do not want to support compressed (xz) kernel modules
|
||||
@ -98,6 +98,8 @@ include ../scripts/utilities.mak
|
||||
# When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if
|
||||
# llvm-config is not in $PATH.
|
||||
|
||||
# Define NO_CORESIGHT if you do not want support for CoreSight trace decoding.
|
||||
|
||||
# As per kernel Makefile, avoid funny character set dependencies
|
||||
unexport LC_ALL
|
||||
LC_COLLATE=C
|
||||
@ -462,6 +464,13 @@ prctl_option_tbl := $(srctree)/tools/perf/trace/beauty/prctl_option.sh
|
||||
$(prctl_option_array): $(prctl_hdr_dir)/prctl.h $(prctl_option_tbl)
|
||||
$(Q)$(SHELL) '$(prctl_option_tbl)' $(prctl_hdr_dir) > $@
|
||||
|
||||
arch_errno_name_array := $(beauty_outdir)/arch_errno_name_array.c
|
||||
arch_errno_hdr_dir := $(srctree)/tools
|
||||
arch_errno_tbl := $(srctree)/tools/perf/trace/beauty/arch_errno_names.sh
|
||||
|
||||
$(arch_errno_name_array): $(arch_errno_tbl)
|
||||
$(Q)$(SHELL) '$(arch_errno_tbl)' $(CC) $(arch_errno_hdr_dir) > $@
|
||||
|
||||
all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
|
||||
|
||||
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST)
|
||||
@ -565,7 +574,8 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
|
||||
$(vhost_virtio_ioctl_array) \
|
||||
$(madvise_behavior_array) \
|
||||
$(perf_ioctl_array) \
|
||||
$(prctl_option_array)
|
||||
$(prctl_option_array) \
|
||||
$(arch_errno_name_array)
|
||||
|
||||
$(OUTPUT)%.o: %.c prepare FORCE
|
||||
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
|
||||
@ -847,7 +857,8 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
|
||||
$(OUTPUT)$(kcmp_type_array) \
|
||||
$(OUTPUT)$(vhost_virtio_ioctl_array) \
|
||||
$(OUTPUT)$(perf_ioctl_array) \
|
||||
$(OUTPUT)$(prctl_option_array)
|
||||
$(OUTPUT)$(prctl_option_array) \
|
||||
$(OUTPUT)$(arch_errno_name_array)
|
||||
$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
|
||||
|
||||
#
|
||||
|
@ -22,6 +22,42 @@
|
||||
#include "../../util/evlist.h"
|
||||
#include "../../util/pmu.h"
|
||||
#include "cs-etm.h"
|
||||
#include "arm-spe.h"
|
||||
|
||||
static struct perf_pmu **find_all_arm_spe_pmus(int *nr_spes, int *err)
|
||||
{
|
||||
struct perf_pmu **arm_spe_pmus = NULL;
|
||||
int ret, i, nr_cpus = sysconf(_SC_NPROCESSORS_CONF);
|
||||
/* arm_spe_xxxxxxxxx\0 */
|
||||
char arm_spe_pmu_name[sizeof(ARM_SPE_PMU_NAME) + 10];
|
||||
|
||||
arm_spe_pmus = zalloc(sizeof(struct perf_pmu *) * nr_cpus);
|
||||
if (!arm_spe_pmus) {
|
||||
pr_err("spes alloc failed\n");
|
||||
*err = -ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < nr_cpus; i++) {
|
||||
ret = sprintf(arm_spe_pmu_name, "%s%d", ARM_SPE_PMU_NAME, i);
|
||||
if (ret < 0) {
|
||||
pr_err("sprintf failed\n");
|
||||
*err = -ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arm_spe_pmus[*nr_spes] = perf_pmu__find(arm_spe_pmu_name);
|
||||
if (arm_spe_pmus[*nr_spes]) {
|
||||
pr_debug2("%s %d: arm_spe_pmu %d type %d name %s\n",
|
||||
__func__, __LINE__, *nr_spes,
|
||||
arm_spe_pmus[*nr_spes]->type,
|
||||
arm_spe_pmus[*nr_spes]->name);
|
||||
(*nr_spes)++;
|
||||
}
|
||||
}
|
||||
|
||||
return arm_spe_pmus;
|
||||
}
|
||||
|
||||
struct auxtrace_record
|
||||
*auxtrace_record__init(struct perf_evlist *evlist, int *err)
|
||||
@ -29,22 +65,51 @@ struct auxtrace_record
|
||||
struct perf_pmu *cs_etm_pmu;
|
||||
struct perf_evsel *evsel;
|
||||
bool found_etm = false;
|
||||
bool found_spe = false;
|
||||
static struct perf_pmu **arm_spe_pmus = NULL;
|
||||
static int nr_spes = 0;
|
||||
int i;
|
||||
|
||||
if (!evlist)
|
||||
return NULL;
|
||||
|
||||
cs_etm_pmu = perf_pmu__find(CORESIGHT_ETM_PMU_NAME);
|
||||
|
||||
if (evlist) {
|
||||
evlist__for_each_entry(evlist, evsel) {
|
||||
if (cs_etm_pmu &&
|
||||
evsel->attr.type == cs_etm_pmu->type)
|
||||
found_etm = true;
|
||||
if (!arm_spe_pmus)
|
||||
arm_spe_pmus = find_all_arm_spe_pmus(&nr_spes, err);
|
||||
|
||||
evlist__for_each_entry(evlist, evsel) {
|
||||
if (cs_etm_pmu &&
|
||||
evsel->attr.type == cs_etm_pmu->type)
|
||||
found_etm = true;
|
||||
|
||||
if (!nr_spes)
|
||||
continue;
|
||||
|
||||
for (i = 0; i < nr_spes; i++) {
|
||||
if (evsel->attr.type == arm_spe_pmus[i]->type) {
|
||||
found_spe = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (found_etm && found_spe) {
|
||||
pr_err("Concurrent ARM Coresight ETM and SPE operation not currently supported\n");
|
||||
*err = -EOPNOTSUPP;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (found_etm)
|
||||
return cs_etm_record_init(err);
|
||||
|
||||
#if defined(__aarch64__)
|
||||
if (found_spe)
|
||||
return arm_spe_recording_init(err, arm_spe_pmus[i]);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Clear 'err' even if we haven't found a cs_etm event - that way perf
|
||||
* Clear 'err' even if we haven't found an event - that way perf
|
||||
* record can still be used even if tracers aren't present. The NULL
|
||||
* return value will take care of telling the infrastructure HW tracing
|
||||
* isn't available.
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
#include "cs-etm.h"
|
||||
#include "arm-spe.h"
|
||||
#include "../../util/pmu.h"
|
||||
|
||||
struct perf_event_attr
|
||||
@ -30,7 +31,12 @@ struct perf_event_attr
|
||||
/* add ETM default config here */
|
||||
pmu->selectable = true;
|
||||
pmu->set_drv_config = cs_etm_set_drv_config;
|
||||
#if defined(__aarch64__)
|
||||
} else if (strstarts(pmu->name, ARM_SPE_PMU_NAME)) {
|
||||
return arm_spe_pmu_default_config(pmu);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
libperf-y += header.o
|
||||
libperf-y += sym-handling.o
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
|
||||
libperf-$(CONFIG_AUXTRACE) += ../../arm/util/pmu.o \
|
||||
../../arm/util/auxtrace.o \
|
||||
../../arm/util/cs-etm.o
|
||||
../../arm/util/cs-etm.o \
|
||||
arm-spe.o
|
||||
|
225
tools/perf/arch/arm64/util/arm-spe.c
Normal file
225
tools/perf/arch/arm64/util/arm-spe.c
Normal file
@ -0,0 +1,225 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Arm Statistical Profiling Extensions (SPE) support
|
||||
* Copyright (c) 2017-2018, Arm Ltd.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/log2.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "../../util/cpumap.h"
|
||||
#include "../../util/evsel.h"
|
||||
#include "../../util/evlist.h"
|
||||
#include "../../util/session.h"
|
||||
#include "../../util/util.h"
|
||||
#include "../../util/pmu.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../util/auxtrace.h"
|
||||
#include "../../util/arm-spe.h"
|
||||
|
||||
#define KiB(x) ((x) * 1024)
|
||||
#define MiB(x) ((x) * 1024 * 1024)
|
||||
|
||||
struct arm_spe_recording {
|
||||
struct auxtrace_record itr;
|
||||
struct perf_pmu *arm_spe_pmu;
|
||||
struct perf_evlist *evlist;
|
||||
};
|
||||
|
||||
static size_t
|
||||
arm_spe_info_priv_size(struct auxtrace_record *itr __maybe_unused,
|
||||
struct perf_evlist *evlist __maybe_unused)
|
||||
{
|
||||
return ARM_SPE_AUXTRACE_PRIV_SIZE;
|
||||
}
|
||||
|
||||
static int arm_spe_info_fill(struct auxtrace_record *itr,
|
||||
struct perf_session *session,
|
||||
struct auxtrace_info_event *auxtrace_info,
|
||||
size_t priv_size)
|
||||
{
|
||||
struct arm_spe_recording *sper =
|
||||
container_of(itr, struct arm_spe_recording, itr);
|
||||
struct perf_pmu *arm_spe_pmu = sper->arm_spe_pmu;
|
||||
|
||||
if (priv_size != ARM_SPE_AUXTRACE_PRIV_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
if (!session->evlist->nr_mmaps)
|
||||
return -EINVAL;
|
||||
|
||||
auxtrace_info->type = PERF_AUXTRACE_ARM_SPE;
|
||||
auxtrace_info->priv[ARM_SPE_PMU_TYPE] = arm_spe_pmu->type;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int arm_spe_recording_options(struct auxtrace_record *itr,
|
||||
struct perf_evlist *evlist,
|
||||
struct record_opts *opts)
|
||||
{
|
||||
struct arm_spe_recording *sper =
|
||||
container_of(itr, struct arm_spe_recording, itr);
|
||||
struct perf_pmu *arm_spe_pmu = sper->arm_spe_pmu;
|
||||
struct perf_evsel *evsel, *arm_spe_evsel = NULL;
|
||||
bool privileged = geteuid() == 0 || perf_event_paranoid() < 0;
|
||||
struct perf_evsel *tracking_evsel;
|
||||
int err;
|
||||
|
||||
sper->evlist = evlist;
|
||||
|
||||
evlist__for_each_entry(evlist, evsel) {
|
||||
if (evsel->attr.type == arm_spe_pmu->type) {
|
||||
if (arm_spe_evsel) {
|
||||
pr_err("There may be only one " ARM_SPE_PMU_NAME "x event\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
evsel->attr.freq = 0;
|
||||
evsel->attr.sample_period = 1;
|
||||
arm_spe_evsel = evsel;
|
||||
opts->full_auxtrace = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!opts->full_auxtrace)
|
||||
return 0;
|
||||
|
||||
/* We are in full trace mode but '-m,xyz' wasn't specified */
|
||||
if (opts->full_auxtrace && !opts->auxtrace_mmap_pages) {
|
||||
if (privileged) {
|
||||
opts->auxtrace_mmap_pages = MiB(4) / page_size;
|
||||
} else {
|
||||
opts->auxtrace_mmap_pages = KiB(128) / page_size;
|
||||
if (opts->mmap_pages == UINT_MAX)
|
||||
opts->mmap_pages = KiB(256) / page_size;
|
||||
}
|
||||
}
|
||||
|
||||
/* Validate auxtrace_mmap_pages */
|
||||
if (opts->auxtrace_mmap_pages) {
|
||||
size_t sz = opts->auxtrace_mmap_pages * (size_t)page_size;
|
||||
size_t min_sz = KiB(8);
|
||||
|
||||
if (sz < min_sz || !is_power_of_2(sz)) {
|
||||
pr_err("Invalid mmap size for ARM SPE: must be at least %zuKiB and a power of 2\n",
|
||||
min_sz / 1024);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* To obtain the auxtrace buffer file descriptor, the auxtrace event
|
||||
* must come first.
|
||||
*/
|
||||
perf_evlist__to_front(evlist, arm_spe_evsel);
|
||||
|
||||
perf_evsel__set_sample_bit(arm_spe_evsel, CPU);
|
||||
perf_evsel__set_sample_bit(arm_spe_evsel, TIME);
|
||||
perf_evsel__set_sample_bit(arm_spe_evsel, TID);
|
||||
|
||||
/* Add dummy event to keep tracking */
|
||||
err = parse_events(evlist, "dummy:u", NULL);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
tracking_evsel = perf_evlist__last(evlist);
|
||||
perf_evlist__set_tracking_event(evlist, tracking_evsel);
|
||||
|
||||
tracking_evsel->attr.freq = 0;
|
||||
tracking_evsel->attr.sample_period = 1;
|
||||
perf_evsel__set_sample_bit(tracking_evsel, TIME);
|
||||
perf_evsel__set_sample_bit(tracking_evsel, CPU);
|
||||
perf_evsel__reset_sample_bit(tracking_evsel, BRANCH_STACK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u64 arm_spe_reference(struct auxtrace_record *itr __maybe_unused)
|
||||
{
|
||||
struct timespec ts;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
|
||||
|
||||
return ts.tv_sec ^ ts.tv_nsec;
|
||||
}
|
||||
|
||||
static void arm_spe_recording_free(struct auxtrace_record *itr)
|
||||
{
|
||||
struct arm_spe_recording *sper =
|
||||
container_of(itr, struct arm_spe_recording, itr);
|
||||
|
||||
free(sper);
|
||||
}
|
||||
|
||||
static int arm_spe_read_finish(struct auxtrace_record *itr, int idx)
|
||||
{
|
||||
struct arm_spe_recording *sper =
|
||||
container_of(itr, struct arm_spe_recording, itr);
|
||||
struct perf_evsel *evsel;
|
||||
|
||||
evlist__for_each_entry(sper->evlist, evsel) {
|
||||
if (evsel->attr.type == sper->arm_spe_pmu->type)
|
||||
return perf_evlist__enable_event_idx(sper->evlist,
|
||||
evsel, idx);
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct auxtrace_record *arm_spe_recording_init(int *err,
|
||||
struct perf_pmu *arm_spe_pmu)
|
||||
{
|
||||
struct arm_spe_recording *sper;
|
||||
|
||||
if (!arm_spe_pmu) {
|
||||
*err = -ENODEV;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sper = zalloc(sizeof(struct arm_spe_recording));
|
||||
if (!sper) {
|
||||
*err = -ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sper->arm_spe_pmu = arm_spe_pmu;
|
||||
sper->itr.recording_options = arm_spe_recording_options;
|
||||
sper->itr.info_priv_size = arm_spe_info_priv_size;
|
||||
sper->itr.info_fill = arm_spe_info_fill;
|
||||
sper->itr.free = arm_spe_recording_free;
|
||||
sper->itr.reference = arm_spe_reference;
|
||||
sper->itr.read_finish = arm_spe_read_finish;
|
||||
sper->itr.alignment = 0;
|
||||
|
||||
return &sper->itr;
|
||||
}
|
||||
|
||||
struct perf_event_attr
|
||||
*arm_spe_pmu_default_config(struct perf_pmu *arm_spe_pmu)
|
||||
{
|
||||
struct perf_event_attr *attr;
|
||||
|
||||
attr = zalloc(sizeof(struct perf_event_attr));
|
||||
if (!attr) {
|
||||
pr_err("arm_spe default config cannot allocate a perf_event_attr\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* If kernel driver doesn't advertise a minimum,
|
||||
* use max allowable by PMSIDR_EL1.INTERVAL
|
||||
*/
|
||||
if (perf_pmu__scan_file(arm_spe_pmu, "caps/min_interval", "%llu",
|
||||
&attr->sample_period) != 1) {
|
||||
pr_debug("arm_spe driver doesn't advertise a min. interval. Using 4096\n");
|
||||
attr->sample_period = 4096;
|
||||
}
|
||||
|
||||
arm_spe_pmu->selectable = true;
|
||||
arm_spe_pmu->is_uncore = false;
|
||||
|
||||
return attr;
|
||||
}
|
65
tools/perf/arch/arm64/util/header.c
Normal file
65
tools/perf/arch/arm64/util/header.c
Normal file
@ -0,0 +1,65 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <api/fs/fs.h>
|
||||
#include "header.h"
|
||||
|
||||
#define MIDR "/regs/identification/midr_el1"
|
||||
#define MIDR_SIZE 19
|
||||
#define MIDR_REVISION_MASK 0xf
|
||||
#define MIDR_VARIANT_SHIFT 20
|
||||
#define MIDR_VARIANT_MASK (0xf << MIDR_VARIANT_SHIFT)
|
||||
|
||||
char *get_cpuid_str(struct perf_pmu *pmu)
|
||||
{
|
||||
char *buf = NULL;
|
||||
char path[PATH_MAX];
|
||||
const char *sysfs = sysfs__mountpoint();
|
||||
int cpu;
|
||||
u64 midr = 0;
|
||||
struct cpu_map *cpus;
|
||||
FILE *file;
|
||||
|
||||
if (!sysfs || !pmu || !pmu->cpus)
|
||||
return NULL;
|
||||
|
||||
buf = malloc(MIDR_SIZE);
|
||||
if (!buf)
|
||||
return NULL;
|
||||
|
||||
/* read midr from list of cpus mapped to this pmu */
|
||||
cpus = cpu_map__get(pmu->cpus);
|
||||
for (cpu = 0; cpu < cpus->nr; cpu++) {
|
||||
scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
|
||||
sysfs, cpus->map[cpu]);
|
||||
|
||||
file = fopen(path, "r");
|
||||
if (!file) {
|
||||
pr_debug("fopen failed for file %s\n", path);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!fgets(buf, MIDR_SIZE, file)) {
|
||||
fclose(file);
|
||||
continue;
|
||||
}
|
||||
fclose(file);
|
||||
|
||||
/* Ignore/clear Variant[23:20] and
|
||||
* Revision[3:0] of MIDR
|
||||
*/
|
||||
midr = strtoul(buf, NULL, 16);
|
||||
midr &= (~(MIDR_VARIANT_MASK | MIDR_REVISION_MASK));
|
||||
scnprintf(buf, MIDR_SIZE, "0x%016lx", midr);
|
||||
/* got midr break loop */
|
||||
break;
|
||||
}
|
||||
|
||||
if (!midr) {
|
||||
pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
|
||||
free(buf);
|
||||
buf = NULL;
|
||||
}
|
||||
|
||||
cpu_map__put(cpus);
|
||||
return buf;
|
||||
}
|
22
tools/perf/arch/arm64/util/sym-handling.c
Normal file
22
tools/perf/arch/arm64/util/sym-handling.c
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License, version 2, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Copyright (C) 2015 Naveen N. Rao, IBM Corporation
|
||||
*/
|
||||
|
||||
#include "debug.h"
|
||||
#include "symbol.h"
|
||||
#include "map.h"
|
||||
#include "probe-event.h"
|
||||
#include "probe-file.h"
|
||||
|
||||
#ifdef HAVE_LIBELF_SUPPORT
|
||||
bool elf__needs_adjust_symbols(GElf_Ehdr ehdr)
|
||||
{
|
||||
return ehdr.e_type == ET_EXEC ||
|
||||
ehdr.e_type == ET_REL ||
|
||||
ehdr.e_type == ET_DYN;
|
||||
}
|
||||
#endif
|
@ -1,12 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <stdio.h>
|
||||
#include <sys/utsname.h>
|
||||
#include "common.h"
|
||||
#include "../util/env.h"
|
||||
#include "../util/util.h"
|
||||
#include "../util/debug.h"
|
||||
|
||||
#include "sane_ctype.h"
|
||||
|
||||
const char *const arm_triplets[] = {
|
||||
"arm-eabi-",
|
||||
"arm-linux-androideabi-",
|
||||
@ -120,55 +118,19 @@ static int lookup_triplets(const char *const *triplets, const char *name)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return architecture name in a normalized form.
|
||||
* The conversion logic comes from the Makefile.
|
||||
*/
|
||||
const char *normalize_arch(char *arch)
|
||||
{
|
||||
if (!strcmp(arch, "x86_64"))
|
||||
return "x86";
|
||||
if (arch[0] == 'i' && arch[2] == '8' && arch[3] == '6')
|
||||
return "x86";
|
||||
if (!strcmp(arch, "sun4u") || !strncmp(arch, "sparc", 5))
|
||||
return "sparc";
|
||||
if (!strcmp(arch, "aarch64") || !strcmp(arch, "arm64"))
|
||||
return "arm64";
|
||||
if (!strncmp(arch, "arm", 3) || !strcmp(arch, "sa110"))
|
||||
return "arm";
|
||||
if (!strncmp(arch, "s390", 4))
|
||||
return "s390";
|
||||
if (!strncmp(arch, "parisc", 6))
|
||||
return "parisc";
|
||||
if (!strncmp(arch, "powerpc", 7) || !strncmp(arch, "ppc", 3))
|
||||
return "powerpc";
|
||||
if (!strncmp(arch, "mips", 4))
|
||||
return "mips";
|
||||
if (!strncmp(arch, "sh", 2) && isdigit(arch[2]))
|
||||
return "sh";
|
||||
|
||||
return arch;
|
||||
}
|
||||
|
||||
static int perf_env__lookup_binutils_path(struct perf_env *env,
|
||||
const char *name, const char **path)
|
||||
{
|
||||
int idx;
|
||||
const char *arch, *cross_env;
|
||||
struct utsname uts;
|
||||
const char *arch = perf_env__arch(env), *cross_env;
|
||||
const char *const *path_list;
|
||||
char *buf = NULL;
|
||||
|
||||
arch = normalize_arch(env->arch);
|
||||
|
||||
if (uname(&uts) < 0)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* We don't need to try to find objdump path for native system.
|
||||
* Just use default binutils path (e.g.: "objdump").
|
||||
*/
|
||||
if (!strcmp(normalize_arch(uts.machine), arch))
|
||||
if (!strcmp(perf_env__arch(NULL), arch))
|
||||
goto out;
|
||||
|
||||
cross_env = getenv("CROSS_COMPILE");
|
||||
|
@ -7,6 +7,5 @@
|
||||
extern const char *objdump_path;
|
||||
|
||||
int perf_env__lookup_objdump(struct perf_env *env);
|
||||
const char *normalize_arch(char *arch);
|
||||
|
||||
#endif /* ARCH_PERF_COMMON_H */
|
||||
|
@ -35,7 +35,7 @@ get_cpuid(char *buffer, size_t sz)
|
||||
}
|
||||
|
||||
char *
|
||||
get_cpuid_str(void)
|
||||
get_cpuid_str(struct perf_pmu *pmu __maybe_unused)
|
||||
{
|
||||
char *bufp;
|
||||
|
||||
|
@ -64,6 +64,14 @@ int arch__compare_symbol_names_n(const char *namea, const char *nameb,
|
||||
|
||||
return strncmp(namea, nameb, n);
|
||||
}
|
||||
|
||||
const char *arch__normalize_symbol_name(const char *name)
|
||||
{
|
||||
/* Skip over initial dot */
|
||||
if (name && *name == '.')
|
||||
name++;
|
||||
return name;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(_CALL_ELF) && _CALL_ELF == 2
|
||||
|
@ -3,3 +3,24 @@ PERF_HAVE_DWARF_REGS := 1
|
||||
endif
|
||||
HAVE_KVM_STAT_SUPPORT := 1
|
||||
PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
|
||||
|
||||
#
|
||||
# Syscall table generation for perf
|
||||
#
|
||||
|
||||
out := $(OUTPUT)arch/s390/include/generated/asm
|
||||
header := $(out)/syscalls_64.c
|
||||
sysdef := $(srctree)/tools/arch/s390/include/uapi/asm/unistd.h
|
||||
sysprf := $(srctree)/tools/perf/arch/s390/entry/syscalls/
|
||||
systbl := $(sysprf)/mksyscalltbl
|
||||
|
||||
# Create output directory if not already present
|
||||
_dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)')
|
||||
|
||||
$(header): $(sysdef) $(systbl)
|
||||
$(Q)$(SHELL) '$(systbl)' '$(CC)' $(sysdef) > $@
|
||||
|
||||
clean::
|
||||
$(call QUIET_CLEAN, s390) $(RM) $(header)
|
||||
|
||||
archheaders: $(header)
|
||||
|
@ -18,7 +18,8 @@ static struct ins_ops *s390__associate_ins_ops(struct arch *arch, const char *na
|
||||
if (!strcmp(name, "br"))
|
||||
ops = &ret_ops;
|
||||
|
||||
arch__associate_ins_ops(arch, name, ops);
|
||||
if (ops)
|
||||
arch__associate_ins_ops(arch, name, ops);
|
||||
return ops;
|
||||
}
|
||||
|
||||
|
36
tools/perf/arch/s390/entry/syscalls/mksyscalltbl
Executable file
36
tools/perf/arch/s390/entry/syscalls/mksyscalltbl
Executable file
@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Generate system call table for perf
|
||||
#
|
||||
#
|
||||
# Copyright IBM Corp. 2017
|
||||
# Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||
#
|
||||
|
||||
gcc=$1
|
||||
input=$2
|
||||
|
||||
if ! test -r $input; then
|
||||
echo "Could not read input file" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
create_table()
|
||||
{
|
||||
local max_nr
|
||||
|
||||
echo 'static const char *syscalltbl_s390_64[] = {'
|
||||
while read sc nr; do
|
||||
printf '\t[%d] = "%s",\n' $nr $sc
|
||||
max_nr=$nr
|
||||
done
|
||||
echo '};'
|
||||
echo "#define SYSCALLTBL_S390_64_MAX_ID $max_nr"
|
||||
}
|
||||
|
||||
|
||||
$gcc -m64 -E -dM -x c $input \
|
||||
|sed -ne 's/^#define __NR_//p' \
|
||||
|sort -t' ' -k2 -nu \
|
||||
|create_table
|
@ -84,7 +84,7 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybe
|
||||
|
||||
CHECK__(perf_evlist__open(evlist));
|
||||
|
||||
CHECK__(perf_evlist__mmap(evlist, UINT_MAX, false));
|
||||
CHECK__(perf_evlist__mmap(evlist, UINT_MAX));
|
||||
|
||||
pc = evlist->mmap[0].base;
|
||||
ret = perf_read_tsc_conversion(pc, &tc);
|
||||
|
@ -66,11 +66,11 @@ get_cpuid(char *buffer, size_t sz)
|
||||
}
|
||||
|
||||
char *
|
||||
get_cpuid_str(void)
|
||||
get_cpuid_str(struct perf_pmu *pmu __maybe_unused)
|
||||
{
|
||||
char *buf = malloc(128);
|
||||
|
||||
if (__get_cpuid(buf, 128, "%s-%u-%X$") < 0) {
|
||||
if (buf && __get_cpuid(buf, 128, "%s-%u-%X$") < 0) {
|
||||
free(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#ifndef REMOTE_UNWIND_LIBUNWIND
|
||||
#include <errno.h>
|
||||
#ifndef REMOTE_UNWIND_LIBUNWIND
|
||||
#include <libunwind.h>
|
||||
#include "perf_regs.h"
|
||||
#include "../../util/unwind.h"
|
||||
|
@ -24,9 +24,9 @@
|
||||
#include <subcmd/parse-options.h>
|
||||
#include "bench.h"
|
||||
#include "futex.h"
|
||||
#include "cpumap.h"
|
||||
|
||||
#include <err.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
static unsigned int nthreads = 0;
|
||||
static unsigned int nsecs = 10;
|
||||
@ -118,11 +118,12 @@ static void print_summary(void)
|
||||
int bench_futex_hash(int argc, const char **argv)
|
||||
{
|
||||
int ret = 0;
|
||||
cpu_set_t cpu;
|
||||
cpu_set_t cpuset;
|
||||
struct sigaction act;
|
||||
unsigned int i, ncpus;
|
||||
unsigned int i;
|
||||
pthread_attr_t thread_attr;
|
||||
struct worker *worker = NULL;
|
||||
struct cpu_map *cpu;
|
||||
|
||||
argc = parse_options(argc, argv, options, bench_futex_hash_usage, 0);
|
||||
if (argc) {
|
||||
@ -130,14 +131,16 @@ int bench_futex_hash(int argc, const char **argv)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
cpu = cpu_map__new(NULL);
|
||||
if (!cpu)
|
||||
goto errmem;
|
||||
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
if (!nthreads) /* default to the number of CPUs */
|
||||
nthreads = ncpus;
|
||||
nthreads = cpu->nr;
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
@ -163,10 +166,10 @@ int bench_futex_hash(int argc, const char **argv)
|
||||
if (!worker[i].futex)
|
||||
goto errmem;
|
||||
|
||||
CPU_ZERO(&cpu);
|
||||
CPU_SET(i % ncpus, &cpu);
|
||||
CPU_ZERO(&cpuset);
|
||||
CPU_SET(cpu->map[i % cpu->nr], &cpuset);
|
||||
|
||||
ret = pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpu);
|
||||
ret = pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpuset);
|
||||
if (ret)
|
||||
err(EXIT_FAILURE, "pthread_attr_setaffinity_np");
|
||||
|
||||
@ -217,6 +220,7 @@ int bench_futex_hash(int argc, const char **argv)
|
||||
print_summary();
|
||||
|
||||
free(worker);
|
||||
free(cpu);
|
||||
return ret;
|
||||
errmem:
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <errno.h>
|
||||
#include "bench.h"
|
||||
#include "futex.h"
|
||||
#include "cpumap.h"
|
||||
|
||||
#include <err.h>
|
||||
#include <stdlib.h>
|
||||
@ -32,7 +33,7 @@ static struct worker *worker;
|
||||
static unsigned int nsecs = 10;
|
||||
static bool silent = false, multi = false;
|
||||
static bool done = false, fshared = false;
|
||||
static unsigned int ncpus, nthreads = 0;
|
||||
static unsigned int nthreads = 0;
|
||||
static int futex_flag = 0;
|
||||
struct timeval start, end, runtime;
|
||||
static pthread_mutex_t thread_lock;
|
||||
@ -113,9 +114,10 @@ static void *workerfn(void *arg)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void create_threads(struct worker *w, pthread_attr_t thread_attr)
|
||||
static void create_threads(struct worker *w, pthread_attr_t thread_attr,
|
||||
struct cpu_map *cpu)
|
||||
{
|
||||
cpu_set_t cpu;
|
||||
cpu_set_t cpuset;
|
||||
unsigned int i;
|
||||
|
||||
threads_starting = nthreads;
|
||||
@ -130,10 +132,10 @@ static void create_threads(struct worker *w, pthread_attr_t thread_attr)
|
||||
} else
|
||||
worker[i].futex = &global_futex;
|
||||
|
||||
CPU_ZERO(&cpu);
|
||||
CPU_SET(i % ncpus, &cpu);
|
||||
CPU_ZERO(&cpuset);
|
||||
CPU_SET(cpu->map[i % cpu->nr], &cpuset);
|
||||
|
||||
if (pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpu))
|
||||
if (pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpuset))
|
||||
err(EXIT_FAILURE, "pthread_attr_setaffinity_np");
|
||||
|
||||
if (pthread_create(&w[i].thread, &thread_attr, workerfn, &worker[i]))
|
||||
@ -147,19 +149,22 @@ int bench_futex_lock_pi(int argc, const char **argv)
|
||||
unsigned int i;
|
||||
struct sigaction act;
|
||||
pthread_attr_t thread_attr;
|
||||
struct cpu_map *cpu;
|
||||
|
||||
argc = parse_options(argc, argv, options, bench_futex_lock_pi_usage, 0);
|
||||
if (argc)
|
||||
goto err;
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
cpu = cpu_map__new(NULL);
|
||||
if (!cpu)
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
if (!nthreads)
|
||||
nthreads = ncpus;
|
||||
nthreads = cpu->nr;
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
@ -180,7 +185,7 @@ int bench_futex_lock_pi(int argc, const char **argv)
|
||||
pthread_attr_init(&thread_attr);
|
||||
gettimeofday(&start, NULL);
|
||||
|
||||
create_threads(worker, thread_attr);
|
||||
create_threads(worker, thread_attr, cpu);
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
|
||||
pthread_mutex_lock(&thread_lock);
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <errno.h>
|
||||
#include "bench.h"
|
||||
#include "futex.h"
|
||||
#include "cpumap.h"
|
||||
|
||||
#include <err.h>
|
||||
#include <stdlib.h>
|
||||
@ -40,7 +41,7 @@ static bool done = false, silent = false, fshared = false;
|
||||
static pthread_mutex_t thread_lock;
|
||||
static pthread_cond_t thread_parent, thread_worker;
|
||||
static struct stats requeuetime_stats, requeued_stats;
|
||||
static unsigned int ncpus, threads_starting, nthreads = 0;
|
||||
static unsigned int threads_starting, nthreads = 0;
|
||||
static int futex_flag = 0;
|
||||
|
||||
static const struct option options[] = {
|
||||
@ -83,19 +84,19 @@ static void *workerfn(void *arg __maybe_unused)
|
||||
}
|
||||
|
||||
static void block_threads(pthread_t *w,
|
||||
pthread_attr_t thread_attr)
|
||||
pthread_attr_t thread_attr, struct cpu_map *cpu)
|
||||
{
|
||||
cpu_set_t cpu;
|
||||
cpu_set_t cpuset;
|
||||
unsigned int i;
|
||||
|
||||
threads_starting = nthreads;
|
||||
|
||||
/* create and block all threads */
|
||||
for (i = 0; i < nthreads; i++) {
|
||||
CPU_ZERO(&cpu);
|
||||
CPU_SET(i % ncpus, &cpu);
|
||||
CPU_ZERO(&cpuset);
|
||||
CPU_SET(cpu->map[i % cpu->nr], &cpuset);
|
||||
|
||||
if (pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpu))
|
||||
if (pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpuset))
|
||||
err(EXIT_FAILURE, "pthread_attr_setaffinity_np");
|
||||
|
||||
if (pthread_create(&w[i], &thread_attr, workerfn, NULL))
|
||||
@ -116,19 +117,22 @@ int bench_futex_requeue(int argc, const char **argv)
|
||||
unsigned int i, j;
|
||||
struct sigaction act;
|
||||
pthread_attr_t thread_attr;
|
||||
struct cpu_map *cpu;
|
||||
|
||||
argc = parse_options(argc, argv, options, bench_futex_requeue_usage, 0);
|
||||
if (argc)
|
||||
goto err;
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
cpu = cpu_map__new(NULL);
|
||||
if (!cpu)
|
||||
err(EXIT_FAILURE, "cpu_map__new");
|
||||
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
if (!nthreads)
|
||||
nthreads = ncpus;
|
||||
nthreads = cpu->nr;
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
@ -156,7 +160,7 @@ int bench_futex_requeue(int argc, const char **argv)
|
||||
struct timeval start, end, runtime;
|
||||
|
||||
/* create, launch & block all threads */
|
||||
block_threads(worker, thread_attr);
|
||||
block_threads(worker, thread_attr, cpu);
|
||||
|
||||
/* make sure all threads are already blocked */
|
||||
pthread_mutex_lock(&thread_lock);
|
||||
|
@ -7,7 +7,17 @@
|
||||
* for each individual thread to service its share of work. Ultimately
|
||||
* it can be used to measure futex_wake() changes.
|
||||
*/
|
||||
#include "bench.h"
|
||||
#include <linux/compiler.h>
|
||||
#include "../util/debug.h"
|
||||
|
||||
#ifndef HAVE_PTHREAD_BARRIER
|
||||
int bench_futex_wake_parallel(int argc __maybe_unused, const char **argv __maybe_unused)
|
||||
{
|
||||
pr_err("%s: pthread_barrier_t unavailable, disabling this test...\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
#else /* HAVE_PTHREAD_BARRIER */
|
||||
/* For the CLR_() macros */
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
@ -15,12 +25,11 @@
|
||||
#include <signal.h>
|
||||
#include "../util/stat.h"
|
||||
#include <subcmd/parse-options.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/time64.h>
|
||||
#include <errno.h>
|
||||
#include "bench.h"
|
||||
#include "futex.h"
|
||||
#include "cpumap.h"
|
||||
|
||||
#include <err.h>
|
||||
#include <stdlib.h>
|
||||
@ -42,8 +51,9 @@ static bool done = false, silent = false, fshared = false;
|
||||
static unsigned int nblocked_threads = 0, nwaking_threads = 0;
|
||||
static pthread_mutex_t thread_lock;
|
||||
static pthread_cond_t thread_parent, thread_worker;
|
||||
static pthread_barrier_t barrier;
|
||||
static struct stats waketime_stats, wakeup_stats;
|
||||
static unsigned int ncpus, threads_starting;
|
||||
static unsigned int threads_starting;
|
||||
static int futex_flag = 0;
|
||||
|
||||
static const struct option options[] = {
|
||||
@ -64,6 +74,8 @@ static void *waking_workerfn(void *arg)
|
||||
struct thread_data *waker = (struct thread_data *) arg;
|
||||
struct timeval start, end;
|
||||
|
||||
pthread_barrier_wait(&barrier);
|
||||
|
||||
gettimeofday(&start, NULL);
|
||||
|
||||
waker->nwoken = futex_wake(&futex, nwakes, futex_flag);
|
||||
@ -84,6 +96,8 @@ static void wakeup_threads(struct thread_data *td, pthread_attr_t thread_attr)
|
||||
|
||||
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
|
||||
|
||||
pthread_barrier_init(&barrier, NULL, nwaking_threads + 1);
|
||||
|
||||
/* create and block all threads */
|
||||
for (i = 0; i < nwaking_threads; i++) {
|
||||
/*
|
||||
@ -96,9 +110,13 @@ static void wakeup_threads(struct thread_data *td, pthread_attr_t thread_attr)
|
||||
err(EXIT_FAILURE, "pthread_create");
|
||||
}
|
||||
|
||||
pthread_barrier_wait(&barrier);
|
||||
|
||||
for (i = 0; i < nwaking_threads; i++)
|
||||
if (pthread_join(td[i].worker, NULL))
|
||||
err(EXIT_FAILURE, "pthread_join");
|
||||
|
||||
pthread_barrier_destroy(&barrier);
|
||||
}
|
||||
|
||||
static void *blocked_workerfn(void *arg __maybe_unused)
|
||||
@ -119,19 +137,20 @@ static void *blocked_workerfn(void *arg __maybe_unused)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void block_threads(pthread_t *w, pthread_attr_t thread_attr)
|
||||
static void block_threads(pthread_t *w, pthread_attr_t thread_attr,
|
||||
struct cpu_map *cpu)
|
||||
{
|
||||
cpu_set_t cpu;
|
||||
cpu_set_t cpuset;
|
||||
unsigned int i;
|
||||
|
||||
threads_starting = nblocked_threads;
|
||||
|
||||
/* create and block all threads */
|
||||
for (i = 0; i < nblocked_threads; i++) {
|
||||
CPU_ZERO(&cpu);
|
||||
CPU_SET(i % ncpus, &cpu);
|
||||
CPU_ZERO(&cpuset);
|
||||
CPU_SET(cpu->map[i % cpu->nr], &cpuset);
|
||||
|
||||
if (pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpu))
|
||||
if (pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpuset))
|
||||
err(EXIT_FAILURE, "pthread_attr_setaffinity_np");
|
||||
|
||||
if (pthread_create(&w[i], &thread_attr, blocked_workerfn, NULL))
|
||||
@ -205,6 +224,7 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
||||
struct sigaction act;
|
||||
pthread_attr_t thread_attr;
|
||||
struct thread_data *waking_worker;
|
||||
struct cpu_map *cpu;
|
||||
|
||||
argc = parse_options(argc, argv, options,
|
||||
bench_futex_wake_parallel_usage, 0);
|
||||
@ -217,9 +237,12 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
cpu = cpu_map__new(NULL);
|
||||
if (!cpu)
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
|
||||
if (!nblocked_threads)
|
||||
nblocked_threads = ncpus;
|
||||
nblocked_threads = cpu->nr;
|
||||
|
||||
/* some sanity checks */
|
||||
if (nwaking_threads > nblocked_threads || !nwaking_threads)
|
||||
@ -259,7 +282,7 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
|
||||
/* create, launch & block all threads */
|
||||
block_threads(blocked_worker, thread_attr);
|
||||
block_threads(blocked_worker, thread_attr, cpu);
|
||||
|
||||
/* make sure all threads are already blocked */
|
||||
pthread_mutex_lock(&thread_lock);
|
||||
@ -297,3 +320,4 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
||||
free(blocked_worker);
|
||||
return ret;
|
||||
}
|
||||
#endif /* HAVE_PTHREAD_BARRIER */
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <errno.h>
|
||||
#include "bench.h"
|
||||
#include "futex.h"
|
||||
#include "cpumap.h"
|
||||
|
||||
#include <err.h>
|
||||
#include <stdlib.h>
|
||||
@ -89,19 +90,19 @@ static void print_summary(void)
|
||||
}
|
||||
|
||||
static void block_threads(pthread_t *w,
|
||||
pthread_attr_t thread_attr)
|
||||
pthread_attr_t thread_attr, struct cpu_map *cpu)
|
||||
{
|
||||
cpu_set_t cpu;
|
||||
cpu_set_t cpuset;
|
||||
unsigned int i;
|
||||
|
||||
threads_starting = nthreads;
|
||||
|
||||
/* create and block all threads */
|
||||
for (i = 0; i < nthreads; i++) {
|
||||
CPU_ZERO(&cpu);
|
||||
CPU_SET(i % ncpus, &cpu);
|
||||
CPU_ZERO(&cpuset);
|
||||
CPU_SET(cpu->map[i % cpu->nr], &cpuset);
|
||||
|
||||
if (pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpu))
|
||||
if (pthread_attr_setaffinity_np(&thread_attr, sizeof(cpu_set_t), &cpuset))
|
||||
err(EXIT_FAILURE, "pthread_attr_setaffinity_np");
|
||||
|
||||
if (pthread_create(&w[i], &thread_attr, workerfn, NULL))
|
||||
@ -122,6 +123,7 @@ int bench_futex_wake(int argc, const char **argv)
|
||||
unsigned int i, j;
|
||||
struct sigaction act;
|
||||
pthread_attr_t thread_attr;
|
||||
struct cpu_map *cpu;
|
||||
|
||||
argc = parse_options(argc, argv, options, bench_futex_wake_usage, 0);
|
||||
if (argc) {
|
||||
@ -129,7 +131,9 @@ int bench_futex_wake(int argc, const char **argv)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
cpu = cpu_map__new(NULL);
|
||||
if (!cpu)
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
@ -161,7 +165,7 @@ int bench_futex_wake(int argc, const char **argv)
|
||||
struct timeval start, end, runtime;
|
||||
|
||||
/* create, launch & block all threads */
|
||||
block_threads(worker, thread_attr);
|
||||
block_threads(worker, thread_attr, cpu);
|
||||
|
||||
/* make sure all threads are already blocked */
|
||||
pthread_mutex_lock(&thread_lock);
|
||||
|
@ -325,8 +325,8 @@ int cmd_buildid_cache(int argc, const char **argv)
|
||||
"file", "kcore file to add"),
|
||||
OPT_STRING('r', "remove", &remove_name_list_str, "file list",
|
||||
"file(s) to remove"),
|
||||
OPT_STRING('p', "purge", &purge_name_list_str, "path list",
|
||||
"path(s) to remove (remove old caches too)"),
|
||||
OPT_STRING('p', "purge", &purge_name_list_str, "file list",
|
||||
"file(s) to remove (remove old caches too)"),
|
||||
OPT_STRING('M', "missing", &missing_filename, "file",
|
||||
"to find missing build ids in the cache"),
|
||||
OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
|
||||
|
@ -27,13 +27,10 @@
|
||||
#include "sort.h"
|
||||
#include "tool.h"
|
||||
#include "data.h"
|
||||
#include "sort.h"
|
||||
#include "event.h"
|
||||
#include "evlist.h"
|
||||
#include "evsel.h"
|
||||
#include <asm/bug.h>
|
||||
#include "ui/browsers/hists.h"
|
||||
#include "evlist.h"
|
||||
#include "thread.h"
|
||||
|
||||
struct c2c_hists {
|
||||
@ -2224,9 +2221,9 @@ static int perf_c2c__browse_cacheline(struct hist_entry *he)
|
||||
struct hist_browser *browser;
|
||||
int key = -1;
|
||||
const char help[] =
|
||||
" ENTER Togle callchains (if present) \n"
|
||||
" n Togle Node details info \n"
|
||||
" s Togle full lenght of symbol and source line columns \n"
|
||||
" ENTER Toggle callchains (if present) \n"
|
||||
" n Toggle Node details info \n"
|
||||
" s Toggle full length of symbol and source line columns \n"
|
||||
" q Return back to cacheline list \n";
|
||||
|
||||
/* Display compact version first. */
|
||||
@ -2303,7 +2300,7 @@ static int perf_c2c__hists_browse(struct hists *hists)
|
||||
int key = -1;
|
||||
const char help[] =
|
||||
" d Display cacheline details \n"
|
||||
" ENTER Togle callchains (if present) \n"
|
||||
" ENTER Toggle callchains (if present) \n"
|
||||
" q Quit \n";
|
||||
|
||||
browser = perf_c2c_browser__new(hists);
|
||||
@ -2393,9 +2390,10 @@ static int setup_callchain(struct perf_evlist *evlist)
|
||||
enum perf_call_graph_mode mode = CALLCHAIN_NONE;
|
||||
|
||||
if ((sample_type & PERF_SAMPLE_REGS_USER) &&
|
||||
(sample_type & PERF_SAMPLE_STACK_USER))
|
||||
(sample_type & PERF_SAMPLE_STACK_USER)) {
|
||||
mode = CALLCHAIN_DWARF;
|
||||
else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
|
||||
dwarf_callchain_users = true;
|
||||
} else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
|
||||
mode = CALLCHAIN_LBR;
|
||||
else if (sample_type & PERF_SAMPLE_CALLCHAIN)
|
||||
mode = CALLCHAIN_FP;
|
||||
|
@ -439,7 +439,7 @@ int cmd_help(int argc, const char **argv)
|
||||
#ifdef HAVE_LIBELF_SUPPORT
|
||||
"probe",
|
||||
#endif
|
||||
#ifdef HAVE_LIBAUDIT_SUPPORT
|
||||
#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE)
|
||||
"trace",
|
||||
#endif
|
||||
NULL };
|
||||
|
@ -536,8 +536,7 @@ found:
|
||||
sample_sw.period = sample->period;
|
||||
sample_sw.time = sample->time;
|
||||
perf_event__synthesize_sample(event_sw, evsel->attr.sample_type,
|
||||
evsel->attr.read_format, &sample_sw,
|
||||
false);
|
||||
evsel->attr.read_format, &sample_sw);
|
||||
build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
|
||||
return perf_event__repipe(tool, event_sw, &sample_sw, machine);
|
||||
}
|
||||
|
@ -26,6 +26,9 @@
|
||||
#include <sys/timerfd.h>
|
||||
#endif
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/time64.h>
|
||||
@ -741,20 +744,20 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
|
||||
u64 *mmap_time)
|
||||
{
|
||||
union perf_event *event;
|
||||
struct perf_sample sample;
|
||||
u64 timestamp;
|
||||
s64 n = 0;
|
||||
int err;
|
||||
|
||||
*mmap_time = ULLONG_MAX;
|
||||
while ((event = perf_evlist__mmap_read(kvm->evlist, idx)) != NULL) {
|
||||
err = perf_evlist__parse_sample(kvm->evlist, event, &sample);
|
||||
err = perf_evlist__parse_sample_timestamp(kvm->evlist, event, ×tamp);
|
||||
if (err) {
|
||||
perf_evlist__mmap_consume(kvm->evlist, idx);
|
||||
pr_err("Failed to parse sample\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = perf_session__queue_event(kvm->session, event, &sample, 0);
|
||||
err = perf_session__queue_event(kvm->session, event, timestamp, 0);
|
||||
/*
|
||||
* FIXME: Here we can't consume the event, as perf_session__queue_event will
|
||||
* point to it, and it'll get possibly overwritten by the kernel.
|
||||
@ -768,7 +771,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
|
||||
|
||||
/* save time stamp of our first sample for this mmap */
|
||||
if (n == 0)
|
||||
*mmap_time = sample.time;
|
||||
*mmap_time = timestamp;
|
||||
|
||||
/* limit events per mmap handled all at once */
|
||||
n++;
|
||||
@ -1044,7 +1047,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) {
|
||||
if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages) < 0) {
|
||||
ui__error("Failed to mmap the events: %s\n",
|
||||
str_error_r(errno, sbuf, sizeof(sbuf)));
|
||||
perf_evlist__close(evlist);
|
||||
|
@ -51,7 +51,6 @@
|
||||
#include <signal.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/wait.h>
|
||||
#include <asm/bug.h>
|
||||
#include <linux/time64.h>
|
||||
|
||||
struct switch_output {
|
||||
@ -79,6 +78,7 @@ struct record {
|
||||
bool no_buildid_cache_set;
|
||||
bool buildid_all;
|
||||
bool timestamp_filename;
|
||||
bool timestamp_boundary;
|
||||
struct switch_output switch_output;
|
||||
unsigned long long samples;
|
||||
};
|
||||
@ -301,7 +301,7 @@ static int record__mmap_evlist(struct record *rec,
|
||||
struct record_opts *opts = &rec->opts;
|
||||
char msg[512];
|
||||
|
||||
if (perf_evlist__mmap_ex(evlist, opts->mmap_pages, false,
|
||||
if (perf_evlist__mmap_ex(evlist, opts->mmap_pages,
|
||||
opts->auxtrace_mmap_pages,
|
||||
opts->auxtrace_snapshot_mode) < 0) {
|
||||
if (errno == EPERM) {
|
||||
@ -372,6 +372,8 @@ try_again:
|
||||
ui__error("%s\n", msg);
|
||||
goto out;
|
||||
}
|
||||
|
||||
pos->supported = true;
|
||||
}
|
||||
|
||||
if (perf_evlist__apply_filters(evlist, &pos)) {
|
||||
@ -408,8 +410,15 @@ static int process_sample_event(struct perf_tool *tool,
|
||||
{
|
||||
struct record *rec = container_of(tool, struct record, tool);
|
||||
|
||||
rec->samples++;
|
||||
if (rec->evlist->first_sample_time == 0)
|
||||
rec->evlist->first_sample_time = sample->time;
|
||||
|
||||
rec->evlist->last_sample_time = sample->time;
|
||||
|
||||
if (rec->buildid_all)
|
||||
return 0;
|
||||
|
||||
rec->samples++;
|
||||
return build_id__mark_dso_hit(tool, event, sample, evsel, machine);
|
||||
}
|
||||
|
||||
@ -434,9 +443,11 @@ static int process_buildids(struct record *rec)
|
||||
|
||||
/*
|
||||
* If --buildid-all is given, it marks all DSO regardless of hits,
|
||||
* so no need to process samples.
|
||||
* so no need to process samples. But if timestamp_boundary is enabled,
|
||||
* it still needs to walk on all samples to get the timestamps of
|
||||
* first/last samples.
|
||||
*/
|
||||
if (rec->buildid_all)
|
||||
if (rec->buildid_all && !rec->timestamp_boundary)
|
||||
rec->tool.sample = NULL;
|
||||
|
||||
return perf_session__process_events(session);
|
||||
@ -477,7 +488,7 @@ static struct perf_event_header finished_round_event = {
|
||||
};
|
||||
|
||||
static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist,
|
||||
bool backward)
|
||||
bool overwrite)
|
||||
{
|
||||
u64 bytes_written = rec->bytes_written;
|
||||
int i;
|
||||
@ -487,18 +498,18 @@ static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evli
|
||||
if (!evlist)
|
||||
return 0;
|
||||
|
||||
maps = backward ? evlist->backward_mmap : evlist->mmap;
|
||||
maps = overwrite ? evlist->overwrite_mmap : evlist->mmap;
|
||||
if (!maps)
|
||||
return 0;
|
||||
|
||||
if (backward && evlist->bkw_mmap_state != BKW_MMAP_DATA_PENDING)
|
||||
if (overwrite && evlist->bkw_mmap_state != BKW_MMAP_DATA_PENDING)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < evlist->nr_mmaps; i++) {
|
||||
struct auxtrace_mmap *mm = &maps[i].auxtrace_mmap;
|
||||
|
||||
if (maps[i].base) {
|
||||
if (perf_mmap__push(&maps[i], evlist->overwrite, backward, rec, record__pushfn) != 0) {
|
||||
if (perf_mmap__push(&maps[i], overwrite, rec, record__pushfn) != 0) {
|
||||
rc = -1;
|
||||
goto out;
|
||||
}
|
||||
@ -518,7 +529,7 @@ static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evli
|
||||
if (bytes_written != rec->bytes_written)
|
||||
rc = record__write(rec, &finished_round_event, sizeof(finished_round_event));
|
||||
|
||||
if (backward)
|
||||
if (overwrite)
|
||||
perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_EMPTY);
|
||||
out:
|
||||
return rc;
|
||||
@ -690,8 +701,8 @@ perf_evlist__pick_pc(struct perf_evlist *evlist)
|
||||
if (evlist) {
|
||||
if (evlist->mmap && evlist->mmap[0].base)
|
||||
return evlist->mmap[0].base;
|
||||
if (evlist->backward_mmap && evlist->backward_mmap[0].base)
|
||||
return evlist->backward_mmap[0].base;
|
||||
if (evlist->overwrite_mmap && evlist->overwrite_mmap[0].base)
|
||||
return evlist->overwrite_mmap[0].base;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -784,6 +795,28 @@ static int record__synthesize(struct record *rec, bool tail)
|
||||
perf_event__synthesize_guest_os, tool);
|
||||
}
|
||||
|
||||
err = perf_event__synthesize_extra_attr(&rec->tool,
|
||||
rec->evlist,
|
||||
process_synthesized_event,
|
||||
data->is_pipe);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = perf_event__synthesize_thread_map2(&rec->tool, rec->evlist->threads,
|
||||
process_synthesized_event,
|
||||
NULL);
|
||||
if (err < 0) {
|
||||
pr_err("Couldn't synthesize thread map.\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
err = perf_event__synthesize_cpu_map(&rec->tool, rec->evlist->cpus,
|
||||
process_synthesized_event, NULL);
|
||||
if (err < 0) {
|
||||
pr_err("Couldn't synthesize cpu map.\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
err = __machine__synthesize_threads(machine, tool, &opts->target, rec->evlist->threads,
|
||||
process_synthesized_event, opts->sample_address,
|
||||
opts->proc_map_timeout, 1);
|
||||
@ -1598,6 +1631,8 @@ static struct option __record_options[] = {
|
||||
"Record build-id of all DSOs regardless of hits"),
|
||||
OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename,
|
||||
"append timestamp to output filename"),
|
||||
OPT_BOOLEAN(0, "timestamp-boundary", &record.timestamp_boundary,
|
||||
"Record timestamp boundary (time of first/last samples)"),
|
||||
OPT_STRING_OPTARG_SET(0, "switch-output", &record.switch_output.str,
|
||||
&record.switch_output.set, "signal,size,time",
|
||||
"Switch output when receive SIGUSR2 or cross size,time threshold",
|
||||
@ -1781,8 +1816,8 @@ int cmd_record(int argc, const char **argv)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Enable ignoring missing threads when -u option is defined. */
|
||||
rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX;
|
||||
/* Enable ignoring missing threads when -u/-p option is defined. */
|
||||
rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX || rec->opts.target.pid;
|
||||
|
||||
err = -ENOMEM;
|
||||
if (perf_evlist__create_maps(rec->evlist, &rec->opts.target) < 0)
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "util/color.h"
|
||||
#include <linux/list.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/err.h>
|
||||
#include "util/symbol.h"
|
||||
#include "util/callchain.h"
|
||||
#include "util/values.h"
|
||||
@ -51,6 +52,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/mman.h>
|
||||
|
||||
struct report {
|
||||
struct perf_tool tool;
|
||||
@ -60,6 +62,9 @@ struct report {
|
||||
bool show_threads;
|
||||
bool inverted_callchain;
|
||||
bool mem_mode;
|
||||
bool stats_mode;
|
||||
bool tasks_mode;
|
||||
bool mmaps_mode;
|
||||
bool header;
|
||||
bool header_only;
|
||||
bool nonany_branch_mode;
|
||||
@ -69,7 +74,9 @@ struct report {
|
||||
const char *cpu_list;
|
||||
const char *symbol_filter_str;
|
||||
const char *time_str;
|
||||
struct perf_time_interval ptime;
|
||||
struct perf_time_interval *ptime_range;
|
||||
int range_size;
|
||||
int range_num;
|
||||
float min_percent;
|
||||
u64 nr_entries;
|
||||
u64 queue_size;
|
||||
@ -162,12 +169,28 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,
|
||||
struct hist_entry *he = iter->he;
|
||||
struct report *rep = arg;
|
||||
struct branch_info *bi;
|
||||
struct perf_sample *sample = iter->sample;
|
||||
struct perf_evsel *evsel = iter->evsel;
|
||||
int err;
|
||||
|
||||
if (!ui__has_annotation())
|
||||
return 0;
|
||||
|
||||
hist__account_cycles(sample->branch_stack, al, sample,
|
||||
rep->nonany_branch_mode);
|
||||
|
||||
bi = he->branch_info;
|
||||
err = addr_map_symbol__inc_samples(&bi->from, sample, evsel->idx);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = addr_map_symbol__inc_samples(&bi->to, sample, evsel->idx);
|
||||
|
||||
branch_type_count(&rep->brtype_stat, &bi->flags,
|
||||
bi->from.addr, bi->to.addr);
|
||||
|
||||
return 0;
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int process_sample_event(struct perf_tool *tool,
|
||||
@ -186,8 +209,10 @@ static int process_sample_event(struct perf_tool *tool,
|
||||
};
|
||||
int ret = 0;
|
||||
|
||||
if (perf_time__skip_sample(&rep->ptime, sample->time))
|
||||
if (perf_time__ranges_skip_sample(rep->ptime_range, rep->range_num,
|
||||
sample->time)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (machine__resolve(machine, &al, sample) < 0) {
|
||||
pr_debug("problem processing %d event, skipping it.\n",
|
||||
@ -312,9 +337,10 @@ static int report__setup_sample_type(struct report *rep)
|
||||
|
||||
if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) {
|
||||
if ((sample_type & PERF_SAMPLE_REGS_USER) &&
|
||||
(sample_type & PERF_SAMPLE_STACK_USER))
|
||||
(sample_type & PERF_SAMPLE_STACK_USER)) {
|
||||
callchain_param.record_mode = CALLCHAIN_DWARF;
|
||||
else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
|
||||
dwarf_callchain_users = true;
|
||||
} else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
|
||||
callchain_param.record_mode = CALLCHAIN_LBR;
|
||||
else
|
||||
callchain_param.record_mode = CALLCHAIN_FP;
|
||||
@ -377,6 +403,9 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report
|
||||
if (evname != NULL)
|
||||
ret += fprintf(fp, " of event '%s'", evname);
|
||||
|
||||
if (rep->time_str)
|
||||
ret += fprintf(fp, " (time slices: %s)", rep->time_str);
|
||||
|
||||
if (symbol_conf.show_ref_callgraph &&
|
||||
strstr(evname, "call-graph=no")) {
|
||||
ret += fprintf(fp, ", show reference callgraph");
|
||||
@ -567,6 +596,174 @@ static void report__output_resort(struct report *rep)
|
||||
ui_progress__finish();
|
||||
}
|
||||
|
||||
static void stats_setup(struct report *rep)
|
||||
{
|
||||
memset(&rep->tool, 0, sizeof(rep->tool));
|
||||
rep->tool.no_warn = true;
|
||||
}
|
||||
|
||||
static int stats_print(struct report *rep)
|
||||
{
|
||||
struct perf_session *session = rep->session;
|
||||
|
||||
perf_session__fprintf_nr_events(session, stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tasks_setup(struct report *rep)
|
||||
{
|
||||
memset(&rep->tool, 0, sizeof(rep->tool));
|
||||
if (rep->mmaps_mode) {
|
||||
rep->tool.mmap = perf_event__process_mmap;
|
||||
rep->tool.mmap2 = perf_event__process_mmap2;
|
||||
}
|
||||
rep->tool.comm = perf_event__process_comm;
|
||||
rep->tool.exit = perf_event__process_exit;
|
||||
rep->tool.fork = perf_event__process_fork;
|
||||
rep->tool.no_warn = true;
|
||||
}
|
||||
|
||||
struct task {
|
||||
struct thread *thread;
|
||||
struct list_head list;
|
||||
struct list_head children;
|
||||
};
|
||||
|
||||
static struct task *tasks_list(struct task *task, struct machine *machine)
|
||||
{
|
||||
struct thread *parent_thread, *thread = task->thread;
|
||||
struct task *parent_task;
|
||||
|
||||
/* Already listed. */
|
||||
if (!list_empty(&task->list))
|
||||
return NULL;
|
||||
|
||||
/* Last one in the chain. */
|
||||
if (thread->ppid == -1)
|
||||
return task;
|
||||
|
||||
parent_thread = machine__find_thread(machine, -1, thread->ppid);
|
||||
if (!parent_thread)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
parent_task = thread__priv(parent_thread);
|
||||
list_add_tail(&task->list, &parent_task->children);
|
||||
return tasks_list(parent_task, machine);
|
||||
}
|
||||
|
||||
static size_t maps__fprintf_task(struct maps *maps, int indent, FILE *fp)
|
||||
{
|
||||
size_t printed = 0;
|
||||
struct rb_node *nd;
|
||||
|
||||
for (nd = rb_first(&maps->entries); nd; nd = rb_next(nd)) {
|
||||
struct map *map = rb_entry(nd, struct map, rb_node);
|
||||
|
||||
printed += fprintf(fp, "%*s %" PRIx64 "-%" PRIx64 " %c%c%c%c %08" PRIx64 " %" PRIu64 " %s\n",
|
||||
indent, "", map->start, map->end,
|
||||
map->prot & PROT_READ ? 'r' : '-',
|
||||
map->prot & PROT_WRITE ? 'w' : '-',
|
||||
map->prot & PROT_EXEC ? 'x' : '-',
|
||||
map->flags & MAP_SHARED ? 's' : 'p',
|
||||
map->pgoff,
|
||||
map->ino, map->dso->name);
|
||||
}
|
||||
|
||||
return printed;
|
||||
}
|
||||
|
||||
static int map_groups__fprintf_task(struct map_groups *mg, int indent, FILE *fp)
|
||||
{
|
||||
int printed = 0, i;
|
||||
for (i = 0; i < MAP__NR_TYPES; ++i)
|
||||
printed += maps__fprintf_task(&mg->maps[i], indent, fp);
|
||||
return printed;
|
||||
}
|
||||
|
||||
static void task__print_level(struct task *task, FILE *fp, int level)
|
||||
{
|
||||
struct thread *thread = task->thread;
|
||||
struct task *child;
|
||||
int comm_indent = fprintf(fp, " %8d %8d %8d |%*s",
|
||||
thread->pid_, thread->tid, thread->ppid,
|
||||
level, "");
|
||||
|
||||
fprintf(fp, "%s\n", thread__comm_str(thread));
|
||||
|
||||
map_groups__fprintf_task(thread->mg, comm_indent, fp);
|
||||
|
||||
if (!list_empty(&task->children)) {
|
||||
list_for_each_entry(child, &task->children, list)
|
||||
task__print_level(child, fp, level + 1);
|
||||
}
|
||||
}
|
||||
|
||||
static int tasks_print(struct report *rep, FILE *fp)
|
||||
{
|
||||
struct perf_session *session = rep->session;
|
||||
struct machine *machine = &session->machines.host;
|
||||
struct task *tasks, *task;
|
||||
unsigned int nr = 0, itask = 0, i;
|
||||
struct rb_node *nd;
|
||||
LIST_HEAD(list);
|
||||
|
||||
/*
|
||||
* No locking needed while accessing machine->threads,
|
||||
* because --tasks is single threaded command.
|
||||
*/
|
||||
|
||||
/* Count all the threads. */
|
||||
for (i = 0; i < THREADS__TABLE_SIZE; i++)
|
||||
nr += machine->threads[i].nr;
|
||||
|
||||
tasks = malloc(sizeof(*tasks) * nr);
|
||||
if (!tasks)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < THREADS__TABLE_SIZE; i++) {
|
||||
struct threads *threads = &machine->threads[i];
|
||||
|
||||
for (nd = rb_first(&threads->entries); nd; nd = rb_next(nd)) {
|
||||
task = tasks + itask++;
|
||||
|
||||
task->thread = rb_entry(nd, struct thread, rb_node);
|
||||
INIT_LIST_HEAD(&task->children);
|
||||
INIT_LIST_HEAD(&task->list);
|
||||
thread__set_priv(task->thread, task);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Iterate every task down to the unprocessed parent
|
||||
* and link all in task children list. Task with no
|
||||
* parent is added into 'list'.
|
||||
*/
|
||||
for (itask = 0; itask < nr; itask++) {
|
||||
task = tasks + itask;
|
||||
|
||||
if (!list_empty(&task->list))
|
||||
continue;
|
||||
|
||||
task = tasks_list(task, machine);
|
||||
if (IS_ERR(task)) {
|
||||
pr_err("Error: failed to process tasks\n");
|
||||
free(tasks);
|
||||
return PTR_ERR(task);
|
||||
}
|
||||
|
||||
if (task)
|
||||
list_add_tail(&task->list, &list);
|
||||
}
|
||||
|
||||
fprintf(fp, "# %8s %8s %8s %s\n", "pid", "tid", "ppid", "comm");
|
||||
|
||||
list_for_each_entry(task, &list, list)
|
||||
task__print_level(task, fp, 0);
|
||||
|
||||
free(tasks);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __cmd_report(struct report *rep)
|
||||
{
|
||||
int ret;
|
||||
@ -598,12 +795,24 @@ static int __cmd_report(struct report *rep)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (rep->stats_mode)
|
||||
stats_setup(rep);
|
||||
|
||||
if (rep->tasks_mode)
|
||||
tasks_setup(rep);
|
||||
|
||||
ret = perf_session__process_events(session);
|
||||
if (ret) {
|
||||
ui__error("failed to process sample\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (rep->stats_mode)
|
||||
return stats_print(rep);
|
||||
|
||||
if (rep->tasks_mode)
|
||||
return tasks_print(rep, stdout);
|
||||
|
||||
report__warn_kptr_restrict(rep);
|
||||
|
||||
evlist__for_each_entry(session->evlist, pos)
|
||||
@ -760,6 +969,9 @@ int cmd_report(int argc, const char **argv)
|
||||
OPT_BOOLEAN('q', "quiet", &quiet, "Do not show any message"),
|
||||
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
|
||||
"dump raw trace in ASCII"),
|
||||
OPT_BOOLEAN(0, "stats", &report.stats_mode, "Display event stats"),
|
||||
OPT_BOOLEAN(0, "tasks", &report.tasks_mode, "Display recorded tasks"),
|
||||
OPT_BOOLEAN(0, "mmaps", &report.mmaps_mode, "Display recorded tasks memory maps"),
|
||||
OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
|
||||
"file", "vmlinux pathname"),
|
||||
OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
|
||||
@ -907,6 +1119,9 @@ int cmd_report(int argc, const char **argv)
|
||||
report.symbol_filter_str = argv[0];
|
||||
}
|
||||
|
||||
if (report.mmaps_mode)
|
||||
report.tasks_mode = true;
|
||||
|
||||
if (quiet)
|
||||
perf_quiet_option();
|
||||
|
||||
@ -921,13 +1136,6 @@ int cmd_report(int argc, const char **argv)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (report.use_stdio)
|
||||
use_browser = 0;
|
||||
else if (report.use_tui)
|
||||
use_browser = 1;
|
||||
else if (report.use_gtk)
|
||||
use_browser = 2;
|
||||
|
||||
if (report.inverted_callchain)
|
||||
callchain_param.order = ORDER_CALLER;
|
||||
if (symbol_conf.cumulate_callchain && !callchain_param.order_set)
|
||||
@ -1014,6 +1222,13 @@ repeat:
|
||||
perf_hpp_list.need_collapse = true;
|
||||
}
|
||||
|
||||
if (report.use_stdio)
|
||||
use_browser = 0;
|
||||
else if (report.use_tui)
|
||||
use_browser = 1;
|
||||
else if (report.use_gtk)
|
||||
use_browser = 2;
|
||||
|
||||
/* Force tty output for header output and per-thread stat. */
|
||||
if (report.header || report.header_only || report.show_threads)
|
||||
use_browser = 0;
|
||||
@ -1021,6 +1236,12 @@ repeat:
|
||||
report.tool.show_feat_hdr = SHOW_FEAT_HEADER;
|
||||
if (report.show_full_info)
|
||||
report.tool.show_feat_hdr = SHOW_FEAT_HEADER_FULL_INFO;
|
||||
if (report.stats_mode || report.tasks_mode)
|
||||
use_browser = 0;
|
||||
if (report.stats_mode && report.tasks_mode) {
|
||||
pr_err("Error: --tasks and --mmaps can't be used together with --stats\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (strcmp(input_name, "-") != 0)
|
||||
setup_browser(true);
|
||||
@ -1043,7 +1264,8 @@ repeat:
|
||||
ret = 0;
|
||||
goto error;
|
||||
}
|
||||
} else if (use_browser == 0 && !quiet) {
|
||||
} else if (use_browser == 0 && !quiet &&
|
||||
!report.stats_mode && !report.tasks_mode) {
|
||||
fputs("# To display the perf.data header info, please use --header/--header-only options.\n#\n",
|
||||
stdout);
|
||||
}
|
||||
@ -1077,9 +1299,36 @@ repeat:
|
||||
if (symbol__init(&session->header.env) < 0)
|
||||
goto error;
|
||||
|
||||
if (perf_time__parse_str(&report.ptime, report.time_str) != 0) {
|
||||
pr_err("Invalid time string\n");
|
||||
return -EINVAL;
|
||||
report.ptime_range = perf_time__range_alloc(report.time_str,
|
||||
&report.range_size);
|
||||
if (!report.ptime_range) {
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (perf_time__parse_str(report.ptime_range, report.time_str) != 0) {
|
||||
if (session->evlist->first_sample_time == 0 &&
|
||||
session->evlist->last_sample_time == 0) {
|
||||
pr_err("HINT: no first/last sample time found in perf data.\n"
|
||||
"Please use latest perf binary to execute 'perf record'\n"
|
||||
"(if '--buildid-all' is enabled, please set '--timestamp-boundary').\n");
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
report.range_num = perf_time__percent_parse_str(
|
||||
report.ptime_range, report.range_size,
|
||||
report.time_str,
|
||||
session->evlist->first_sample_time,
|
||||
session->evlist->last_sample_time);
|
||||
|
||||
if (report.range_num < 0) {
|
||||
pr_err("Invalid time string\n");
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
report.range_num = 1;
|
||||
}
|
||||
|
||||
sort__setup_elide(stdout);
|
||||
@ -1092,6 +1341,8 @@ repeat:
|
||||
ret = 0;
|
||||
|
||||
error:
|
||||
zfree(&report.ptime_range);
|
||||
|
||||
perf_session__delete(session);
|
||||
return ret;
|
||||
}
|
||||
|
@ -22,9 +22,11 @@
|
||||
#include "util/cpumap.h"
|
||||
#include "util/thread_map.h"
|
||||
#include "util/stat.h"
|
||||
#include "util/color.h"
|
||||
#include "util/string2.h"
|
||||
#include "util/thread-stack.h"
|
||||
#include "util/time-utils.h"
|
||||
#include "util/path.h"
|
||||
#include "print_binary.h"
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/kernel.h>
|
||||
@ -40,6 +42,7 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "sane_ctype.h"
|
||||
@ -90,6 +93,8 @@ enum perf_output_field {
|
||||
PERF_OUTPUT_SYNTH = 1U << 25,
|
||||
PERF_OUTPUT_PHYS_ADDR = 1U << 26,
|
||||
PERF_OUTPUT_UREGS = 1U << 27,
|
||||
PERF_OUTPUT_METRIC = 1U << 28,
|
||||
PERF_OUTPUT_MISC = 1U << 29,
|
||||
};
|
||||
|
||||
struct output_option {
|
||||
@ -124,6 +129,8 @@ struct output_option {
|
||||
{.str = "brstackoff", .field = PERF_OUTPUT_BRSTACKOFF},
|
||||
{.str = "synth", .field = PERF_OUTPUT_SYNTH},
|
||||
{.str = "phys_addr", .field = PERF_OUTPUT_PHYS_ADDR},
|
||||
{.str = "metric", .field = PERF_OUTPUT_METRIC},
|
||||
{.str = "misc", .field = PERF_OUTPUT_MISC},
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -215,12 +222,20 @@ struct perf_evsel_script {
|
||||
char *filename;
|
||||
FILE *fp;
|
||||
u64 samples;
|
||||
/* For metric output */
|
||||
u64 val;
|
||||
int gnum;
|
||||
};
|
||||
|
||||
static inline struct perf_evsel_script *evsel_script(struct perf_evsel *evsel)
|
||||
{
|
||||
return (struct perf_evsel_script *)evsel->priv;
|
||||
}
|
||||
|
||||
static struct perf_evsel_script *perf_evsel_script__new(struct perf_evsel *evsel,
|
||||
struct perf_data *data)
|
||||
{
|
||||
struct perf_evsel_script *es = malloc(sizeof(*es));
|
||||
struct perf_evsel_script *es = zalloc(sizeof(*es));
|
||||
|
||||
if (es != NULL) {
|
||||
if (asprintf(&es->filename, "%s.%s.dump", data->file.path, perf_evsel__name(evsel)) < 0)
|
||||
@ -228,7 +243,6 @@ static struct perf_evsel_script *perf_evsel_script__new(struct perf_evsel *evsel
|
||||
es->fp = fopen(es->filename, "w");
|
||||
if (es->fp == NULL)
|
||||
goto out_free_filename;
|
||||
es->samples = 0;
|
||||
}
|
||||
|
||||
return es;
|
||||
@ -423,11 +437,6 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
|
||||
PERF_OUTPUT_CPU, allow_user_set))
|
||||
return -EINVAL;
|
||||
|
||||
if (PRINT_FIELD(PERIOD) &&
|
||||
perf_evsel__check_stype(evsel, PERF_SAMPLE_PERIOD, "PERIOD",
|
||||
PERF_OUTPUT_PERIOD))
|
||||
return -EINVAL;
|
||||
|
||||
if (PRINT_FIELD(IREGS) &&
|
||||
perf_evsel__check_stype(evsel, PERF_SAMPLE_REGS_INTR, "IREGS",
|
||||
PERF_OUTPUT_IREGS))
|
||||
@ -588,7 +597,8 @@ static int perf_sample__fprintf_uregs(struct perf_sample *sample,
|
||||
|
||||
static int perf_sample__fprintf_start(struct perf_sample *sample,
|
||||
struct thread *thread,
|
||||
struct perf_evsel *evsel, FILE *fp)
|
||||
struct perf_evsel *evsel,
|
||||
u32 type, FILE *fp)
|
||||
{
|
||||
struct perf_event_attr *attr = &evsel->attr;
|
||||
unsigned long secs;
|
||||
@ -618,6 +628,47 @@ static int perf_sample__fprintf_start(struct perf_sample *sample,
|
||||
printed += fprintf(fp, "[%03d] ", sample->cpu);
|
||||
}
|
||||
|
||||
if (PRINT_FIELD(MISC)) {
|
||||
int ret = 0;
|
||||
|
||||
#define has(m) \
|
||||
(sample->misc & PERF_RECORD_MISC_##m) == PERF_RECORD_MISC_##m
|
||||
|
||||
if (has(KERNEL))
|
||||
ret += fprintf(fp, "K");
|
||||
if (has(USER))
|
||||
ret += fprintf(fp, "U");
|
||||
if (has(HYPERVISOR))
|
||||
ret += fprintf(fp, "H");
|
||||
if (has(GUEST_KERNEL))
|
||||
ret += fprintf(fp, "G");
|
||||
if (has(GUEST_USER))
|
||||
ret += fprintf(fp, "g");
|
||||
|
||||
switch (type) {
|
||||
case PERF_RECORD_MMAP:
|
||||
case PERF_RECORD_MMAP2:
|
||||
if (has(MMAP_DATA))
|
||||
ret += fprintf(fp, "M");
|
||||
break;
|
||||
case PERF_RECORD_COMM:
|
||||
if (has(COMM_EXEC))
|
||||
ret += fprintf(fp, "E");
|
||||
break;
|
||||
case PERF_RECORD_SWITCH:
|
||||
case PERF_RECORD_SWITCH_CPU_WIDE:
|
||||
if (has(SWITCH_OUT))
|
||||
ret += fprintf(fp, "S");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
#undef has
|
||||
|
||||
ret += fprintf(fp, "%*s", 6 - ret, " ");
|
||||
printed += ret;
|
||||
}
|
||||
|
||||
if (PRINT_FIELD(TIME)) {
|
||||
nsecs = sample->time;
|
||||
secs = nsecs / NSEC_PER_SEC;
|
||||
@ -1437,13 +1488,16 @@ struct perf_script {
|
||||
bool show_mmap_events;
|
||||
bool show_switch_events;
|
||||
bool show_namespace_events;
|
||||
bool show_lost_events;
|
||||
bool allocated;
|
||||
bool per_event_dump;
|
||||
struct cpu_map *cpus;
|
||||
struct thread_map *threads;
|
||||
int name_width;
|
||||
const char *time_str;
|
||||
struct perf_time_interval ptime;
|
||||
struct perf_time_interval *ptime_range;
|
||||
int range_size;
|
||||
int range_num;
|
||||
};
|
||||
|
||||
static int perf_evlist__max_name_len(struct perf_evlist *evlist)
|
||||
@ -1477,6 +1531,88 @@ static int data_src__fprintf(u64 data_src, FILE *fp)
|
||||
return fprintf(fp, "%-*s", maxlen, out);
|
||||
}
|
||||
|
||||
struct metric_ctx {
|
||||
struct perf_sample *sample;
|
||||
struct thread *thread;
|
||||
struct perf_evsel *evsel;
|
||||
FILE *fp;
|
||||
};
|
||||
|
||||
static void script_print_metric(void *ctx, const char *color,
|
||||
const char *fmt,
|
||||
const char *unit, double val)
|
||||
{
|
||||
struct metric_ctx *mctx = ctx;
|
||||
|
||||
if (!fmt)
|
||||
return;
|
||||
perf_sample__fprintf_start(mctx->sample, mctx->thread, mctx->evsel,
|
||||
PERF_RECORD_SAMPLE, mctx->fp);
|
||||
fputs("\tmetric: ", mctx->fp);
|
||||
if (color)
|
||||
color_fprintf(mctx->fp, color, fmt, val);
|
||||
else
|
||||
printf(fmt, val);
|
||||
fprintf(mctx->fp, " %s\n", unit);
|
||||
}
|
||||
|
||||
static void script_new_line(void *ctx)
|
||||
{
|
||||
struct metric_ctx *mctx = ctx;
|
||||
|
||||
perf_sample__fprintf_start(mctx->sample, mctx->thread, mctx->evsel,
|
||||
PERF_RECORD_SAMPLE, mctx->fp);
|
||||
fputs("\tmetric: ", mctx->fp);
|
||||
}
|
||||
|
||||
static void perf_sample__fprint_metric(struct perf_script *script,
|
||||
struct thread *thread,
|
||||
struct perf_evsel *evsel,
|
||||
struct perf_sample *sample,
|
||||
FILE *fp)
|
||||
{
|
||||
struct perf_stat_output_ctx ctx = {
|
||||
.print_metric = script_print_metric,
|
||||
.new_line = script_new_line,
|
||||
.ctx = &(struct metric_ctx) {
|
||||
.sample = sample,
|
||||
.thread = thread,
|
||||
.evsel = evsel,
|
||||
.fp = fp,
|
||||
},
|
||||
.force_header = false,
|
||||
};
|
||||
struct perf_evsel *ev2;
|
||||
static bool init;
|
||||
u64 val;
|
||||
|
||||
if (!init) {
|
||||
perf_stat__init_shadow_stats();
|
||||
init = true;
|
||||
}
|
||||
if (!evsel->stats)
|
||||
perf_evlist__alloc_stats(script->session->evlist, false);
|
||||
if (evsel_script(evsel->leader)->gnum++ == 0)
|
||||
perf_stat__reset_shadow_stats();
|
||||
val = sample->period * evsel->scale;
|
||||
perf_stat__update_shadow_stats(evsel,
|
||||
val,
|
||||
sample->cpu,
|
||||
&rt_stat);
|
||||
evsel_script(evsel)->val = val;
|
||||
if (evsel_script(evsel->leader)->gnum == evsel->leader->nr_members) {
|
||||
for_each_group_member (ev2, evsel->leader) {
|
||||
perf_stat__print_shadow_stats(ev2,
|
||||
evsel_script(ev2)->val,
|
||||
sample->cpu,
|
||||
&ctx,
|
||||
NULL,
|
||||
&rt_stat);
|
||||
}
|
||||
evsel_script(evsel->leader)->gnum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void process_event(struct perf_script *script,
|
||||
struct perf_sample *sample, struct perf_evsel *evsel,
|
||||
struct addr_location *al,
|
||||
@ -1493,7 +1629,8 @@ static void process_event(struct perf_script *script,
|
||||
|
||||
++es->samples;
|
||||
|
||||
perf_sample__fprintf_start(sample, thread, evsel, fp);
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_SAMPLE, fp);
|
||||
|
||||
if (PRINT_FIELD(PERIOD))
|
||||
fprintf(fp, "%10" PRIu64 " ", sample->period);
|
||||
@ -1564,6 +1701,9 @@ static void process_event(struct perf_script *script,
|
||||
if (PRINT_FIELD(PHYS_ADDR))
|
||||
fprintf(fp, "%16" PRIx64, sample->phys_addr);
|
||||
fprintf(fp, "\n");
|
||||
|
||||
if (PRINT_FIELD(METRIC))
|
||||
perf_sample__fprint_metric(script, thread, evsel, sample, fp);
|
||||
}
|
||||
|
||||
static struct scripting_ops *scripting_ops;
|
||||
@ -1643,8 +1783,10 @@ static int process_sample_event(struct perf_tool *tool,
|
||||
struct perf_script *scr = container_of(tool, struct perf_script, tool);
|
||||
struct addr_location al;
|
||||
|
||||
if (perf_time__skip_sample(&scr->ptime, sample->time))
|
||||
if (perf_time__ranges_skip_sample(scr->ptime_range, scr->range_num,
|
||||
sample->time)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (debug_mode) {
|
||||
if (sample->time < last_timestamp) {
|
||||
@ -1737,7 +1879,8 @@ static int process_comm_event(struct perf_tool *tool,
|
||||
sample->tid = event->comm.tid;
|
||||
sample->pid = event->comm.pid;
|
||||
}
|
||||
perf_sample__fprintf_start(sample, thread, evsel, stdout);
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_COMM, stdout);
|
||||
perf_event__fprintf(event, stdout);
|
||||
ret = 0;
|
||||
out:
|
||||
@ -1772,7 +1915,8 @@ static int process_namespaces_event(struct perf_tool *tool,
|
||||
sample->tid = event->namespaces.tid;
|
||||
sample->pid = event->namespaces.pid;
|
||||
}
|
||||
perf_sample__fprintf_start(sample, thread, evsel, stdout);
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_NAMESPACES, stdout);
|
||||
perf_event__fprintf(event, stdout);
|
||||
ret = 0;
|
||||
out:
|
||||
@ -1805,7 +1949,8 @@ static int process_fork_event(struct perf_tool *tool,
|
||||
sample->tid = event->fork.tid;
|
||||
sample->pid = event->fork.pid;
|
||||
}
|
||||
perf_sample__fprintf_start(sample, thread, evsel, stdout);
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_FORK, stdout);
|
||||
perf_event__fprintf(event, stdout);
|
||||
thread__put(thread);
|
||||
|
||||
@ -1834,7 +1979,8 @@ static int process_exit_event(struct perf_tool *tool,
|
||||
sample->tid = event->fork.tid;
|
||||
sample->pid = event->fork.pid;
|
||||
}
|
||||
perf_sample__fprintf_start(sample, thread, evsel, stdout);
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_EXIT, stdout);
|
||||
perf_event__fprintf(event, stdout);
|
||||
|
||||
if (perf_event__process_exit(tool, event, sample, machine) < 0)
|
||||
@ -1869,7 +2015,8 @@ static int process_mmap_event(struct perf_tool *tool,
|
||||
sample->tid = event->mmap.tid;
|
||||
sample->pid = event->mmap.pid;
|
||||
}
|
||||
perf_sample__fprintf_start(sample, thread, evsel, stdout);
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_MMAP, stdout);
|
||||
perf_event__fprintf(event, stdout);
|
||||
thread__put(thread);
|
||||
return 0;
|
||||
@ -1900,7 +2047,8 @@ static int process_mmap2_event(struct perf_tool *tool,
|
||||
sample->tid = event->mmap2.tid;
|
||||
sample->pid = event->mmap2.pid;
|
||||
}
|
||||
perf_sample__fprintf_start(sample, thread, evsel, stdout);
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_MMAP2, stdout);
|
||||
perf_event__fprintf(event, stdout);
|
||||
thread__put(thread);
|
||||
return 0;
|
||||
@ -1926,7 +2074,31 @@ static int process_switch_event(struct perf_tool *tool,
|
||||
return -1;
|
||||
}
|
||||
|
||||
perf_sample__fprintf_start(sample, thread, evsel, stdout);
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_SWITCH, stdout);
|
||||
perf_event__fprintf(event, stdout);
|
||||
thread__put(thread);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
process_lost_event(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
struct machine *machine)
|
||||
{
|
||||
struct perf_script *script = container_of(tool, struct perf_script, tool);
|
||||
struct perf_session *session = script->session;
|
||||
struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);
|
||||
struct thread *thread;
|
||||
|
||||
thread = machine__findnew_thread(machine, sample->pid,
|
||||
sample->tid);
|
||||
if (thread == NULL)
|
||||
return -1;
|
||||
|
||||
perf_sample__fprintf_start(sample, thread, evsel,
|
||||
PERF_RECORD_LOST, stdout);
|
||||
perf_event__fprintf(event, stdout);
|
||||
thread__put(thread);
|
||||
return 0;
|
||||
@ -2026,6 +2198,8 @@ static int __cmd_script(struct perf_script *script)
|
||||
script->tool.context_switch = process_switch_event;
|
||||
if (script->show_namespace_events)
|
||||
script->tool.namespaces = process_namespaces_event;
|
||||
if (script->show_lost_events)
|
||||
script->tool.lost = process_lost_event;
|
||||
|
||||
if (perf_script__setup_per_event_dump(script)) {
|
||||
pr_err("Couldn't create the per event dump files\n");
|
||||
@ -2311,19 +2485,6 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Helper function for filesystems that return a dent->d_type DT_UNKNOWN */
|
||||
static int is_directory(const char *base_path, const struct dirent *dent)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
struct stat st;
|
||||
|
||||
sprintf(path, "%s/%s", base_path, dent->d_name);
|
||||
if (stat(path, &st))
|
||||
return 0;
|
||||
|
||||
return S_ISDIR(st.st_mode);
|
||||
}
|
||||
|
||||
#define for_each_lang(scripts_path, scripts_dir, lang_dirent) \
|
||||
while ((lang_dirent = readdir(scripts_dir)) != NULL) \
|
||||
if ((lang_dirent->d_type == DT_DIR || \
|
||||
@ -2758,9 +2919,10 @@ static void script__setup_sample_type(struct perf_script *script)
|
||||
|
||||
if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) {
|
||||
if ((sample_type & PERF_SAMPLE_REGS_USER) &&
|
||||
(sample_type & PERF_SAMPLE_STACK_USER))
|
||||
(sample_type & PERF_SAMPLE_STACK_USER)) {
|
||||
callchain_param.record_mode = CALLCHAIN_DWARF;
|
||||
else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
|
||||
dwarf_callchain_users = true;
|
||||
} else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
|
||||
callchain_param.record_mode = CALLCHAIN_LBR;
|
||||
else
|
||||
callchain_param.record_mode = CALLCHAIN_FP;
|
||||
@ -2975,6 +3137,8 @@ int cmd_script(int argc, const char **argv)
|
||||
"Show context switch events (if recorded)"),
|
||||
OPT_BOOLEAN('\0', "show-namespace-events", &script.show_namespace_events,
|
||||
"Show namespace events (if recorded)"),
|
||||
OPT_BOOLEAN('\0', "show-lost-events", &script.show_lost_events,
|
||||
"Show lost events (if recorded)"),
|
||||
OPT_BOOLEAN('\0', "per-event-dump", &script.per_event_dump,
|
||||
"Dump trace output to files named by the monitored events"),
|
||||
OPT_BOOLEAN('f', "force", &symbol_conf.force, "don't complain, do it"),
|
||||
@ -3281,18 +3445,46 @@ int cmd_script(int argc, const char **argv)
|
||||
if (err < 0)
|
||||
goto out_delete;
|
||||
|
||||
/* needs to be parsed after looking up reference time */
|
||||
if (perf_time__parse_str(&script.ptime, script.time_str) != 0) {
|
||||
pr_err("Invalid time string\n");
|
||||
err = -EINVAL;
|
||||
script.ptime_range = perf_time__range_alloc(script.time_str,
|
||||
&script.range_size);
|
||||
if (!script.ptime_range) {
|
||||
err = -ENOMEM;
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
/* needs to be parsed after looking up reference time */
|
||||
if (perf_time__parse_str(script.ptime_range, script.time_str) != 0) {
|
||||
if (session->evlist->first_sample_time == 0 &&
|
||||
session->evlist->last_sample_time == 0) {
|
||||
pr_err("HINT: no first/last sample time found in perf data.\n"
|
||||
"Please use latest perf binary to execute 'perf record'\n"
|
||||
"(if '--buildid-all' is enabled, please set '--timestamp-boundary').\n");
|
||||
err = -EINVAL;
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
script.range_num = perf_time__percent_parse_str(
|
||||
script.ptime_range, script.range_size,
|
||||
script.time_str,
|
||||
session->evlist->first_sample_time,
|
||||
session->evlist->last_sample_time);
|
||||
|
||||
if (script.range_num < 0) {
|
||||
pr_err("Invalid time string\n");
|
||||
err = -EINVAL;
|
||||
goto out_delete;
|
||||
}
|
||||
} else {
|
||||
script.range_num = 1;
|
||||
}
|
||||
|
||||
err = __cmd_script(&script);
|
||||
|
||||
flush_scripting();
|
||||
|
||||
out_delete:
|
||||
zfree(&script.ptime_range);
|
||||
|
||||
perf_evlist__free_stats(session->evlist);
|
||||
perf_session__delete(session);
|
||||
|
||||
|
@ -63,7 +63,6 @@
|
||||
#include "util/group.h"
|
||||
#include "util/session.h"
|
||||
#include "util/tool.h"
|
||||
#include "util/group.h"
|
||||
#include "util/string2.h"
|
||||
#include "util/metricgroup.h"
|
||||
#include "asm/bug.h"
|
||||
@ -214,8 +213,13 @@ static inline void diff_timespec(struct timespec *r, struct timespec *a,
|
||||
|
||||
static void perf_stat__reset_stats(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
perf_evlist__reset_stats(evsel_list);
|
||||
perf_stat__reset_shadow_stats();
|
||||
|
||||
for (i = 0; i < stat_config.stats_num; i++)
|
||||
perf_stat__reset_shadow_per_stat(&stat_config.stats[i]);
|
||||
}
|
||||
|
||||
static int create_perf_stat_counter(struct perf_evsel *evsel)
|
||||
@ -272,7 +276,7 @@ static int create_perf_stat_counter(struct perf_evsel *evsel)
|
||||
attr->enable_on_exec = 1;
|
||||
}
|
||||
|
||||
if (target__has_cpu(&target))
|
||||
if (target__has_cpu(&target) && !target__has_per_thread(&target))
|
||||
return perf_evsel__open_per_cpu(evsel, perf_evsel__cpus(evsel));
|
||||
|
||||
return perf_evsel__open_per_thread(evsel, evsel_list->threads);
|
||||
@ -335,7 +339,7 @@ static int read_counter(struct perf_evsel *counter)
|
||||
int nthreads = thread_map__nr(evsel_list->threads);
|
||||
int ncpus, cpu, thread;
|
||||
|
||||
if (target__has_cpu(&target))
|
||||
if (target__has_cpu(&target) && !target__has_per_thread(&target))
|
||||
ncpus = perf_evsel__nr_cpus(counter);
|
||||
else
|
||||
ncpus = 1;
|
||||
@ -458,19 +462,8 @@ static void workload_exec_failed_signal(int signo __maybe_unused, siginfo_t *inf
|
||||
workload_exec_errno = info->si_value.sival_int;
|
||||
}
|
||||
|
||||
static bool has_unit(struct perf_evsel *counter)
|
||||
{
|
||||
return counter->unit && *counter->unit;
|
||||
}
|
||||
|
||||
static bool has_scale(struct perf_evsel *counter)
|
||||
{
|
||||
return counter->scale != 1;
|
||||
}
|
||||
|
||||
static int perf_stat_synthesize_config(bool is_pipe)
|
||||
{
|
||||
struct perf_evsel *counter;
|
||||
int err;
|
||||
|
||||
if (is_pipe) {
|
||||
@ -482,53 +475,10 @@ static int perf_stat_synthesize_config(bool is_pipe)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Synthesize other events stuff not carried within
|
||||
* attr event - unit, scale, name
|
||||
*/
|
||||
evlist__for_each_entry(evsel_list, counter) {
|
||||
if (!counter->supported)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Synthesize unit and scale only if it's defined.
|
||||
*/
|
||||
if (has_unit(counter)) {
|
||||
err = perf_event__synthesize_event_update_unit(NULL, counter, process_synthesized_event);
|
||||
if (err < 0) {
|
||||
pr_err("Couldn't synthesize evsel unit.\n");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if (has_scale(counter)) {
|
||||
err = perf_event__synthesize_event_update_scale(NULL, counter, process_synthesized_event);
|
||||
if (err < 0) {
|
||||
pr_err("Couldn't synthesize evsel scale.\n");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if (counter->own_cpus) {
|
||||
err = perf_event__synthesize_event_update_cpus(NULL, counter, process_synthesized_event);
|
||||
if (err < 0) {
|
||||
pr_err("Couldn't synthesize evsel scale.\n");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Name is needed only for pipe output,
|
||||
* perf.data carries event names.
|
||||
*/
|
||||
if (is_pipe) {
|
||||
err = perf_event__synthesize_event_update_name(NULL, counter, process_synthesized_event);
|
||||
if (err < 0) {
|
||||
pr_err("Couldn't synthesize evsel name.\n");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
}
|
||||
err = perf_event__synthesize_extra_attr(NULL,
|
||||
evsel_list,
|
||||
process_synthesized_event,
|
||||
is_pipe);
|
||||
|
||||
err = perf_event__synthesize_thread_map2(NULL, evsel_list->threads,
|
||||
process_synthesized_event,
|
||||
@ -1151,7 +1101,8 @@ static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)
|
||||
}
|
||||
|
||||
static void printout(int id, int nr, struct perf_evsel *counter, double uval,
|
||||
char *prefix, u64 run, u64 ena, double noise)
|
||||
char *prefix, u64 run, u64 ena, double noise,
|
||||
struct runtime_stat *st)
|
||||
{
|
||||
struct perf_stat_output_ctx out;
|
||||
struct outstate os = {
|
||||
@ -1244,7 +1195,7 @@ static void printout(int id, int nr, struct perf_evsel *counter, double uval,
|
||||
|
||||
perf_stat__print_shadow_stats(counter, uval,
|
||||
first_shadow_cpu(counter, id),
|
||||
&out, &metric_events);
|
||||
&out, &metric_events, st);
|
||||
if (!csv_output && !metric_only) {
|
||||
print_noise(counter, noise);
|
||||
print_running(run, ena);
|
||||
@ -1268,7 +1219,8 @@ static void aggr_update_shadow(void)
|
||||
val += perf_counts(counter->counts, cpu, 0)->val;
|
||||
}
|
||||
perf_stat__update_shadow_stats(counter, val,
|
||||
first_shadow_cpu(counter, id));
|
||||
first_shadow_cpu(counter, id),
|
||||
&rt_stat);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1388,7 +1340,8 @@ static void print_aggr(char *prefix)
|
||||
fprintf(output, "%s", prefix);
|
||||
|
||||
uval = val * counter->scale;
|
||||
printout(id, nr, counter, uval, prefix, run, ena, 1.0);
|
||||
printout(id, nr, counter, uval, prefix, run, ena, 1.0,
|
||||
&rt_stat);
|
||||
if (!metric_only)
|
||||
fputc('\n', output);
|
||||
}
|
||||
@ -1397,13 +1350,24 @@ static void print_aggr(char *prefix)
|
||||
}
|
||||
}
|
||||
|
||||
static void print_aggr_thread(struct perf_evsel *counter, char *prefix)
|
||||
static int cmp_val(const void *a, const void *b)
|
||||
{
|
||||
FILE *output = stat_config.output;
|
||||
int nthreads = thread_map__nr(counter->threads);
|
||||
int ncpus = cpu_map__nr(counter->cpus);
|
||||
int cpu, thread;
|
||||
return ((struct perf_aggr_thread_value *)b)->val -
|
||||
((struct perf_aggr_thread_value *)a)->val;
|
||||
}
|
||||
|
||||
static struct perf_aggr_thread_value *sort_aggr_thread(
|
||||
struct perf_evsel *counter,
|
||||
int nthreads, int ncpus,
|
||||
int *ret)
|
||||
{
|
||||
int cpu, thread, i = 0;
|
||||
double uval;
|
||||
struct perf_aggr_thread_value *buf;
|
||||
|
||||
buf = calloc(nthreads, sizeof(struct perf_aggr_thread_value));
|
||||
if (!buf)
|
||||
return NULL;
|
||||
|
||||
for (thread = 0; thread < nthreads; thread++) {
|
||||
u64 ena = 0, run = 0, val = 0;
|
||||
@ -1414,13 +1378,63 @@ static void print_aggr_thread(struct perf_evsel *counter, char *prefix)
|
||||
run += perf_counts(counter->counts, cpu, thread)->run;
|
||||
}
|
||||
|
||||
uval = val * counter->scale;
|
||||
|
||||
/*
|
||||
* Skip value 0 when enabling --per-thread globally,
|
||||
* otherwise too many 0 output.
|
||||
*/
|
||||
if (uval == 0.0 && target__has_per_thread(&target))
|
||||
continue;
|
||||
|
||||
buf[i].counter = counter;
|
||||
buf[i].id = thread;
|
||||
buf[i].uval = uval;
|
||||
buf[i].val = val;
|
||||
buf[i].run = run;
|
||||
buf[i].ena = ena;
|
||||
i++;
|
||||
}
|
||||
|
||||
qsort(buf, i, sizeof(struct perf_aggr_thread_value), cmp_val);
|
||||
|
||||
if (ret)
|
||||
*ret = i;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void print_aggr_thread(struct perf_evsel *counter, char *prefix)
|
||||
{
|
||||
FILE *output = stat_config.output;
|
||||
int nthreads = thread_map__nr(counter->threads);
|
||||
int ncpus = cpu_map__nr(counter->cpus);
|
||||
int thread, sorted_threads, id;
|
||||
struct perf_aggr_thread_value *buf;
|
||||
|
||||
buf = sort_aggr_thread(counter, nthreads, ncpus, &sorted_threads);
|
||||
if (!buf) {
|
||||
perror("cannot sort aggr thread");
|
||||
return;
|
||||
}
|
||||
|
||||
for (thread = 0; thread < sorted_threads; thread++) {
|
||||
if (prefix)
|
||||
fprintf(output, "%s", prefix);
|
||||
|
||||
uval = val * counter->scale;
|
||||
printout(thread, 0, counter, uval, prefix, run, ena, 1.0);
|
||||
id = buf[thread].id;
|
||||
if (stat_config.stats)
|
||||
printout(id, 0, buf[thread].counter, buf[thread].uval,
|
||||
prefix, buf[thread].run, buf[thread].ena, 1.0,
|
||||
&stat_config.stats[id]);
|
||||
else
|
||||
printout(id, 0, buf[thread].counter, buf[thread].uval,
|
||||
prefix, buf[thread].run, buf[thread].ena, 1.0,
|
||||
&rt_stat);
|
||||
fputc('\n', output);
|
||||
}
|
||||
|
||||
free(buf);
|
||||
}
|
||||
|
||||
struct caggr_data {
|
||||
@ -1455,7 +1469,8 @@ static void print_counter_aggr(struct perf_evsel *counter, char *prefix)
|
||||
fprintf(output, "%s", prefix);
|
||||
|
||||
uval = cd.avg * counter->scale;
|
||||
printout(-1, 0, counter, uval, prefix, cd.avg_running, cd.avg_enabled, cd.avg);
|
||||
printout(-1, 0, counter, uval, prefix, cd.avg_running, cd.avg_enabled,
|
||||
cd.avg, &rt_stat);
|
||||
if (!metric_only)
|
||||
fprintf(output, "\n");
|
||||
}
|
||||
@ -1494,7 +1509,8 @@ static void print_counter(struct perf_evsel *counter, char *prefix)
|
||||
fprintf(output, "%s", prefix);
|
||||
|
||||
uval = val * counter->scale;
|
||||
printout(cpu, 0, counter, uval, prefix, run, ena, 1.0);
|
||||
printout(cpu, 0, counter, uval, prefix, run, ena, 1.0,
|
||||
&rt_stat);
|
||||
|
||||
fputc('\n', output);
|
||||
}
|
||||
@ -1526,7 +1542,8 @@ static void print_no_aggr_metric(char *prefix)
|
||||
run = perf_counts(counter->counts, cpu, 0)->run;
|
||||
|
||||
uval = val * counter->scale;
|
||||
printout(cpu, 0, counter, uval, prefix, run, ena, 1.0);
|
||||
printout(cpu, 0, counter, uval, prefix, run, ena, 1.0,
|
||||
&rt_stat);
|
||||
}
|
||||
fputc('\n', stat_config.output);
|
||||
}
|
||||
@ -1582,7 +1599,8 @@ static void print_metric_headers(const char *prefix, bool no_indent)
|
||||
perf_stat__print_shadow_stats(counter, 0,
|
||||
0,
|
||||
&out,
|
||||
&metric_events);
|
||||
&metric_events,
|
||||
&rt_stat);
|
||||
}
|
||||
fputc('\n', stat_config.output);
|
||||
}
|
||||
@ -2541,6 +2559,35 @@ int process_cpu_map_event(struct perf_tool *tool,
|
||||
return set_maps(st);
|
||||
}
|
||||
|
||||
static int runtime_stat_new(struct perf_stat_config *config, int nthreads)
|
||||
{
|
||||
int i;
|
||||
|
||||
config->stats = calloc(nthreads, sizeof(struct runtime_stat));
|
||||
if (!config->stats)
|
||||
return -1;
|
||||
|
||||
config->stats_num = nthreads;
|
||||
|
||||
for (i = 0; i < nthreads; i++)
|
||||
runtime_stat__init(&config->stats[i]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void runtime_stat_delete(struct perf_stat_config *config)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!config->stats)
|
||||
return;
|
||||
|
||||
for (i = 0; i < config->stats_num; i++)
|
||||
runtime_stat__exit(&config->stats[i]);
|
||||
|
||||
free(config->stats);
|
||||
}
|
||||
|
||||
static const char * const stat_report_usage[] = {
|
||||
"perf stat report [<options>]",
|
||||
NULL,
|
||||
@ -2750,12 +2797,16 @@ int cmd_stat(int argc, const char **argv)
|
||||
run_count = 1;
|
||||
}
|
||||
|
||||
if ((stat_config.aggr_mode == AGGR_THREAD) && !target__has_task(&target)) {
|
||||
fprintf(stderr, "The --per-thread option is only available "
|
||||
"when monitoring via -p -t options.\n");
|
||||
parse_options_usage(NULL, stat_options, "p", 1);
|
||||
parse_options_usage(NULL, stat_options, "t", 1);
|
||||
goto out;
|
||||
if ((stat_config.aggr_mode == AGGR_THREAD) &&
|
||||
!target__has_task(&target)) {
|
||||
if (!target.system_wide || target.cpu_list) {
|
||||
fprintf(stderr, "The --per-thread option is only "
|
||||
"available when monitoring via -p -t -a "
|
||||
"options or only --per-thread.\n");
|
||||
parse_options_usage(NULL, stat_options, "p", 1);
|
||||
parse_options_usage(NULL, stat_options, "t", 1);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2779,6 +2830,9 @@ int cmd_stat(int argc, const char **argv)
|
||||
|
||||
target__validate(&target);
|
||||
|
||||
if ((stat_config.aggr_mode == AGGR_THREAD) && (target.system_wide))
|
||||
target.per_thread = true;
|
||||
|
||||
if (perf_evlist__create_maps(evsel_list, &target) < 0) {
|
||||
if (target__has_task(&target)) {
|
||||
pr_err("Problems finding threads of monitor\n");
|
||||
@ -2796,8 +2850,15 @@ int cmd_stat(int argc, const char **argv)
|
||||
* Initialize thread_map with comm names,
|
||||
* so we could print it out on output.
|
||||
*/
|
||||
if (stat_config.aggr_mode == AGGR_THREAD)
|
||||
if (stat_config.aggr_mode == AGGR_THREAD) {
|
||||
thread_map__read_comms(evsel_list->threads);
|
||||
if (target.system_wide) {
|
||||
if (runtime_stat_new(&stat_config,
|
||||
thread_map__nr(evsel_list->threads))) {
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (interval && interval < 100) {
|
||||
if (interval < 10) {
|
||||
@ -2887,5 +2948,8 @@ out:
|
||||
sysfs__write_int(FREEZE_ON_SMI_PATH, 0);
|
||||
|
||||
perf_evlist__delete(evsel_list);
|
||||
|
||||
runtime_stat_delete(&stat_config);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -99,6 +99,7 @@ static void perf_top__resize(struct perf_top *top)
|
||||
|
||||
static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he)
|
||||
{
|
||||
struct perf_evsel *evsel = hists_to_evsel(he->hists);
|
||||
struct symbol *sym;
|
||||
struct annotation *notes;
|
||||
struct map *map;
|
||||
@ -137,7 +138,7 @@ static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = symbol__disassemble(sym, map, NULL, 0, NULL, NULL);
|
||||
err = symbol__annotate(sym, map, evsel, 0, NULL);
|
||||
if (err == 0) {
|
||||
out_assign:
|
||||
top->sym_filter_entry = he;
|
||||
@ -229,6 +230,7 @@ static void perf_top__record_precise_ip(struct perf_top *top,
|
||||
static void perf_top__show_details(struct perf_top *top)
|
||||
{
|
||||
struct hist_entry *he = top->sym_filter_entry;
|
||||
struct perf_evsel *evsel = hists_to_evsel(he->hists);
|
||||
struct annotation *notes;
|
||||
struct symbol *symbol;
|
||||
int more;
|
||||
@ -241,6 +243,8 @@ static void perf_top__show_details(struct perf_top *top)
|
||||
|
||||
pthread_mutex_lock(¬es->lock);
|
||||
|
||||
symbol__calc_percent(symbol, evsel);
|
||||
|
||||
if (notes->src == NULL)
|
||||
goto out_unlock;
|
||||
|
||||
@ -412,7 +416,7 @@ static void perf_top__print_mapped_keys(struct perf_top *top)
|
||||
fprintf(stdout, "\t[S] stop annotation.\n");
|
||||
|
||||
fprintf(stdout,
|
||||
"\t[K] hide kernel_symbols symbols. \t(%s)\n",
|
||||
"\t[K] hide kernel symbols. \t(%s)\n",
|
||||
top->hide_kernel_symbols ? "yes" : "no");
|
||||
fprintf(stdout,
|
||||
"\t[U] hide user symbols. \t(%s)\n",
|
||||
@ -903,7 +907,7 @@ try_again:
|
||||
}
|
||||
}
|
||||
|
||||
if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) {
|
||||
if (perf_evlist__mmap(evlist, opts->mmap_pages) < 0) {
|
||||
ui__error("Failed to mmap with %d (%s)\n",
|
||||
errno, str_error_r(errno, msg, sizeof(msg)));
|
||||
goto out_err;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "builtin.h"
|
||||
#include "util/color.h"
|
||||
#include "util/debug.h"
|
||||
#include "util/env.h"
|
||||
#include "util/event.h"
|
||||
#include "util/evlist.h"
|
||||
#include <subcmd/exec-cmd.h>
|
||||
@ -45,18 +46,17 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#include <libaudit.h> /* FIXME: Still needed for audit_errno_to_name */
|
||||
#include <poll.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/filter.h>
|
||||
#include <linux/audit.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/time64.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "sane_ctype.h"
|
||||
|
||||
@ -111,6 +111,7 @@ struct trace {
|
||||
bool summary;
|
||||
bool summary_only;
|
||||
bool show_comm;
|
||||
bool print_sample;
|
||||
bool show_tool_stats;
|
||||
bool trace_syscalls;
|
||||
bool kernel_syscallchains;
|
||||
@ -545,9 +546,10 @@ static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size,
|
||||
{ .scnprintf = SCA_STRARRAY, \
|
||||
.parm = &strarray__##array, }
|
||||
|
||||
#include "trace/beauty/arch_errno_names.c"
|
||||
#include "trace/beauty/eventfd.c"
|
||||
#include "trace/beauty/flock.c"
|
||||
#include "trace/beauty/futex_op.c"
|
||||
#include "trace/beauty/futex_val3.c"
|
||||
#include "trace/beauty/mmap.c"
|
||||
#include "trace/beauty/mode_t.c"
|
||||
#include "trace/beauty/msg_flags.c"
|
||||
@ -610,7 +612,8 @@ static struct syscall_fmt {
|
||||
{ .name = "fstat", .alias = "newfstat", },
|
||||
{ .name = "fstatat", .alias = "newfstatat", },
|
||||
{ .name = "futex",
|
||||
.arg = { [1] = { .scnprintf = SCA_FUTEX_OP, /* op */ }, }, },
|
||||
.arg = { [1] = { .scnprintf = SCA_FUTEX_OP, /* op */ },
|
||||
[5] = { .scnprintf = SCA_FUTEX_VAL3, /* val3 */ }, }, },
|
||||
{ .name = "futimesat",
|
||||
.arg = { [0] = { .scnprintf = SCA_FDAT, /* fd */ }, }, },
|
||||
{ .name = "getitimer",
|
||||
@ -622,6 +625,7 @@ static struct syscall_fmt {
|
||||
.arg = { [2] = { .scnprintf = SCA_GETRANDOM_FLAGS, /* flags */ }, }, },
|
||||
{ .name = "getrlimit",
|
||||
.arg = { [0] = STRARRAY(resource, rlimit_resources), }, },
|
||||
{ .name = "gettid", .errpid = true, },
|
||||
{ .name = "ioctl",
|
||||
.arg = {
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
@ -819,7 +823,7 @@ static size_t fprintf_duration(unsigned long t, bool calculated, FILE *fp)
|
||||
size_t printed = fprintf(fp, "(");
|
||||
|
||||
if (!calculated)
|
||||
printed += fprintf(fp, " ? ");
|
||||
printed += fprintf(fp, " ");
|
||||
else if (duration >= 1.0)
|
||||
printed += color_fprintf(fp, PERF_COLOR_RED, "%6.3f ms", duration);
|
||||
else if (duration >= 0.01)
|
||||
@ -1554,10 +1558,9 @@ static void thread__update_stats(struct thread_trace *ttrace,
|
||||
update_stats(stats, duration);
|
||||
}
|
||||
|
||||
static int trace__printf_interrupted_entry(struct trace *trace, struct perf_sample *sample)
|
||||
static int trace__printf_interrupted_entry(struct trace *trace)
|
||||
{
|
||||
struct thread_trace *ttrace;
|
||||
u64 duration;
|
||||
size_t printed;
|
||||
|
||||
if (trace->current == NULL)
|
||||
@ -1568,15 +1571,30 @@ static int trace__printf_interrupted_entry(struct trace *trace, struct perf_samp
|
||||
if (!ttrace->entry_pending)
|
||||
return 0;
|
||||
|
||||
duration = sample->time - ttrace->entry_time;
|
||||
|
||||
printed = trace__fprintf_entry_head(trace, trace->current, duration, true, ttrace->entry_time, trace->output);
|
||||
printed = trace__fprintf_entry_head(trace, trace->current, 0, false, ttrace->entry_time, trace->output);
|
||||
printed += fprintf(trace->output, "%-70s) ...\n", ttrace->entry_str);
|
||||
ttrace->entry_pending = false;
|
||||
|
||||
return printed;
|
||||
}
|
||||
|
||||
static int trace__fprintf_sample(struct trace *trace, struct perf_evsel *evsel,
|
||||
struct perf_sample *sample, struct thread *thread)
|
||||
{
|
||||
int printed = 0;
|
||||
|
||||
if (trace->print_sample) {
|
||||
double ts = (double)sample->time / NSEC_PER_MSEC;
|
||||
|
||||
printed += fprintf(trace->output, "%22s %10.3f %s %d/%d [%d]\n",
|
||||
perf_evsel__name(evsel), ts,
|
||||
thread__comm_str(thread),
|
||||
sample->pid, sample->tid, sample->cpu);
|
||||
}
|
||||
|
||||
return printed;
|
||||
}
|
||||
|
||||
static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
|
||||
union perf_event *event __maybe_unused,
|
||||
struct perf_sample *sample)
|
||||
@ -1597,6 +1615,8 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
|
||||
if (ttrace == NULL)
|
||||
goto out_put;
|
||||
|
||||
trace__fprintf_sample(trace, evsel, sample, thread);
|
||||
|
||||
args = perf_evsel__sc_tp_ptr(evsel, args, sample);
|
||||
|
||||
if (ttrace->entry_str == NULL) {
|
||||
@ -1606,7 +1626,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
|
||||
}
|
||||
|
||||
if (!(trace->duration_filter || trace->summary_only || trace->min_stack))
|
||||
trace__printf_interrupted_entry(trace, sample);
|
||||
trace__printf_interrupted_entry(trace);
|
||||
|
||||
ttrace->entry_time = sample->time;
|
||||
msg = ttrace->entry_str;
|
||||
@ -1643,7 +1663,7 @@ static int trace__resolve_callchain(struct trace *trace, struct perf_evsel *evse
|
||||
struct addr_location al;
|
||||
|
||||
if (machine__resolve(trace->host, &al, sample) < 0 ||
|
||||
thread__resolve_callchain(al.thread, cursor, evsel, sample, NULL, NULL, trace->max_stack))
|
||||
thread__resolve_callchain(al.thread, cursor, evsel, sample, NULL, NULL, evsel->attr.sample_max_stack))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@ -1659,6 +1679,14 @@ static int trace__fprintf_callchain(struct trace *trace, struct perf_sample *sam
|
||||
return sample__fprintf_callchain(sample, 38, print_opts, &callchain_cursor, trace->output);
|
||||
}
|
||||
|
||||
static const char *errno_to_name(struct perf_evsel *evsel, int err)
|
||||
{
|
||||
struct perf_env *env = perf_evsel__env(evsel);
|
||||
const char *arch_name = perf_env__arch(env);
|
||||
|
||||
return arch_syscalls__strerrno(arch_name, err);
|
||||
}
|
||||
|
||||
static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
|
||||
union perf_event *event __maybe_unused,
|
||||
struct perf_sample *sample)
|
||||
@ -1679,6 +1707,8 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
|
||||
if (ttrace == NULL)
|
||||
goto out_put;
|
||||
|
||||
trace__fprintf_sample(trace, evsel, sample, thread);
|
||||
|
||||
if (trace->summary)
|
||||
thread__update_stats(ttrace, id, sample);
|
||||
|
||||
@ -1729,7 +1759,7 @@ signed_print:
|
||||
errno_print: {
|
||||
char bf[STRERR_BUFSIZE];
|
||||
const char *emsg = str_error_r(-ret, bf, sizeof(bf)),
|
||||
*e = audit_errno_to_name(-ret);
|
||||
*e = errno_to_name(evsel, -ret);
|
||||
|
||||
fprintf(trace->output, ") = -1 %s %s", e, emsg);
|
||||
}
|
||||
@ -1910,7 +1940,7 @@ static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel,
|
||||
}
|
||||
}
|
||||
|
||||
trace__printf_interrupted_entry(trace, sample);
|
||||
trace__printf_interrupted_entry(trace);
|
||||
trace__fprintf_tstamp(trace, sample->time, trace->output);
|
||||
|
||||
if (trace->trace_syscalls)
|
||||
@ -2221,6 +2251,9 @@ static int trace__add_syscall_newtp(struct trace *trace)
|
||||
if (perf_evsel__init_sc_tp_uint_field(sys_exit, ret))
|
||||
goto out_delete_sys_exit;
|
||||
|
||||
perf_evsel__config_callchain(sys_enter, &trace->opts, &callchain_param);
|
||||
perf_evsel__config_callchain(sys_exit, &trace->opts, &callchain_param);
|
||||
|
||||
perf_evlist__add(evlist, sys_enter);
|
||||
perf_evlist__add(evlist, sys_exit);
|
||||
|
||||
@ -2317,6 +2350,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
pgfault_maj = perf_evsel__new_pgfault(PERF_COUNT_SW_PAGE_FAULTS_MAJ);
|
||||
if (pgfault_maj == NULL)
|
||||
goto out_error_mem;
|
||||
perf_evsel__config_callchain(pgfault_maj, &trace->opts, &callchain_param);
|
||||
perf_evlist__add(evlist, pgfault_maj);
|
||||
}
|
||||
|
||||
@ -2324,6 +2358,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
pgfault_min = perf_evsel__new_pgfault(PERF_COUNT_SW_PAGE_FAULTS_MIN);
|
||||
if (pgfault_min == NULL)
|
||||
goto out_error_mem;
|
||||
perf_evsel__config_callchain(pgfault_min, &trace->opts, &callchain_param);
|
||||
perf_evlist__add(evlist, pgfault_min);
|
||||
}
|
||||
|
||||
@ -2344,45 +2379,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
goto out_delete_evlist;
|
||||
}
|
||||
|
||||
perf_evlist__config(evlist, &trace->opts, NULL);
|
||||
|
||||
if (callchain_param.enabled) {
|
||||
bool use_identifier = false;
|
||||
|
||||
if (trace->syscalls.events.sys_exit) {
|
||||
perf_evsel__config_callchain(trace->syscalls.events.sys_exit,
|
||||
&trace->opts, &callchain_param);
|
||||
use_identifier = true;
|
||||
}
|
||||
|
||||
if (pgfault_maj) {
|
||||
perf_evsel__config_callchain(pgfault_maj, &trace->opts, &callchain_param);
|
||||
use_identifier = true;
|
||||
}
|
||||
|
||||
if (pgfault_min) {
|
||||
perf_evsel__config_callchain(pgfault_min, &trace->opts, &callchain_param);
|
||||
use_identifier = true;
|
||||
}
|
||||
|
||||
if (use_identifier) {
|
||||
/*
|
||||
* Now we have evsels with different sample_ids, use
|
||||
* PERF_SAMPLE_IDENTIFIER to map from sample to evsel
|
||||
* from a fixed position in each ring buffer record.
|
||||
*
|
||||
* As of this the changeset introducing this comment, this
|
||||
* isn't strictly needed, as the fields that can come before
|
||||
* PERF_SAMPLE_ID are all used, but we'll probably disable
|
||||
* some of those for things like copying the payload of
|
||||
* pointer syscall arguments, and for vfs_getname we don't
|
||||
* need PERF_SAMPLE_ADDR and PERF_SAMPLE_IP, so do this
|
||||
* here as a warning we need to use PERF_SAMPLE_IDENTIFIER.
|
||||
*/
|
||||
perf_evlist__set_sample_bit(evlist, IDENTIFIER);
|
||||
perf_evlist__reset_sample_bit(evlist, ID);
|
||||
}
|
||||
}
|
||||
perf_evlist__config(evlist, &trace->opts, &callchain_param);
|
||||
|
||||
signal(SIGCHLD, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
@ -2437,7 +2434,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
if (err < 0)
|
||||
goto out_error_apply_filters;
|
||||
|
||||
err = perf_evlist__mmap(evlist, trace->opts.mmap_pages, false);
|
||||
err = perf_evlist__mmap(evlist, trace->opts.mmap_pages);
|
||||
if (err < 0)
|
||||
goto out_error_mmap;
|
||||
|
||||
@ -2455,6 +2452,18 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
trace->multiple_threads = thread_map__pid(evlist->threads, 0) == -1 ||
|
||||
evlist->threads->nr > 1 ||
|
||||
perf_evlist__first(evlist)->attr.inherit;
|
||||
|
||||
/*
|
||||
* Now that we already used evsel->attr to ask the kernel to setup the
|
||||
* events, lets reuse evsel->attr.sample_max_stack as the limit in
|
||||
* trace__resolve_callchain(), allowing per-event max-stack settings
|
||||
* to override an explicitely set --max-stack global setting.
|
||||
*/
|
||||
evlist__for_each_entry(evlist, evsel) {
|
||||
if ((evsel->attr.sample_type & PERF_SAMPLE_CALLCHAIN) &&
|
||||
evsel->attr.sample_max_stack == 0)
|
||||
evsel->attr.sample_max_stack = trace->max_stack;
|
||||
}
|
||||
again:
|
||||
before = trace->nr_events;
|
||||
|
||||
@ -3046,6 +3055,8 @@ int cmd_trace(int argc, const char **argv)
|
||||
"Set the maximum stack depth when parsing the callchain, "
|
||||
"anything beyond the specified depth will be ignored. "
|
||||
"Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)),
|
||||
OPT_BOOLEAN(0, "print-sample", &trace.print_sample,
|
||||
"print the PERF_RECORD_SAMPLE PERF_SAMPLE_ info, for debugging"),
|
||||
OPT_UINTEGER(0, "proc-map-timeout", &trace.opts.proc_map_timeout,
|
||||
"per thread proc mmap processing timeout in ms"),
|
||||
OPT_UINTEGER('D', "delay", &trace.opts.initial_delay,
|
||||
@ -3097,8 +3108,9 @@ int cmd_trace(int argc, const char **argv)
|
||||
}
|
||||
|
||||
#ifdef HAVE_DWARF_UNWIND_SUPPORT
|
||||
if ((trace.min_stack || max_stack_user_set) && !callchain_param.enabled && trace.trace_syscalls)
|
||||
if ((trace.min_stack || max_stack_user_set) && !callchain_param.enabled) {
|
||||
record_opts__parse_callchain(&trace.opts, &callchain_param, "dwarf", false);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (callchain_param.enabled) {
|
||||
|
@ -33,21 +33,30 @@ arch/s390/include/uapi/asm/kvm.h
|
||||
arch/s390/include/uapi/asm/kvm_perf.h
|
||||
arch/s390/include/uapi/asm/ptrace.h
|
||||
arch/s390/include/uapi/asm/sie.h
|
||||
arch/s390/include/uapi/asm/unistd.h
|
||||
arch/arm/include/uapi/asm/kvm.h
|
||||
arch/arm64/include/uapi/asm/kvm.h
|
||||
arch/alpha/include/uapi/asm/errno.h
|
||||
arch/mips/include/asm/errno.h
|
||||
arch/mips/include/uapi/asm/errno.h
|
||||
arch/parisc/include/uapi/asm/errno.h
|
||||
arch/powerpc/include/uapi/asm/errno.h
|
||||
arch/sparc/include/uapi/asm/errno.h
|
||||
arch/x86/include/uapi/asm/errno.h
|
||||
include/asm-generic/bitops/arch_hweight.h
|
||||
include/asm-generic/bitops/const_hweight.h
|
||||
include/asm-generic/bitops/__fls.h
|
||||
include/asm-generic/bitops/fls.h
|
||||
include/asm-generic/bitops/fls64.h
|
||||
include/linux/coresight-pmu.h
|
||||
include/uapi/asm-generic/errno.h
|
||||
include/uapi/asm-generic/errno-base.h
|
||||
include/uapi/asm-generic/ioctls.h
|
||||
include/uapi/asm-generic/mman-common.h
|
||||
'
|
||||
|
||||
check () {
|
||||
file=$1
|
||||
opts="--ignore-blank-lines --ignore-space-change"
|
||||
|
||||
shift
|
||||
while [ -n "$*" ]; do
|
||||
|
@ -162,8 +162,37 @@ __perf_main ()
|
||||
# List possible events for -e option
|
||||
elif [[ $prev == @("-e"|"--event") &&
|
||||
$prev_skip_opts == @(record|stat|top) ]]; then
|
||||
evts=$($cmd list --raw-dump)
|
||||
__perfcomp_colon "$evts" "$cur"
|
||||
|
||||
local cur1=${COMP_WORDS[COMP_CWORD]}
|
||||
local raw_evts=$($cmd list --raw-dump)
|
||||
local arr s tmp result
|
||||
|
||||
if [[ "$cur1" == */* && ${cur1#*/} =~ ^[A-Z] ]]; then
|
||||
OLD_IFS="$IFS"
|
||||
IFS=" "
|
||||
arr=($raw_evts)
|
||||
IFS="$OLD_IFS"
|
||||
|
||||
for s in ${arr[@]}
|
||||
do
|
||||
if [[ "$s" == *cpu/* ]]; then
|
||||
tmp=${s#*cpu/}
|
||||
result=$result" ""cpu/"${tmp^^}
|
||||
else
|
||||
result=$result" "$s
|
||||
fi
|
||||
done
|
||||
|
||||
evts=${result}" "$(ls /sys/bus/event_source/devices/cpu/events)
|
||||
else
|
||||
evts=${raw_evts}" "$(ls /sys/bus/event_source/devices/cpu/events)
|
||||
fi
|
||||
|
||||
if [[ "$cur1" == , ]]; then
|
||||
__perfcomp_colon "$evts" ""
|
||||
else
|
||||
__perfcomp_colon "$evts" "$cur1"
|
||||
fi
|
||||
else
|
||||
# List subcommands for perf commands
|
||||
if [[ $prev_skip_opts == @(kvm|kmem|mem|lock|sched|
|
||||
@ -246,11 +275,21 @@ fi
|
||||
type perf &>/dev/null &&
|
||||
_perf()
|
||||
{
|
||||
if [[ "$COMP_WORDBREAKS" != *,* ]]; then
|
||||
COMP_WORDBREAKS="${COMP_WORDBREAKS},"
|
||||
export COMP_WORDBREAKS
|
||||
fi
|
||||
|
||||
if [[ "$COMP_WORDBREAKS" == *:* ]]; then
|
||||
COMP_WORDBREAKS="${COMP_WORDBREAKS/:/}"
|
||||
export COMP_WORDBREAKS
|
||||
fi
|
||||
|
||||
local cur words cword prev
|
||||
if [ $preload_get_comp_words_by_ref = "true" ]; then
|
||||
_get_comp_words_by_ref -n =: cur words cword prev
|
||||
_get_comp_words_by_ref -n =:, cur words cword prev
|
||||
else
|
||||
__perf_get_comp_words_by_ref -n =: cur words cword prev
|
||||
__perf_get_comp_words_by_ref -n =:, cur words cword prev
|
||||
fi
|
||||
__perf_main
|
||||
} &&
|
||||
|
@ -73,7 +73,7 @@ static struct cmd_struct commands[] = {
|
||||
{ "lock", cmd_lock, 0 },
|
||||
{ "kvm", cmd_kvm, 0 },
|
||||
{ "test", cmd_test, 0 },
|
||||
#ifdef HAVE_LIBAUDIT_SUPPORT
|
||||
#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE)
|
||||
{ "trace", cmd_trace, 0 },
|
||||
#endif
|
||||
{ "inject", cmd_inject, 0 },
|
||||
@ -485,7 +485,7 @@ int main(int argc, const char **argv)
|
||||
argv[0] = cmd;
|
||||
}
|
||||
if (strstarts(cmd, "trace")) {
|
||||
#ifdef HAVE_LIBAUDIT_SUPPORT
|
||||
#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE)
|
||||
setup_path();
|
||||
argv[0] = "trace";
|
||||
return cmd_trace(argc, argv);
|
||||
|
@ -0,0 +1,62 @@
|
||||
[
|
||||
{
|
||||
"PublicDescription": "Attributable Level 1 data cache access, read",
|
||||
"EventCode": "0x40",
|
||||
"EventName": "l1d_cache_rd",
|
||||
"BriefDescription": "L1D cache read",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Attributable Level 1 data cache access, write ",
|
||||
"EventCode": "0x41",
|
||||
"EventName": "l1d_cache_wr",
|
||||
"BriefDescription": "L1D cache write",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Attributable Level 1 data cache refill, read",
|
||||
"EventCode": "0x42",
|
||||
"EventName": "l1d_cache_refill_rd",
|
||||
"BriefDescription": "L1D cache refill read",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Attributable Level 1 data cache refill, write",
|
||||
"EventCode": "0x43",
|
||||
"EventName": "l1d_cache_refill_wr",
|
||||
"BriefDescription": "L1D refill write",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Attributable Level 1 data TLB refill, read",
|
||||
"EventCode": "0x4C",
|
||||
"EventName": "l1d_tlb_refill_rd",
|
||||
"BriefDescription": "L1D tlb refill read",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Attributable Level 1 data TLB refill, write",
|
||||
"EventCode": "0x4D",
|
||||
"EventName": "l1d_tlb_refill_wr",
|
||||
"BriefDescription": "L1D tlb refill write",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Attributable Level 1 data or unified TLB access, read",
|
||||
"EventCode": "0x4E",
|
||||
"EventName": "l1d_tlb_rd",
|
||||
"BriefDescription": "L1D tlb read",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Attributable Level 1 data or unified TLB access, write",
|
||||
"EventCode": "0x4F",
|
||||
"EventName": "l1d_tlb_wr",
|
||||
"BriefDescription": "L1D tlb write",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Bus access read",
|
||||
"EventCode": "0x60",
|
||||
"EventName": "bus_access_rd",
|
||||
"BriefDescription": "Bus access read",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Bus access write",
|
||||
"EventCode": "0x61",
|
||||
"EventName": "bus_access_wr",
|
||||
"BriefDescription": "Bus access write",
|
||||
}
|
||||
]
|
15
tools/perf/pmu-events/arch/arm64/mapfile.csv
Normal file
15
tools/perf/pmu-events/arch/arm64/mapfile.csv
Normal file
@ -0,0 +1,15 @@
|
||||
# Format:
|
||||
# MIDR,Version,JSON/file/pathname,Type
|
||||
#
|
||||
# where
|
||||
# MIDR Processor version
|
||||
# Variant[23:20] and Revision [3:0] should be zero.
|
||||
# Version could be used to track version of of JSON file
|
||||
# but currently unused.
|
||||
# JSON/file/pathname is the path to JSON file, relative
|
||||
# to tools/perf/pmu-events/arch/arm64/.
|
||||
# Type is core, uncore etc
|
||||
#
|
||||
#
|
||||
#Family-model,Version,Filename,EventType
|
||||
0x00000000420f5160,v1,cavium,core
|
|
@ -13,13 +13,5 @@
|
||||
#
|
||||
|
||||
# Power8 entries
|
||||
004b0000,1,power8,core
|
||||
004b0201,1,power8,core
|
||||
004c0000,1,power8,core
|
||||
004d0000,1,power8,core
|
||||
004d0100,1,power8,core
|
||||
004d0200,1,power8,core
|
||||
004c0100,1,power8,core
|
||||
004e0100,1,power9,core
|
||||
004e0200,1,power9,core
|
||||
004e1200,1,power9,core
|
||||
004[bcd][[:xdigit:]]{4},1,power8,core
|
||||
004e[[:xdigit:]]{4},1,power9,core
|
||||
|
|
@ -124,11 +124,6 @@
|
||||
"EventName": "PM_CMPLU_STALL_LARX",
|
||||
"BriefDescription": "Finish stall because the NTF instruction was a larx waiting to be satisfied"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3006C",
|
||||
"EventName": "PM_RUN_CYC_SMT2_MODE",
|
||||
"BriefDescription": "Cycles in which this thread's run latch is set and the core is in SMT2 mode"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1C058",
|
||||
"EventName": "PM_DTLB_MISS_16G",
|
||||
|
@ -1,9 +1,4 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x3E15C",
|
||||
"EventName": "PM_MRK_L2_TM_ST_ABORT_SISTER",
|
||||
"BriefDescription": "TM marked store abort for this thread"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x25044",
|
||||
"EventName": "PM_IPTEG_FROM_L31_MOD",
|
||||
@ -369,4 +364,4 @@
|
||||
"EventName": "PM_IPTEG_FROM_L31_ECO_MOD",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Modified (M) data from another core's ECO L3 on the same chip due to a instruction side request"
|
||||
}
|
||||
]
|
||||
]
|
@ -1,9 +1,4 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x3C052",
|
||||
"EventName": "PM_DATA_SYS_PUMP_MPRED",
|
||||
"BriefDescription": "Final Pump Scope (system) mispredicted. Either the original scope was too small (Chip/Group) or the original scope was System and it should have been smaller. Counts for a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3013E",
|
||||
"EventName": "PM_MRK_STALL_CMPLU_CYC",
|
||||
@ -254,6 +249,11 @@
|
||||
"EventName": "PM_RADIX_PWC_L1_PDE_FROM_L3",
|
||||
"BriefDescription": "A Page Directory Entry was reloaded to a level 1 page walk cache from the core's L3 data cache"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3C052",
|
||||
"EventName": "PM_DATA_SYS_PUMP_MPRED",
|
||||
"BriefDescription": "Final Pump Scope (system) mispredicted. Either the original scope was too small (Chip/Group) or the original scope was System and it should have been smaller. Counts for a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4D142",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3",
|
||||
@ -434,21 +434,6 @@
|
||||
"EventName": "PM_ITLB_MISS",
|
||||
"BriefDescription": "ITLB Reloaded. Counts 1 per ITLB miss for HPT but multiple for radix depending on number of levels traveresed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2D024",
|
||||
"EventName": "PM_RADIX_PWC_L2_HIT",
|
||||
"BriefDescription": "A radix translation attempt missed in the TLB but hit on both the first and second levels of page walk cache."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3F056",
|
||||
"EventName": "PM_RADIX_PWC_L3_HIT",
|
||||
"BriefDescription": "A radix translation attempt missed in the TLB but hit on the first, second, and third levels of page walk cache."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4E014",
|
||||
"EventName": "PM_TM_TX_PASS_RUN_INST",
|
||||
"BriefDescription": "Run instructions spent in successful transactions"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1E044",
|
||||
"EventName": "PM_DPTEG_FROM_L3_NO_CONFLICT",
|
||||
@ -644,4 +629,4 @@
|
||||
"EventName": "PM_MRK_BR_MPRED_CMPL",
|
||||
"BriefDescription": "Marked Branch Mispredicted"
|
||||
}
|
||||
]
|
||||
]
|
@ -79,6 +79,11 @@
|
||||
"EventName": "PM_RADIX_PWC_MISS",
|
||||
"BriefDescription": "A radix translation attempt missed in the TLB and all levels of page walk cache."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x26882",
|
||||
"EventName": "PM_L2_DC_INV",
|
||||
"BriefDescription": "D-cache invalidates sent over the reload bus to the core"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x24048",
|
||||
"EventName": "PM_INST_FROM_LMEM",
|
||||
@ -94,11 +99,6 @@
|
||||
"EventName": "PM_TM_PASSED",
|
||||
"BriefDescription": "Number of TM transactions that passed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD1A0",
|
||||
"EventName": "PM_MRK_LSU_FLUSH_LHS",
|
||||
"BriefDescription": "Effective Address alias flush : no EA match but Real Address match. If the data has not yet been returned for this load, the instruction will just be rejected, but if it has returned data, it will be flushed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF088",
|
||||
"EventName": "PM_LSU0_STORE_REJECT",
|
||||
@ -127,7 +127,7 @@
|
||||
{,
|
||||
"EventCode": "0xD08C",
|
||||
"EventName": "PM_LSU2_LDMX_FIN",
|
||||
"BriefDescription": "New P9 instruction LDMX. The definition of this new PMU event is (from the ldmx RFC02491): The thread has executed an ldmx instruction that accessed a doubleword that contains an effective address within an enabled section of the Load Monitored region. This event, therefore, should not occur if the FSCR has disabled the load monitored facility (FSCR[52]) or disabled the EBB facility (FSCR[56])"
|
||||
"BriefDescription": "New P9 instruction LDMX. The definition of this new PMU event is (from the ldmx RFC02491): The thread has executed an ldmx instruction that accessed a doubleword that contains an effective address within an enabled section of the Load Monitored region. This event, therefore, should not occur if the FSCR has disabled the load monitored facility (FSCR[52]) or disabled the EBB facility (FSCR[56])."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300F8",
|
||||
@ -204,11 +204,6 @@
|
||||
"EventName": "PM_MRK_DATA_FROM_L31_ECO_MOD_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload with Modified (M) data from another core's ECO L3 on the same chip due to a marked load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF0B4",
|
||||
"EventName": "PM_DC_PREF_CONS_ALLOC",
|
||||
"BriefDescription": "Prefetch stream allocated in the conservative phase by either the hardware prefetch mechanism or software prefetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF894",
|
||||
"EventName": "PM_LSU3_L1_CAM_CANCEL",
|
||||
@ -219,21 +214,11 @@
|
||||
"EventName": "PM_FLUSH_DISP_TLBIE",
|
||||
"BriefDescription": "Dispatch Flush: TLBIE"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD1A4",
|
||||
"EventName": "PM_MRK_LSU_FLUSH_SAO",
|
||||
"BriefDescription": "A load-hit-load condition with Strong Address Ordering will have address compare disabled and flush"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4E11E",
|
||||
"EventName": "PM_MRK_DATA_FROM_DMEM_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from another chip's memory on the same Node or Group (Distant) due to a marked load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x5894",
|
||||
"EventName": "PM_LWSYNC",
|
||||
"BriefDescription": "Lwsync instruction decoded and transferred"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x14156",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_CYC",
|
||||
@ -244,11 +229,6 @@
|
||||
"EventName": "PM_RD_CLEARING_SC",
|
||||
"BriefDescription": "Read clearing SC"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x50A0",
|
||||
"EventName": "PM_HWSYNC",
|
||||
"BriefDescription": "Hwsync instruction decoded and transferred"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x168B0",
|
||||
"EventName": "PM_L3_P1_NODE_PUMP",
|
||||
@ -264,6 +244,11 @@
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_DISP_CONFLICT_LDHITST",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 with load hit store conflict due to a marked load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x468AE",
|
||||
"EventName": "PM_L3_P3_CO_RTY",
|
||||
"BriefDescription": "L3 CO received retry port 3 (memory only), every retry counted"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x460A8",
|
||||
"EventName": "PM_SN_HIT",
|
||||
@ -279,11 +264,6 @@
|
||||
"EventName": "PM_DC_PREF_HW_ALLOC",
|
||||
"BriefDescription": "Prefetch stream allocated by the hardware prefetch mechanism"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF0BC",
|
||||
"EventName": "PM_LS2_UNALIGNED_ST",
|
||||
"BriefDescription": "Store instructions whose data crosses a double-word boundary, which causes it to require an additional slice than than what normally would be required of the Store of that size. If the Store wraps from slice 3 to slice 0, thee is an additional 3-cycle penalty"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD0AC",
|
||||
"EventName": "PM_SRQ_SYNC_CYC",
|
||||
@ -379,26 +359,11 @@
|
||||
"EventName": "PM_RUN_CYC_SMT4_MODE",
|
||||
"BriefDescription": "Cycles in which this thread's run latch is set and the core is in SMT4 mode"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x5088",
|
||||
"EventName": "PM_DECODE_FUSION_OP_PRESERV",
|
||||
"BriefDescription": "Destructive op operand preservation"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1D14E",
|
||||
"EventName": "PM_MRK_DATA_FROM_OFF_CHIP_CACHE_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to a marked load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x509C",
|
||||
"EventName": "PM_FORCED_NOP",
|
||||
"BriefDescription": "Instruction was forced to execute as a nop because it was found to behave like a nop (have no effect) at decode time"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC098",
|
||||
"EventName": "PM_LS2_UNALIGNED_LD",
|
||||
"BriefDescription": "Load instructions whose data crosses a double-word boundary, which causes it to require an additional slice than than what normally would be required of the load of that size. If the load wraps from slice 3 to slice 0, thee is an additional 3-cycle penalty"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20058",
|
||||
"EventName": "PM_DARQ1_10_12_ENTRIES",
|
||||
@ -434,11 +399,6 @@
|
||||
"EventName": "PM_LSU1_STORE_REJECT",
|
||||
"BriefDescription": "All internal store rejects cause the instruction to go back to the SRQ and go to sleep until woken up to try again after the condition has been met"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4505E",
|
||||
"EventName": "PM_FLOP_CMPL",
|
||||
"BriefDescription": "Floating Point Operation Finished"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1D144",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3_DISP_CONFLICT",
|
||||
@ -480,14 +440,9 @@
|
||||
"BriefDescription": "XL-form branch was mispredicted due to the predicted target address missing from EAT. The EAT forces a mispredict in this case since there is no predicated target to validate. This is a rare case that may occur when the EAT is full and a branch is issued"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC094",
|
||||
"EventName": "PM_LS0_UNALIGNED_LD",
|
||||
"BriefDescription": "Load instructions whose data crosses a double-word boundary, which causes it to require an additional slice than than what normally would be required of the load of that size. If the load wraps from slice 3 to slice 0, thee is an additional 3-cycle penalty"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF8BC",
|
||||
"EventName": "PM_LS3_UNALIGNED_ST",
|
||||
"BriefDescription": "Store instructions whose data crosses a double-word boundary, which causes it to require an additional slice than than what normally would be required of the Store of that size. If the Store wraps from slice 3 to slice 0, thee is an additional 3-cycle penalty"
|
||||
"EventCode": "0x460AE",
|
||||
"EventName": "PM_L3_P2_CO_RTY",
|
||||
"BriefDescription": "L3 CO received retry port 2 (memory only), every retry counted"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x58B0",
|
||||
@ -504,11 +459,6 @@
|
||||
"EventName": "PM_TM_ST_CONF",
|
||||
"BriefDescription": "TM Store (fav or non-fav) ran into conflict (failed)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD998",
|
||||
"EventName": "PM_MRK_LSU_FLUSH_EMSH",
|
||||
"BriefDescription": "An ERAT miss was detected after a set-p hit. Erat tracker indicates fail due to tlbmiss and the instruction gets flushed because the instruction was working on the wrong address"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF8A0",
|
||||
"EventName": "PM_NON_DATA_STORE",
|
||||
@ -524,11 +474,6 @@
|
||||
"EventName": "PM_BR_UNCOND",
|
||||
"BriefDescription": "Unconditional Branch Completed. HW branch prediction was not used for this branch. This can be an I-form branch, a B-form branch with BO-field set to branch always, or a B-form branch which was covenrted to a Resolve."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1F056",
|
||||
"EventName": "PM_RADIX_PWC_L1_HIT",
|
||||
"BriefDescription": "A radix translation attempt missed in the TLB and only the first level page walk cache was a hit."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF8A8",
|
||||
"EventName": "PM_DC_PREF_FUZZY_CONF",
|
||||
@ -544,6 +489,11 @@
|
||||
"EventName": "PM_LSU2_TM_L1_MISS",
|
||||
"BriefDescription": "Load tm L1 miss"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC880",
|
||||
"EventName": "PM_LS1_LD_VECTOR_FIN",
|
||||
"BriefDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2894",
|
||||
"EventName": "PM_TM_OUTER_TEND",
|
||||
@ -564,21 +514,11 @@
|
||||
"EventName": "PM_MRK_LSU_DERAT_MISS",
|
||||
"BriefDescription": "Marked derat reload (miss) for any page size"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x160A0",
|
||||
"EventName": "PM_L3_PF_MISS_L3",
|
||||
"BriefDescription": "L3 PF missed in L3"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1C04A",
|
||||
"EventName": "PM_DATA_FROM_RL2L3_SHR",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD99C",
|
||||
"EventName": "PM_MRK_LSU_FLUSH_UE",
|
||||
"BriefDescription": "Correctable ECC error on reload data, reported at critical data forward time"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x268B0",
|
||||
"EventName": "PM_L3_P1_GRP_PUMP",
|
||||
@ -629,11 +569,6 @@
|
||||
"EventName": "PM_TMA_REQ_L2",
|
||||
"BriefDescription": "addrs only req to L2 only on the first one,Indication that Load footprint is not expanding"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x5884",
|
||||
"EventName": "PM_DECODE_LANES_NOT_AVAIL",
|
||||
"BriefDescription": "Decode has something to transmit but dispatch lanes are not available"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3C042",
|
||||
"EventName": "PM_DATA_FROM_L3_DISP_CONFLICT",
|
||||
@ -690,9 +625,9 @@
|
||||
"BriefDescription": "False LHS match detected"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD9A4",
|
||||
"EventName": "PM_MRK_LSU_FLUSH_LARX_STCX",
|
||||
"BriefDescription": "A larx is flushed because an older larx has an LMQ reservation for the same thread. A stcx is flushed because an older stcx is in the LMQ. The flush happens when the older larx/stcx relaunches"
|
||||
"EventCode": "0xF0B0",
|
||||
"EventName": "PM_L3_LD_PREF",
|
||||
"BriefDescription": "L3 load prefetch, sourced from a hardware or software stream, was sent to the nest"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4D012",
|
||||
@ -715,9 +650,9 @@
|
||||
"BriefDescription": "All successful Ld/St dispatches for this thread that were an L2 miss (excludes i_l2mru_tch_reqs)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF8B8",
|
||||
"EventName": "PM_LS1_UNALIGNED_ST",
|
||||
"BriefDescription": "Store instructions whose data crosses a double-word boundary, which causes it to require an additional slice than than what normally would be required of the Store of that size. If the Store wraps from slice 3 to slice 0, thee is an additional 3-cycle penalty"
|
||||
"EventCode": "0x160A0",
|
||||
"EventName": "PM_L3_PF_MISS_L3",
|
||||
"BriefDescription": "L3 PF missed in L3"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x408C",
|
||||
@ -764,11 +699,6 @@
|
||||
"EventName": "PM_TM_NESTED_TEND",
|
||||
"BriefDescription": "Completion time nested tend"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x36084",
|
||||
"EventName": "PM_L2_RCST_DISP",
|
||||
"BriefDescription": "All D-side store dispatch attempts for this thread"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x368A0",
|
||||
"EventName": "PM_L3_PF_OFF_CHIP_CACHE",
|
||||
@ -829,11 +759,6 @@
|
||||
"EventName": "PM_L3_SN_USAGE",
|
||||
"BriefDescription": "Rotating sample of 16 snoop valids"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x16084",
|
||||
"EventName": "PM_L2_RCLD_DISP",
|
||||
"BriefDescription": "All I-or-D side load dispatch attempts for this thread (excludes i_l2mru_tch_reqs)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1608C",
|
||||
"EventName": "PM_RC0_BUSY",
|
||||
@ -842,7 +767,7 @@
|
||||
{,
|
||||
"EventCode": "0x36082",
|
||||
"EventName": "PM_L2_LD_DISP",
|
||||
"BriefDescription": "All successful I-or-D side load dispatches for this thread (excludes i_l2mru_tch_reqs)."
|
||||
"BriefDescription": "All successful I-or-D side load dispatches for this thread (excludes i_l2mru_tch_reqs)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF8B0",
|
||||
@ -904,11 +829,6 @@
|
||||
"EventName": "PM_IC_PREF_REQ",
|
||||
"BriefDescription": "Instruction prefetch requests"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC898",
|
||||
"EventName": "PM_LS3_UNALIGNED_LD",
|
||||
"BriefDescription": "Load instructions whose data crosses a double-word boundary, which causes it to require an additional slice than than what normally would be required of the load of that size. If the load wraps from slice 3 to slice 0, thee is an additional 3-cycle penalty"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x488C",
|
||||
"EventName": "PM_IC_PREF_WRITE",
|
||||
@ -1017,7 +937,7 @@
|
||||
{,
|
||||
"EventCode": "0x3E05E",
|
||||
"EventName": "PM_L3_CO_MEPF",
|
||||
"BriefDescription": "L3 castouts in Mepf state for this thread"
|
||||
"BriefDescription": "L3 CO of line in Mep state (includes casthrough to memory). The Mepf state indicates that a line was brought in to satisfy an L3 prefetch request"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x460A2",
|
||||
@ -1204,11 +1124,6 @@
|
||||
"EventName": "PM_TM_FAIL_NON_TX_CONFLICT",
|
||||
"BriefDescription": "Non transactional conflict from LSU, gets reported to TEXASR"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD198",
|
||||
"EventName": "PM_MRK_LSU_FLUSH_ATOMIC",
|
||||
"BriefDescription": "Quad-word loads (lq) are considered atomic because they always span at least 2 slices. If a snoop or store from another thread changes the data the load is accessing between the 2 or 3 pieces of the lq instruction, the lq will be flushed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x201E0",
|
||||
"EventName": "PM_MRK_DATA_FROM_MEMORY",
|
||||
@ -1294,11 +1209,6 @@
|
||||
"EventName": "PM_ICT_NOSLOT_DISP_HELD_HB_FULL",
|
||||
"BriefDescription": "Ict empty for this thread due to dispatch holds because the History Buffer was full. Could be GPR/VSR/VMR/FPR/CR/XVF; CR; XVF (XER/VSCR/FPSCR)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC894",
|
||||
"EventName": "PM_LS1_UNALIGNED_LD",
|
||||
"BriefDescription": "Load instructions whose data crosses a double-word boundary, which causes it to require an additional slice than than what normally would be required of the load of that size. If the load wraps from slice 3 to slice 0, thee is an additional 3-cycle penalty"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x360A2",
|
||||
"EventName": "PM_L3_L2_CO_HIT",
|
||||
@ -1324,11 +1234,6 @@
|
||||
"EventName": "PM_L2_CASTOUT_SHR",
|
||||
"BriefDescription": "L2 Castouts - Shared (Tx,Sx)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD884",
|
||||
"EventName": "PM_LSU3_SET_MPRED",
|
||||
"BriefDescription": "Set prediction(set-p) miss. The entry was not found in the Set prediction table"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x26092",
|
||||
"EventName": "PM_L2_LD_MISS_64B",
|
||||
@ -1362,12 +1267,12 @@
|
||||
{,
|
||||
"EventCode": "0xD8A8",
|
||||
"EventName": "PM_ISLB_MISS",
|
||||
"BriefDescription": "Instruction SLB miss - Total of all segment sizes"
|
||||
"BriefDescription": "Instruction SLB Miss - Total of all segment sizes"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD19C",
|
||||
"EventName": "PM_MRK_LSU_FLUSH_RELAUNCH_MISS",
|
||||
"BriefDescription": "If a load that has already returned data and has to relaunch for any reason then gets a miss (erat, setp, data cache), it will often be flushed at relaunch time because the data might be inconsistent"
|
||||
"EventCode": "0x368AE",
|
||||
"EventName": "PM_L3_P1_CO_RTY",
|
||||
"BriefDescription": "L3 CO received retry port 1 (memory only), every retry counted"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x260A2",
|
||||
@ -1384,6 +1289,11 @@
|
||||
"EventName": "PM_CMPLU_STALL_NESTED_TBEGIN",
|
||||
"BriefDescription": "Completion stall because the ISU is updating the TEXASR to keep track of the nested tbegin. This is a short delay, and it includes ROT"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC084",
|
||||
"EventName": "PM_LS2_LD_VECTOR_FIN",
|
||||
"BriefDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1608E",
|
||||
"EventName": "PM_ST_CAUSED_FAIL",
|
||||
@ -1409,11 +1319,6 @@
|
||||
"EventName": "PM_CO_USAGE",
|
||||
"BriefDescription": "Continuous 16 cycle (2to1) window where this signals rotates thru sampling each CO machine busy. PMU uses this wave to then do 16 cyc count to sample total number of machs running"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD084",
|
||||
"EventName": "PM_LSU2_SET_MPRED",
|
||||
"BriefDescription": "Set prediction(set-p) miss. The entry was not found in the Set prediction table"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x48B8",
|
||||
"EventName": "PM_BR_MPRED_TAKEN_TA",
|
||||
@ -1449,30 +1354,25 @@
|
||||
"EventName": "PM_DC_PREF_STRIDED_CONF",
|
||||
"BriefDescription": "A demand load referenced a line in an active strided prefetch stream. The stream could have been allocated through the hardware prefetch mechanism or through software."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x36084",
|
||||
"EventName": "PM_L2_RCST_DISP",
|
||||
"BriefDescription": "All D-side store dispatch attempts for this thread"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x45054",
|
||||
"EventName": "PM_FMA_CMPL",
|
||||
"BriefDescription": "two flops operation completed (fmadd, fnmadd, fmsub, fnmsub) Scalar instructions only. "
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x5090",
|
||||
"EventName": "PM_SHL_ST_DISABLE",
|
||||
"BriefDescription": "Store-Hit-Load Table Read Hit with entry Disabled (entry was disabled due to the entry shown to not prevent the flush)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x201E8",
|
||||
"EventName": "PM_THRESH_EXC_512",
|
||||
"BriefDescription": "Threshold counter exceeded a value of 512"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x5084",
|
||||
"EventName": "PM_DECODE_FUSION_EXT_ADD",
|
||||
"BriefDescription": "32-bit extended addition"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x36080",
|
||||
"EventName": "PM_L2_INST",
|
||||
"BriefDescription": "All successful I-side dispatches for this thread (excludes i_l2mru_tch reqs)."
|
||||
"BriefDescription": "All successful I-side dispatches for this thread (excludes i_l2mru_tch reqs)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3504C",
|
||||
@ -1554,21 +1454,11 @@
|
||||
"EventName": "PM_MEM_RWITM",
|
||||
"BriefDescription": "Memory Read With Intent to Modify for this thread"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x26882",
|
||||
"EventName": "PM_L2_DC_INV",
|
||||
"BriefDescription": "D-cache invalidates sent over the reload bus to the core"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC090",
|
||||
"EventName": "PM_LSU_STCX",
|
||||
"BriefDescription": "STCX sent to nest, i.e. total"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD080",
|
||||
"EventName": "PM_LSU0_SET_MPRED",
|
||||
"BriefDescription": "Set prediction(set-p) miss. The entry was not found in the Set prediction table"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2C120",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_NO_CONFLICT",
|
||||
@ -1609,11 +1499,6 @@
|
||||
"EventName": "PM_IPTEG_FROM_L2_NO_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 without conflict due to a instruction side request"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD9A0",
|
||||
"EventName": "PM_MRK_LSU_FLUSH_LHL_SHL",
|
||||
"BriefDescription": "The instruction was flushed because of a sequential load/store consistency. If a load or store hits on an older load that has either been snooped (for loads) or has stale data (for stores)."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x35042",
|
||||
"EventName": "PM_IPTEG_FROM_L3_DISP_CONFLICT",
|
||||
@ -1692,7 +1577,7 @@
|
||||
{,
|
||||
"EventCode": "0x2001A",
|
||||
"EventName": "PM_NTC_ALL_FIN",
|
||||
"BriefDescription": "Cycles after all instructions have finished to group completed"
|
||||
"BriefDescription": "Cycles after instruction finished to instruction completed."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3005A",
|
||||
@ -1709,6 +1594,11 @@
|
||||
"EventName": "PM_LSU1_L1_CAM_CANCEL",
|
||||
"BriefDescription": "ls1 l1 tm cam cancel"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x268AE",
|
||||
"EventName": "PM_L3_P3_PF_RTY",
|
||||
"BriefDescription": "L3 PF received retry port 3, every retry counted"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xE884",
|
||||
"EventName": "PM_LS1_ERAT_MISS_PREF",
|
||||
@ -1742,7 +1632,7 @@
|
||||
{,
|
||||
"EventCode": "0x160B6",
|
||||
"EventName": "PM_L3_WI0_BUSY",
|
||||
"BriefDescription": "Rotating sample of 8 WI valid"
|
||||
"BriefDescription": "Rotating sample of 8 WI valid (duplicate)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x368AC",
|
||||
@ -1790,9 +1680,9 @@
|
||||
"BriefDescription": "L2 guess system (VGS or RNS) and guess was correct (ie data beyond-group)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x589C",
|
||||
"EventName": "PM_PTESYNC",
|
||||
"BriefDescription": "ptesync instruction counted when the instruction is decoded and transmitted"
|
||||
"EventCode": "0x260AE",
|
||||
"EventName": "PM_L3_P2_PF_RTY",
|
||||
"BriefDescription": "L3 PF received retry port 2, every retry counted"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x26086",
|
||||
@ -1824,6 +1714,11 @@
|
||||
"EventName": "PM_SHL_ST_DEP_CREATED",
|
||||
"BriefDescription": "Store-Hit-Load Table Read Hit with entry Enabled"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x46882",
|
||||
"EventName": "PM_L2_ST_HIT",
|
||||
"BriefDescription": "All successful D-side store dispatches for this thread that were L2 hits"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x360AC",
|
||||
"EventName": "PM_L3_SN0_BUSY",
|
||||
@ -1844,11 +1739,6 @@
|
||||
"EventName": "PM_L2_ST_MISS",
|
||||
"BriefDescription": "All successful D-Side Store dispatches that were an L2 miss for this thread"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF8B4",
|
||||
"EventName": "PM_DC_PREF_XCONS_ALLOC",
|
||||
"BriefDescription": "Prefetch stream allocated in the Ultra conservative phase by either the hardware prefetch mechanism or software prefetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x35048",
|
||||
"EventName": "PM_IPTEG_FROM_DL2L3_SHR",
|
||||
@ -1969,11 +1859,6 @@
|
||||
"EventName": "PM_THRD_PRIO_2_3_CYC",
|
||||
"BriefDescription": "Cycles thread running at priority level 2 or 3"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10134",
|
||||
"EventName": "PM_MRK_ST_DONE_L2",
|
||||
"BriefDescription": "marked store completed in L2 ( RC machine done)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x368B2",
|
||||
"EventName": "PM_L3_GRP_GUESS_WRONG_HIGH",
|
||||
@ -2004,11 +1889,6 @@
|
||||
"EventName": "PM_L2_GRP_GUESS_WRONG",
|
||||
"BriefDescription": "L2 guess grp (GS or NNS) and guess was not correct (ie data on-chip OR beyond-group)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x368AE",
|
||||
"EventName": "PM_L3_P1_CO_RTY",
|
||||
"BriefDescription": "L3 CO received retry port 1 (memory only), every retry counted"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC0AC",
|
||||
"EventName": "PM_LSU_FLUSH_EMSH",
|
||||
@ -2034,11 +1914,6 @@
|
||||
"EventName": "PM_L2_GROUP_PUMP",
|
||||
"BriefDescription": "RC requests that were on group (aka nodel) pump attempts"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF0B0",
|
||||
"EventName": "PM_L3_LD_PREF",
|
||||
"BriefDescription": "L3 load prefetch, sourced from a hardware or software stream, was sent to the nest"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x16080",
|
||||
"EventName": "PM_L2_LD",
|
||||
@ -2049,6 +1924,11 @@
|
||||
"EventName": "PM_MATH_FLOP_CMPL",
|
||||
"BriefDescription": "Math flop instruction completed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xC080",
|
||||
"EventName": "PM_LS0_LD_VECTOR_FIN",
|
||||
"BriefDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x368B0",
|
||||
"EventName": "PM_L3_P1_SYS_PUMP",
|
||||
@ -2119,11 +1999,6 @@
|
||||
"EventName": "PM_BR_CORECT_PRED_TAKEN_CMPL",
|
||||
"BriefDescription": "Conditional Branch Completed in which the HW correctly predicted the direction as taken. Counted at completion time"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF0B8",
|
||||
"EventName": "PM_LS0_UNALIGNED_ST",
|
||||
"BriefDescription": "Store instructions whose data crosses a double-word boundary, which causes it to require an additional slice than than what normally would be required of the Store of that size. If the Store wraps from slice 3 to slice 0, thee is an additional 3-cycle penalty"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20132",
|
||||
"EventName": "PM_MRK_DFU_FIN",
|
||||
@ -2139,6 +2014,11 @@
|
||||
"EventName": "PM_LSU_FLUSH_LHS",
|
||||
"BriefDescription": "Effective Address alias flush : no EA match but Real Address match. If the data has not yet been returned for this load, the instruction will just be rejected, but if it has returned data, it will be flushed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x16084",
|
||||
"EventName": "PM_L2_RCLD_DISP",
|
||||
"BriefDescription": "All I-or-D side load dispatch attempts for this thread (excludes i_l2mru_tch_reqs)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3F150",
|
||||
"EventName": "PM_MRK_ST_DRAIN_TO_L2DISP_CYC",
|
||||
@ -2224,11 +2104,6 @@
|
||||
"EventName": "PM_IC_PREF_CANCEL_PAGE",
|
||||
"BriefDescription": "Prefetch Canceled due to page boundary"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xF09C",
|
||||
"EventName": "PM_SLB_TABLEWALK_CYC",
|
||||
"BriefDescription": "Cycles when a tablewalk is pending on this thread on the SLB table"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x460AA",
|
||||
"EventName": "PM_L3_P0_CO_L31",
|
||||
@ -2247,10 +2122,10 @@
|
||||
{,
|
||||
"EventCode": "0x46082",
|
||||
"EventName": "PM_L2_ST_DISP",
|
||||
"BriefDescription": "All successful D-side store dispatches for this thread "
|
||||
"BriefDescription": "All successful D-side store dispatches for this thread (L2 miss + L2 hits)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4609E",
|
||||
"EventCode": "0x36880",
|
||||
"EventName": "PM_L2_INST_MISS",
|
||||
"BriefDescription": "All successful I-side dispatches that were an L2 miss for this thread (excludes i_l2mru_tch reqs)"
|
||||
},
|
||||
@ -2340,9 +2215,9 @@
|
||||
"BriefDescription": "All ISU rejects"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x46882",
|
||||
"EventName": "PM_L2_ST_HIT",
|
||||
"BriefDescription": "All successful D-side store dispatches for this thread that were L2 hits"
|
||||
"EventCode": "0xC884",
|
||||
"EventName": "PM_LS3_LD_VECTOR_FIN",
|
||||
"BriefDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x360A8",
|
||||
@ -2359,11 +2234,6 @@
|
||||
"EventName": "PM_LSU_NCST",
|
||||
"BriefDescription": "Asserts when a i=1 store op is sent to the nest. No record of issue pipe (LS0/LS1) is maintained so this is for both pipes. Probably don't need separate LS0 and LS1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD880",
|
||||
"EventName": "PM_LSU1_SET_MPRED",
|
||||
"BriefDescription": "Set prediction(set-p) miss. The entry was not found in the Set prediction table"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xD0B8",
|
||||
"EventName": "PM_LSU_LMQ_FULL_CYC",
|
||||
@ -2389,4 +2259,4 @@
|
||||
"EventName": "PM_L3_PF_USAGE",
|
||||
"BriefDescription": "Rotating sample of 32 PF actives"
|
||||
}
|
||||
]
|
||||
]
|
@ -124,6 +124,11 @@
|
||||
"EventName": "PM_PMC5_OVERFLOW",
|
||||
"BriefDescription": "Overflow from counter 5"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4505E",
|
||||
"EventName": "PM_FLOP_CMPL",
|
||||
"BriefDescription": "Floating Point Operation Finished"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2C018",
|
||||
"EventName": "PM_CMPLU_STALL_DMISS_L21_L31",
|
||||
@ -389,11 +394,6 @@
|
||||
"EventName": "PM_ICT_NOSLOT_BR_MPRED",
|
||||
"BriefDescription": "Ict empty for this thread due to branch mispred"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3405E",
|
||||
"EventName": "PM_IFETCH_THROTTLE",
|
||||
"BriefDescription": "Cycles in which Instruction fetch throttle was active."
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1F148",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_ON_CHIP_CACHE",
|
||||
@ -422,7 +422,7 @@
|
||||
{,
|
||||
"EventCode": "0xD0A8",
|
||||
"EventName": "PM_DSLB_MISS",
|
||||
"BriefDescription": "Data SLB Miss - Total of all segment sizes"
|
||||
"BriefDescription": "gate_and(sd_pc_c0_comp_valid AND sd_pc_c0_comp_thread(0:1)=tid,sd_pc_c0_comp_ppc_count(0:3)) + gate_and(sd_pc_c1_comp_valid AND sd_pc_c1_comp_thread(0:1)=tid,sd_pc_c1_comp_ppc_count(0:3))"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4C058",
|
||||
@ -549,4 +549,4 @@
|
||||
"EventName": "PM_MRK_DATA_FROM_L21_SHR_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload with Shared (S) data from another core's L2 on the same chip due to a marked load"
|
||||
}
|
||||
]
|
||||
]
|
@ -119,4 +119,4 @@
|
||||
"EventName": "PM_1FLOP_CMPL",
|
||||
"BriefDescription": "one flop (fadd, fmul, fsub, fcmp, fsel, fabs, fnabs, fres, fsqrte, fneg) operation completed"
|
||||
}
|
||||
]
|
||||
]
|
@ -89,11 +89,6 @@
|
||||
"EventName": "PM_STCX_FAIL",
|
||||
"BriefDescription": "stcx failed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20112",
|
||||
"EventName": "PM_MRK_NTF_FIN",
|
||||
"BriefDescription": "Marked next to finish instruction finished"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300F0",
|
||||
"EventName": "PM_ST_MISS_L1",
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
[
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of transitions from AVX-256 to legacy SSE when penalty is applicable.",
|
||||
"PublicDescription": "This event counts the number of transitions from AVX-256 to legacy SSE when penalty is applicable.",
|
||||
"EventCode": "0xC1",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
@ -11,7 +11,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of transitions from legacy SSE to AVX-256 when penalty is applicable.",
|
||||
"PublicDescription": "This event counts the number of transitions from legacy SSE to AVX-256 when penalty is applicable.",
|
||||
"EventCode": "0xC1",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
@ -22,7 +22,6 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
@ -32,7 +31,6 @@
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
@ -42,7 +40,15 @@
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar floating-point instructions retired. Applies to SSE* and AVX* scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RSQRT RCP SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
@ -52,7 +58,6 @@
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
@ -62,7 +67,6 @@
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
@ -72,7 +76,43 @@
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of x87 floating point (FP) micro-code assist (numeric overflow/underflow, inexact result) when the output value (destination register) is invalid.",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x15",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.DOUBLE",
|
||||
"SampleAfterValue": "2000006",
|
||||
"BriefDescription": "Number of SSE/AVX computational double precision floating-point instructions retired. Applies to SSE* and AVX*scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element. ?.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired. Each count represents 8 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2a",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SINGLE",
|
||||
"SampleAfterValue": "2000005",
|
||||
"BriefDescription": "Number of SSE/AVX computational single precision floating-point instructions retired. Applies to SSE* and AVX*scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element. ?.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x3c",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.PACKED",
|
||||
"SampleAfterValue": "2000004",
|
||||
"BriefDescription": "Number of SSE/AVX computational packed floating-point instructions retired. Applies to SSE* and AVX*, packed, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RSQRT RCP SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of x87 floating point (FP) micro-code assist (numeric overflow/underflow, inexact result) when the output value (destination register) is invalid.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
@ -82,7 +122,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts x87 floating point (FP) micro-code assist (invalid operation, denormal operand, SNaN operand) when the input value (one of the source operands to an FP instruction) is invalid.",
|
||||
"PublicDescription": "This event counts x87 floating point (FP) micro-code assist (invalid operation, denormal operand, SNaN operand) when the input value (one of the source operands to an FP instruction) is invalid.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
@ -92,7 +132,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of SSE* floating point (FP) micro-code assist (numeric overflow/underflow) when the output value (destination register) is invalid. Counting covers only cases involving penalties that require micro-code assist intervention.",
|
||||
"PublicDescription": "This event counts the number of SSE* floating point (FP) micro-code assist (numeric overflow/underflow) when the output value (destination register) is invalid. Counting covers only cases involving penalties that require micro-code assist intervention.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
@ -102,7 +142,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts any input SSE* FP assist - invalid operation, denormal operand, dividing by zero, SNaN operand. Counting includes only cases involving penalties that required micro-code assist intervention.",
|
||||
"PublicDescription": "This event counts any input SSE* FP assist - invalid operation, denormal operand, dividing by zero, SNaN operand. Counting includes only cases involving penalties that required micro-code assist intervention.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
@ -121,51 +161,5 @@
|
||||
"BriefDescription": "Cycles with any input/output SSE or FP assist",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xc7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired. Each count represents 8 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar floating-point instructions retired. Applies to SSE* and AVX* scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RSQRT RCP SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x3c",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.PACKED",
|
||||
"SampleAfterValue": "2000004",
|
||||
"BriefDescription": "Number of SSE/AVX computational packed floating-point instructions retired. Applies to SSE* and AVX*, packed, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RSQRT RCP SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2a",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SINGLE",
|
||||
"SampleAfterValue": "2000005",
|
||||
"BriefDescription": "Number of SSE/AVX computational single precision floating-point instructions retired. Applies to SSE* and AVX*scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element. ?.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x15",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.DOUBLE",
|
||||
"SampleAfterValue": "2000006",
|
||||
"BriefDescription": "Number of SSE/AVX computational double precision floating-point instructions retired. Applies to SSE* and AVX*scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element. ?.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
}
|
||||
]
|
@ -10,7 +10,7 @@
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may bypass the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
@ -20,58 +20,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"EventName": "IDQ.DSB_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"EventName": "IDQ.MS_DSB_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "IDQ.MS_MITE_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the total number of uops delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EventName": "IDQ.MS_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EventName": "IDQ.MS_CYCLES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
@ -82,7 +31,17 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"EventName": "IDQ.DSB_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
@ -93,7 +52,17 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"PublicDescription": "This event counts the number of uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"EventName": "IDQ.MS_DSB_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
@ -104,7 +73,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of deliveries to Instruction Decode Queue (IDQ) initiated by Decode Stream Buffer (DSB) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"PublicDescription": "This event counts the number of deliveries to Instruction Decode Queue (IDQ) initiated by Decode Stream Buffer (DSB) while the Microcode Sequencer (MS) is busy. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
@ -116,7 +85,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"PublicDescription": "This event counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x18",
|
||||
@ -127,7 +96,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"PublicDescription": "This event counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x18",
|
||||
@ -138,7 +107,17 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"PublicDescription": "This event counts the number of uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may bypass the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "IDQ.MS_MITE_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may bypass the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x24",
|
||||
@ -149,7 +128,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"PublicDescription": "This event counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may bypass the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x24",
|
||||
@ -160,7 +139,39 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"PublicDescription": "This event counts the total number of uops delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may bypass the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EventName": "IDQ.MS_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may bypass the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EventName": "IDQ.MS_CYCLES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EdgeDetect": "1",
|
||||
"EventName": "IDQ.MS_SWITCHES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer.",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may bypass the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x3c",
|
||||
@ -200,7 +211,7 @@
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops not delivered to Resource Allocation Table (RAT) per thread adding ?4 ? x? when Resource Allocation Table (RAT) is not stalled and Instruction Decode Queue (IDQ) delivers x uops to Resource Allocation Table (RAT) (where x belongs to {0,1,2,3}). Counting does not cover cases when:\n a. IDQ-Resource Allocation Table (RAT) pipe serves the other thread;\n b. Resource Allocation Table (RAT) is stalled for the thread (including uop drops and clear BE conditions); \n c. Instruction Decode Queue (IDQ) delivers four uops.",
|
||||
"PublicDescription": "This event counts the number of uops not delivered to Resource Allocation Table (RAT) per thread adding 4 x when Resource Allocation Table (RAT) is not stalled and Instruction Decode Queue (IDQ) delivers x uops to Resource Allocation Table (RAT) (where x belongs to {0,1,2,3}). Counting does not cover cases when:\n a. IDQ-Resource Allocation Table (RAT) pipe serves the other thread;\n b. Resource Allocation Table (RAT) is stalled for the thread (including uop drops and clear BE conditions); \n c. Instruction Decode Queue (IDQ) delivers four uops.",
|
||||
"EventCode": "0x9C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
@ -263,7 +274,7 @@
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles. These cycles do not include uops routed through because of the switch itself, for example, when Instruction Decode Queue (IDQ) pre-allocation is unavailable, or Instruction Decode Queue (IDQ) is full. SBD-to-MITE switch true penalty cycles happen after the merge mux (MM) receives Decode Stream Buffer (DSB) Sync-indication until receiving the first MITE uop. \nMM is placed before Instruction Decode Queue (IDQ) to merge uops being fed from the MITE and Decode Stream Buffer (DSB) paths. Decode Stream Buffer (DSB) inserts the Sync-indication whenever a Decode Stream Buffer (DSB)-to-MITE switch occurs.\nPenalty: A Decode Stream Buffer (DSB) hit followed by a Decode Stream Buffer (DSB) miss can cost up to six cycles in which no uops are delivered to the IDQ. Most often, such switches from the Decode Stream Buffer (DSB) to the legacy pipeline cost 0?2 cycles.",
|
||||
"PublicDescription": "This event counts Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles. These cycles do not include uops routed through because of the switch itself, for example, when Instruction Decode Queue (IDQ) pre-allocation is unavailable, or Instruction Decode Queue (IDQ) is full. SBD-to-MITE switch true penalty cycles happen after the merge mux (MM) receives Decode Stream Buffer (DSB) Sync-indication until receiving the first MITE uop. \nMM is placed before Instruction Decode Queue (IDQ) to merge uops being fed from the MITE and Decode Stream Buffer (DSB) paths. Decode Stream Buffer (DSB) inserts the Sync-indication whenever a Decode Stream Buffer (DSB)-to-MITE switch occurs.\nPenalty: A Decode Stream Buffer (DSB) hit followed by a Decode Stream Buffer (DSB) miss can cost up to six cycles in which no uops are delivered to the IDQ. Most often, such switches from the Decode Stream Buffer (DSB) to the legacy pipeline cost 02 cycles.",
|
||||
"EventCode": "0xAB",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
@ -271,16 +282,5 @@
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EdgeDetect": "1",
|
||||
"EventName": "IDQ.MS_SWITCHES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer.",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
}
|
||||
]
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user