Merge tag 'compiler-attributes-for-linus-v5.15-rc1-v2' of git://github.com/ojeda...
[linux-2.6-microblaze.git] / arch / mips / kernel / perf_regs.c
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, 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 }