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