perf_regs.c (1434B)
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 17u64 perf_reg_abi(struct task_struct *tsk) 18{ 19 return PERF_SAMPLE_REGS_ABI_32; 20} 21#else /* Must be CONFIG_64BIT */ 22u64 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 31int 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 40u64 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 63void 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}