Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/parisc/kernel/perf_regs.c
30624 views
1
// SPDX-License-Identifier: GPL-2.0
2
3
/* Copyright (C) 2025 by Helge Deller <[email protected]> */
4
5
#include <linux/perf_event.h>
6
#include <linux/perf_regs.h>
7
#include <asm/ptrace.h>
8
9
u64 perf_reg_value(struct pt_regs *regs, int idx)
10
{
11
switch (idx) {
12
case PERF_REG_PARISC_R0 ... PERF_REG_PARISC_R31:
13
return regs->gr[idx - PERF_REG_PARISC_R0];
14
case PERF_REG_PARISC_SR0 ... PERF_REG_PARISC_SR7:
15
return regs->sr[idx - PERF_REG_PARISC_SR0];
16
case PERF_REG_PARISC_IASQ0 ... PERF_REG_PARISC_IASQ1:
17
return regs->iasq[idx - PERF_REG_PARISC_IASQ0];
18
case PERF_REG_PARISC_IAOQ0 ... PERF_REG_PARISC_IAOQ1:
19
return regs->iasq[idx - PERF_REG_PARISC_IAOQ0];
20
case PERF_REG_PARISC_SAR: /* CR11 */
21
return regs->sar;
22
case PERF_REG_PARISC_IIR: /* CR19 */
23
return regs->iir;
24
case PERF_REG_PARISC_ISR: /* CR20 */
25
return regs->isr;
26
case PERF_REG_PARISC_IOR: /* CR21 */
27
return regs->ior;
28
case PERF_REG_PARISC_IPSW: /* CR22 */
29
return regs->ipsw;
30
};
31
WARN_ON_ONCE((u32)idx >= PERF_REG_PARISC_MAX);
32
return 0;
33
}
34
35
#define REG_RESERVED (~((1ULL << PERF_REG_PARISC_MAX) - 1))
36
37
int perf_reg_validate(u64 mask)
38
{
39
if (!mask || mask & REG_RESERVED)
40
return -EINVAL;
41
42
return 0;
43
}
44
45
u64 perf_reg_abi(struct task_struct *task)
46
{
47
if (!IS_ENABLED(CONFIG_64BIT))
48
return PERF_SAMPLE_REGS_ABI_32;
49
50
if (test_tsk_thread_flag(task, TIF_32BIT))
51
return PERF_SAMPLE_REGS_ABI_32;
52
53
return PERF_SAMPLE_REGS_ABI_64;
54
}
55
56
void perf_get_regs_user(struct perf_regs *regs_user,
57
struct pt_regs *regs)
58
{
59
regs_user->regs = task_pt_regs(current);
60
regs_user->abi = perf_reg_abi(current);
61
}
62
63