summaryrefslogtreecommitdiff
path: root/tools/perf/arch/loongarch
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/arch/loongarch')
-rw-r--r--tools/perf/arch/loongarch/Makefile1
-rw-r--r--tools/perf/arch/loongarch/annotate/instructions.c139
-rw-r--r--tools/perf/arch/loongarch/entry/syscalls/Kbuild2
-rw-r--r--tools/perf/arch/loongarch/entry/syscalls/Makefile.syscalls3
-rw-r--r--tools/perf/arch/loongarch/include/perf_regs.h2
-rw-r--r--tools/perf/arch/loongarch/include/syscall_table.h2
-rw-r--r--tools/perf/arch/loongarch/util/Build5
-rw-r--r--tools/perf/arch/loongarch/util/kvm-stat.c139
-rw-r--r--tools/perf/arch/loongarch/util/perf_regs.c22
-rw-r--r--tools/perf/arch/loongarch/util/unwind-libdw.c57
-rw-r--r--tools/perf/arch/loongarch/util/unwind-libunwind.c82
11 files changed, 1 insertions, 453 deletions
diff --git a/tools/perf/arch/loongarch/Makefile b/tools/perf/arch/loongarch/Makefile
index 087e099fb453..44cc3f023318 100644
--- a/tools/perf/arch/loongarch/Makefile
+++ b/tools/perf/arch/loongarch/Makefile
@@ -1,3 +1,2 @@
# SPDX-License-Identifier: GPL-2.0
PERF_HAVE_JITDUMP := 1
-HAVE_KVM_STAT_SUPPORT := 1
diff --git a/tools/perf/arch/loongarch/annotate/instructions.c b/tools/perf/arch/loongarch/annotate/instructions.c
deleted file mode 100644
index 70262d5f1444..000000000000
--- a/tools/perf/arch/loongarch/annotate/instructions.c
+++ /dev/null
@@ -1,139 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Perf annotate functions.
- *
- * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
- */
-
-static int loongarch_call__parse(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms,
- struct disasm_line *dl __maybe_unused)
-{
- char *c, *endptr, *tok, *name;
- struct map *map = ms->map;
- struct addr_map_symbol target = {
- .ms = { .map = map, },
- };
-
- c = strchr(ops->raw, '#');
- if (c++ == NULL)
- return -1;
-
- ops->target.addr = strtoull(c, &endptr, 16);
-
- name = strchr(endptr, '<');
- name++;
-
- if (arch->objdump.skip_functions_char &&
- strchr(name, arch->objdump.skip_functions_char))
- return -1;
-
- tok = strchr(name, '>');
- if (tok == NULL)
- return -1;
-
- *tok = '\0';
- ops->target.name = strdup(name);
- *tok = '>';
-
- if (ops->target.name == NULL)
- return -1;
-
- target.addr = map__objdump_2mem(map, ops->target.addr);
-
- if (maps__find_ams(ms->maps, &target) == 0 &&
- map__rip_2objdump(target.ms.map, map__map_ip(target.ms.map, target.addr)) == ops->target.addr)
- ops->target.sym = target.ms.sym;
-
- return 0;
-}
-
-static struct ins_ops loongarch_call_ops = {
- .parse = loongarch_call__parse,
- .scnprintf = call__scnprintf,
-};
-
-static int loongarch_jump__parse(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms,
- struct disasm_line *dl __maybe_unused)
-{
- struct map *map = ms->map;
- struct symbol *sym = ms->sym;
- struct addr_map_symbol target = {
- .ms = { .map = map, },
- };
- const char *c = strchr(ops->raw, '#');
- u64 start, end;
-
- ops->jump.raw_comment = strchr(ops->raw, arch->objdump.comment_char);
- ops->jump.raw_func_start = strchr(ops->raw, '<');
-
- if (ops->jump.raw_func_start && c > ops->jump.raw_func_start)
- c = NULL;
-
- if (c++ != NULL)
- ops->target.addr = strtoull(c, NULL, 16);
- else
- ops->target.addr = strtoull(ops->raw, NULL, 16);
-
- target.addr = map__objdump_2mem(map, ops->target.addr);
- start = map__unmap_ip(map, sym->start);
- end = map__unmap_ip(map, sym->end);
-
- ops->target.outside = target.addr < start || target.addr > end;
-
- if (maps__find_ams(ms->maps, &target) == 0 &&
- map__rip_2objdump(target.ms.map, map__map_ip(target.ms.map, target.addr)) == ops->target.addr)
- ops->target.sym = target.ms.sym;
-
- if (!ops->target.outside) {
- ops->target.offset = target.addr - start;
- ops->target.offset_avail = true;
- } else {
- ops->target.offset_avail = false;
- }
-
- return 0;
-}
-
-static struct ins_ops loongarch_jump_ops = {
- .parse = loongarch_jump__parse,
- .scnprintf = jump__scnprintf,
-};
-
-static
-struct ins_ops *loongarch__associate_ins_ops(struct arch *arch, const char *name)
-{
- struct ins_ops *ops = NULL;
-
- if (!strcmp(name, "bl"))
- ops = &loongarch_call_ops;
- else if (!strcmp(name, "jirl"))
- ops = &ret_ops;
- else if (!strcmp(name, "b") ||
- !strncmp(name, "beq", 3) ||
- !strncmp(name, "bne", 3) ||
- !strncmp(name, "blt", 3) ||
- !strncmp(name, "bge", 3) ||
- !strncmp(name, "bltu", 4) ||
- !strncmp(name, "bgeu", 4))
- ops = &loongarch_jump_ops;
- else
- return NULL;
-
- arch__associate_ins_ops(arch, name, ops);
-
- return ops;
-}
-
-static
-int loongarch__annotate_init(struct arch *arch, char *cpuid __maybe_unused)
-{
- if (!arch->initialized) {
- arch->associate_instruction_ops = loongarch__associate_ins_ops;
- arch->initialized = true;
- arch->objdump.comment_char = '#';
- arch->e_machine = EM_LOONGARCH;
- arch->e_flags = 0;
- }
-
- return 0;
-}
diff --git a/tools/perf/arch/loongarch/entry/syscalls/Kbuild b/tools/perf/arch/loongarch/entry/syscalls/Kbuild
deleted file mode 100644
index 9a41e3572c3a..000000000000
--- a/tools/perf/arch/loongarch/entry/syscalls/Kbuild
+++ /dev/null
@@ -1,2 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-syscall-y += syscalls_64.h
diff --git a/tools/perf/arch/loongarch/entry/syscalls/Makefile.syscalls b/tools/perf/arch/loongarch/entry/syscalls/Makefile.syscalls
deleted file mode 100644
index 47d32da2aed8..000000000000
--- a/tools/perf/arch/loongarch/entry/syscalls/Makefile.syscalls
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-
-syscall_abis_64 +=
diff --git a/tools/perf/arch/loongarch/include/perf_regs.h b/tools/perf/arch/loongarch/include/perf_regs.h
index 45c799fa5330..b86078a55e90 100644
--- a/tools/perf/arch/loongarch/include/perf_regs.h
+++ b/tools/perf/arch/loongarch/include/perf_regs.h
@@ -4,7 +4,7 @@
#include <stdlib.h>
#include <linux/types.h>
-#include <asm/perf_regs.h>
+#include "../../../../arch/loongarch/include/uapi/asm/perf_regs.h"
#define PERF_REGS_MAX PERF_REG_LOONGARCH_MAX
diff --git a/tools/perf/arch/loongarch/include/syscall_table.h b/tools/perf/arch/loongarch/include/syscall_table.h
deleted file mode 100644
index 9d0646d3455c..000000000000
--- a/tools/perf/arch/loongarch/include/syscall_table.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#include <asm/syscall_table_64.h>
diff --git a/tools/perf/arch/loongarch/util/Build b/tools/perf/arch/loongarch/util/Build
index 0aa31986ecb5..2328fb9a30a3 100644
--- a/tools/perf/arch/loongarch/util/Build
+++ b/tools/perf/arch/loongarch/util/Build
@@ -1,6 +1 @@
perf-util-y += header.o
-perf-util-y += perf_regs.o
-
-perf-util-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
-perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
-perf-util-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
diff --git a/tools/perf/arch/loongarch/util/kvm-stat.c b/tools/perf/arch/loongarch/util/kvm-stat.c
deleted file mode 100644
index a7859a3a9a51..000000000000
--- a/tools/perf/arch/loongarch/util/kvm-stat.c
+++ /dev/null
@@ -1,139 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <errno.h>
-#include <memory.h>
-#include "util/kvm-stat.h"
-#include "util/parse-events.h"
-#include "util/debug.h"
-#include "util/evsel.h"
-#include "util/evlist.h"
-#include "util/pmus.h"
-
-#define LOONGARCH_EXCEPTION_INT 0
-#define LOONGARCH_EXCEPTION_PIL 1
-#define LOONGARCH_EXCEPTION_PIS 2
-#define LOONGARCH_EXCEPTION_PIF 3
-#define LOONGARCH_EXCEPTION_PME 4
-#define LOONGARCH_EXCEPTION_FPD 15
-#define LOONGARCH_EXCEPTION_SXD 16
-#define LOONGARCH_EXCEPTION_ASXD 17
-#define LOONGARCH_EXCEPTION_GSPR 22
-#define LOONGARCH_EXCEPTION_CPUCFG 100
-#define LOONGARCH_EXCEPTION_CSR 101
-#define LOONGARCH_EXCEPTION_IOCSR 102
-#define LOONGARCH_EXCEPTION_IDLE 103
-#define LOONGARCH_EXCEPTION_OTHERS 104
-#define LOONGARCH_EXCEPTION_HVC 23
-
-#define loongarch_exception_type \
- {LOONGARCH_EXCEPTION_INT, "Interrupt" }, \
- {LOONGARCH_EXCEPTION_PIL, "Mem Read" }, \
- {LOONGARCH_EXCEPTION_PIS, "Mem Store" }, \
- {LOONGARCH_EXCEPTION_PIF, "Inst Fetch" }, \
- {LOONGARCH_EXCEPTION_PME, "Mem Modify" }, \
- {LOONGARCH_EXCEPTION_FPD, "FPU" }, \
- {LOONGARCH_EXCEPTION_SXD, "LSX" }, \
- {LOONGARCH_EXCEPTION_ASXD, "LASX" }, \
- {LOONGARCH_EXCEPTION_GSPR, "Privilege Error" }, \
- {LOONGARCH_EXCEPTION_HVC, "Hypercall" }, \
- {LOONGARCH_EXCEPTION_CPUCFG, "CPUCFG" }, \
- {LOONGARCH_EXCEPTION_CSR, "CSR" }, \
- {LOONGARCH_EXCEPTION_IOCSR, "IOCSR" }, \
- {LOONGARCH_EXCEPTION_IDLE, "Idle" }, \
- {LOONGARCH_EXCEPTION_OTHERS, "Others" }
-
-define_exit_reasons_table(loongarch_exit_reasons, loongarch_exception_type);
-
-const char *vcpu_id_str = "vcpu_id";
-const char *kvm_exit_reason = "reason";
-const char *kvm_entry_trace = "kvm:kvm_enter";
-const char *kvm_reenter_trace = "kvm:kvm_reenter";
-const char *kvm_exit_trace = "kvm:kvm_exit";
-const char *kvm_events_tp[] = {
- "kvm:kvm_enter",
- "kvm:kvm_reenter",
- "kvm:kvm_exit",
- "kvm:kvm_exit_gspr",
- NULL,
-};
-
-static bool event_begin(struct evsel *evsel,
- struct perf_sample *sample, struct event_key *key)
-{
- return exit_event_begin(evsel, sample, key);
-}
-
-static bool event_end(struct evsel *evsel,
- struct perf_sample *sample __maybe_unused,
- struct event_key *key __maybe_unused)
-{
- /*
- * LoongArch kvm is different with other architectures
- *
- * There is kvm:kvm_reenter or kvm:kvm_enter event adjacent with
- * kvm:kvm_exit event.
- * kvm:kvm_enter means returning to vmm and then to guest
- * kvm:kvm_reenter means returning to guest immediately
- */
- return evsel__name_is(evsel, kvm_entry_trace) || evsel__name_is(evsel, kvm_reenter_trace);
-}
-
-static void event_gspr_get_key(struct evsel *evsel,
- struct perf_sample *sample, struct event_key *key)
-{
- unsigned int insn;
-
- key->key = LOONGARCH_EXCEPTION_OTHERS;
- insn = evsel__intval(evsel, sample, "inst_word");
-
- switch (insn >> 24) {
- case 0:
- /* CPUCFG inst trap */
- if ((insn >> 10) == 0x1b)
- key->key = LOONGARCH_EXCEPTION_CPUCFG;
- break;
- case 4:
- /* CSR inst trap */
- key->key = LOONGARCH_EXCEPTION_CSR;
- break;
- case 6:
- /* IOCSR inst trap */
- if ((insn >> 15) == 0xc90)
- key->key = LOONGARCH_EXCEPTION_IOCSR;
- else if ((insn >> 15) == 0xc91)
- /* Idle inst trap */
- key->key = LOONGARCH_EXCEPTION_IDLE;
- break;
- default:
- key->key = LOONGARCH_EXCEPTION_OTHERS;
- break;
- }
-}
-
-static struct child_event_ops child_events[] = {
- { .name = "kvm:kvm_exit_gspr", .get_key = event_gspr_get_key },
- { NULL, NULL },
-};
-
-static struct kvm_events_ops exit_events = {
- .is_begin_event = event_begin,
- .is_end_event = event_end,
- .child_ops = child_events,
- .decode_key = exit_event_decode_key,
- .name = "VM-EXIT"
-};
-
-struct kvm_reg_events_ops kvm_reg_events_ops[] = {
- { .name = "vmexit", .ops = &exit_events, },
- { NULL, NULL },
-};
-
-const char * const kvm_skip_events[] = {
- NULL,
-};
-
-int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unused)
-{
- kvm->exit_reasons_isa = "loongarch64";
- kvm->exit_reasons = loongarch_exit_reasons;
- return 0;
-}
diff --git a/tools/perf/arch/loongarch/util/perf_regs.c b/tools/perf/arch/loongarch/util/perf_regs.c
deleted file mode 100644
index f94a0210c7b7..000000000000
--- a/tools/perf/arch/loongarch/util/perf_regs.c
+++ /dev/null
@@ -1,22 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include "perf_regs.h"
-#include "../../../util/perf_regs.h"
-
-static const struct sample_reg sample_reg_masks[] = {
- SMPL_REG_END
-};
-
-uint64_t arch__intr_reg_mask(void)
-{
- return PERF_REGS_MASK;
-}
-
-uint64_t arch__user_reg_mask(void)
-{
- return PERF_REGS_MASK;
-}
-
-const struct sample_reg *arch__sample_reg_masks(void)
-{
- return sample_reg_masks;
-}
diff --git a/tools/perf/arch/loongarch/util/unwind-libdw.c b/tools/perf/arch/loongarch/util/unwind-libdw.c
deleted file mode 100644
index 7b3b9a4b21f8..000000000000
--- a/tools/perf/arch/loongarch/util/unwind-libdw.c
+++ /dev/null
@@ -1,57 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2020-2023 Loongson Technology Corporation Limited */
-
-#include <elfutils/libdwfl.h>
-#include "perf_regs.h"
-#include "../../util/unwind-libdw.h"
-#include "../../util/perf_regs.h"
-#include "../../util/sample.h"
-
-bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
-{
- struct unwind_info *ui = arg;
- struct regs_dump *user_regs = &ui->sample->user_regs;
- Dwarf_Word dwarf_regs[PERF_REG_LOONGARCH_MAX];
-
-#define REG(r) ({ \
- Dwarf_Word val = 0; \
- perf_reg_value(&val, user_regs, PERF_REG_LOONGARCH_##r); \
- val; \
-})
-
- dwarf_regs[0] = 0;
- dwarf_regs[1] = REG(R1);
- dwarf_regs[2] = REG(R2);
- dwarf_regs[3] = REG(R3);
- dwarf_regs[4] = REG(R4);
- dwarf_regs[5] = REG(R5);
- dwarf_regs[6] = REG(R6);
- dwarf_regs[7] = REG(R7);
- dwarf_regs[8] = REG(R8);
- dwarf_regs[9] = REG(R9);
- dwarf_regs[10] = REG(R10);
- dwarf_regs[11] = REG(R11);
- dwarf_regs[12] = REG(R12);
- dwarf_regs[13] = REG(R13);
- dwarf_regs[14] = REG(R14);
- dwarf_regs[15] = REG(R15);
- dwarf_regs[16] = REG(R16);
- dwarf_regs[17] = REG(R17);
- dwarf_regs[18] = REG(R18);
- dwarf_regs[19] = REG(R19);
- dwarf_regs[20] = REG(R20);
- dwarf_regs[21] = REG(R21);
- dwarf_regs[22] = REG(R22);
- dwarf_regs[23] = REG(R23);
- dwarf_regs[24] = REG(R24);
- dwarf_regs[25] = REG(R25);
- dwarf_regs[26] = REG(R26);
- dwarf_regs[27] = REG(R27);
- dwarf_regs[28] = REG(R28);
- dwarf_regs[29] = REG(R29);
- dwarf_regs[30] = REG(R30);
- dwarf_regs[31] = REG(R31);
- dwfl_thread_state_register_pc(thread, REG(PC));
-
- return dwfl_thread_state_registers(thread, 0, PERF_REG_LOONGARCH_MAX, dwarf_regs);
-}
diff --git a/tools/perf/arch/loongarch/util/unwind-libunwind.c b/tools/perf/arch/loongarch/util/unwind-libunwind.c
deleted file mode 100644
index f693167b86ef..000000000000
--- a/tools/perf/arch/loongarch/util/unwind-libunwind.c
+++ /dev/null
@@ -1,82 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-
-#include <errno.h>
-#include <libunwind.h>
-#include "perf_regs.h"
-#include "../../util/unwind.h"
-#include "util/debug.h"
-
-int libunwind__arch_reg_id(int regnum)
-{
- switch (regnum) {
- case UNW_LOONGARCH64_R1:
- return PERF_REG_LOONGARCH_R1;
- case UNW_LOONGARCH64_R2:
- return PERF_REG_LOONGARCH_R2;
- case UNW_LOONGARCH64_R3:
- return PERF_REG_LOONGARCH_R3;
- case UNW_LOONGARCH64_R4:
- return PERF_REG_LOONGARCH_R4;
- case UNW_LOONGARCH64_R5:
- return PERF_REG_LOONGARCH_R5;
- case UNW_LOONGARCH64_R6:
- return PERF_REG_LOONGARCH_R6;
- case UNW_LOONGARCH64_R7:
- return PERF_REG_LOONGARCH_R7;
- case UNW_LOONGARCH64_R8:
- return PERF_REG_LOONGARCH_R8;
- case UNW_LOONGARCH64_R9:
- return PERF_REG_LOONGARCH_R9;
- case UNW_LOONGARCH64_R10:
- return PERF_REG_LOONGARCH_R10;
- case UNW_LOONGARCH64_R11:
- return PERF_REG_LOONGARCH_R11;
- case UNW_LOONGARCH64_R12:
- return PERF_REG_LOONGARCH_R12;
- case UNW_LOONGARCH64_R13:
- return PERF_REG_LOONGARCH_R13;
- case UNW_LOONGARCH64_R14:
- return PERF_REG_LOONGARCH_R14;
- case UNW_LOONGARCH64_R15:
- return PERF_REG_LOONGARCH_R15;
- case UNW_LOONGARCH64_R16:
- return PERF_REG_LOONGARCH_R16;
- case UNW_LOONGARCH64_R17:
- return PERF_REG_LOONGARCH_R17;
- case UNW_LOONGARCH64_R18:
- return PERF_REG_LOONGARCH_R18;
- case UNW_LOONGARCH64_R19:
- return PERF_REG_LOONGARCH_R19;
- case UNW_LOONGARCH64_R20:
- return PERF_REG_LOONGARCH_R20;
- case UNW_LOONGARCH64_R21:
- return PERF_REG_LOONGARCH_R21;
- case UNW_LOONGARCH64_R22:
- return PERF_REG_LOONGARCH_R22;
- case UNW_LOONGARCH64_R23:
- return PERF_REG_LOONGARCH_R23;
- case UNW_LOONGARCH64_R24:
- return PERF_REG_LOONGARCH_R24;
- case UNW_LOONGARCH64_R25:
- return PERF_REG_LOONGARCH_R25;
- case UNW_LOONGARCH64_R26:
- return PERF_REG_LOONGARCH_R26;
- case UNW_LOONGARCH64_R27:
- return PERF_REG_LOONGARCH_R27;
- case UNW_LOONGARCH64_R28:
- return PERF_REG_LOONGARCH_R28;
- case UNW_LOONGARCH64_R29:
- return PERF_REG_LOONGARCH_R29;
- case UNW_LOONGARCH64_R30:
- return PERF_REG_LOONGARCH_R30;
- case UNW_LOONGARCH64_R31:
- return PERF_REG_LOONGARCH_R31;
- case UNW_LOONGARCH64_PC:
- return PERF_REG_LOONGARCH_PC;
- default:
- pr_err("unwind: invalid reg id %d\n", regnum);
- return -EINVAL;
- }
-
- return -EINVAL;
-}