1 // SPDX-License-Identifier: GPL-2.0 2 3 /* Copyright (C) 2025 by Helge Deller <deller@gmx.de> */ 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