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 } 69