xref: /linux/arch/csky/kernel/perf_regs.c (revision cdd38c5f1ce4398ec58fec95904b75824daab7b5)
1daac95e7SMao Han // SPDX-License-Identifier: GPL-2.0
2daac95e7SMao Han // Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
3daac95e7SMao Han 
4daac95e7SMao Han #include <linux/errno.h>
5daac95e7SMao Han #include <linux/kernel.h>
6daac95e7SMao Han #include <linux/perf_event.h>
7daac95e7SMao Han #include <linux/bug.h>
8daac95e7SMao Han #include <asm/perf_regs.h>
9daac95e7SMao Han #include <asm/ptrace.h>
10daac95e7SMao Han 
perf_reg_value(struct pt_regs * regs,int idx)11daac95e7SMao Han u64 perf_reg_value(struct pt_regs *regs, int idx)
12daac95e7SMao Han {
13daac95e7SMao Han 	if (WARN_ON_ONCE((u32)idx >= PERF_REG_CSKY_MAX))
14daac95e7SMao Han 		return 0;
15daac95e7SMao Han 
16daac95e7SMao Han 	return (u64)*((u32 *)regs + idx);
17daac95e7SMao Han }
18daac95e7SMao Han 
19daac95e7SMao Han #define REG_RESERVED (~((1ULL << PERF_REG_CSKY_MAX) - 1))
20daac95e7SMao Han 
perf_reg_validate(u64 mask)21daac95e7SMao Han int perf_reg_validate(u64 mask)
22daac95e7SMao Han {
23daac95e7SMao Han 	if (!mask || mask & REG_RESERVED)
24daac95e7SMao Han 		return -EINVAL;
25daac95e7SMao Han 
26daac95e7SMao Han 	return 0;
27daac95e7SMao Han }
28daac95e7SMao Han 
perf_reg_abi(struct task_struct * task)29daac95e7SMao Han u64 perf_reg_abi(struct task_struct *task)
30daac95e7SMao Han {
31daac95e7SMao Han 	return PERF_SAMPLE_REGS_ABI_32;
32daac95e7SMao Han }
33daac95e7SMao Han 
perf_get_regs_user(struct perf_regs * regs_user,struct pt_regs * regs)34daac95e7SMao Han void perf_get_regs_user(struct perf_regs *regs_user,
35*76a4efa8SPeter Zijlstra 			struct pt_regs *regs)
36daac95e7SMao Han {
37daac95e7SMao Han 	regs_user->regs = task_pt_regs(current);
38daac95e7SMao Han 	regs_user->abi = perf_reg_abi(current);
39daac95e7SMao Han }
40