1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | /* |
3 | * This file is subject to the terms and conditions of the GNU General Public |
4 | * License. See the file "COPYING" in the main directory of this archive |
5 | * for more details. |
6 | * |
7 | * Some parts derived from x86 version of this file. |
8 | * |
9 | * Copyright (C) 2013 Cavium, Inc. |
10 | */ |
11 | |
12 | #include <linux/perf_event.h> |
13 | |
14 | #include <asm/ptrace.h> |
15 | |
16 | #ifdef CONFIG_32BIT |
17 | u64 perf_reg_abi(struct task_struct *tsk) |
18 | { |
19 | return PERF_SAMPLE_REGS_ABI_32; |
20 | } |
21 | #else /* Must be CONFIG_64BIT */ |
22 | u64 perf_reg_abi(struct task_struct *tsk) |
23 | { |
24 | if (test_tsk_thread_flag(tsk, flag: TIF_32BIT_REGS)) |
25 | return PERF_SAMPLE_REGS_ABI_32; |
26 | else |
27 | return PERF_SAMPLE_REGS_ABI_64; |
28 | } |
29 | #endif /* CONFIG_32BIT */ |
30 | |
31 | int perf_reg_validate(u64 mask) |
32 | { |
33 | if (!mask) |
34 | return -EINVAL; |
35 | if (mask & ~((1ull << PERF_REG_MIPS_MAX) - 1)) |
36 | return -EINVAL; |
37 | return 0; |
38 | } |
39 | |
40 | u64 perf_reg_value(struct pt_regs *regs, int idx) |
41 | { |
42 | long v; |
43 | |
44 | switch (idx) { |
45 | case PERF_REG_MIPS_PC: |
46 | v = regs->cp0_epc; |
47 | break; |
48 | case PERF_REG_MIPS_R1 ... PERF_REG_MIPS_R25: |
49 | v = regs->regs[idx - PERF_REG_MIPS_R1 + 1]; |
50 | break; |
51 | case PERF_REG_MIPS_R28 ... PERF_REG_MIPS_R31: |
52 | v = regs->regs[idx - PERF_REG_MIPS_R28 + 28]; |
53 | break; |
54 | |
55 | default: |
56 | WARN_ON_ONCE(1); |
57 | return 0; |
58 | } |
59 | |
60 | return (s64)v; /* Sign extend if 32-bit. */ |
61 | } |
62 | |
63 | void perf_get_regs_user(struct perf_regs *regs_user, |
64 | struct pt_regs *regs) |
65 | { |
66 | regs_user->regs = task_pt_regs(current); |
67 | regs_user->abi = perf_reg_abi(current); |
68 | } |
69 |