1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (C) 2019 Hangzhou C-SKY Microsyst !! 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 */ 3 11 4 #include <linux/errno.h> << 5 #include <linux/kernel.h> << 6 #include <linux/perf_event.h> 12 #include <linux/perf_event.h> 7 #include <linux/bug.h> !! 13 8 #include <asm/perf_regs.h> << 9 #include <asm/ptrace.h> 14 #include <asm/ptrace.h> 10 15 11 u64 perf_reg_value(struct pt_regs *regs, int i !! 16 #ifdef CONFIG_32BIT >> 17 u64 perf_reg_abi(struct task_struct *tsk) 12 { 18 { 13 if (WARN_ON_ONCE((u32)idx >= PERF_REG_ !! 19 return PERF_SAMPLE_REGS_ABI_32; 14 return 0; << 15 << 16 return ((unsigned long *)regs)[idx]; << 17 } 20 } 18 !! 21 #else /* Must be CONFIG_64BIT */ 19 #define REG_RESERVED (~((1ULL << PERF_REG_RISC !! 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 */ 20 30 21 int perf_reg_validate(u64 mask) 31 int perf_reg_validate(u64 mask) 22 { 32 { 23 if (!mask || mask & REG_RESERVED) !! 33 if (!mask) >> 34 return -EINVAL; >> 35 if (mask & ~((1ull << PERF_REG_MIPS_MAX) - 1)) 24 return -EINVAL; 36 return -EINVAL; 25 << 26 return 0; 37 return 0; 27 } 38 } 28 39 29 u64 perf_reg_abi(struct task_struct *task) !! 40 u64 perf_reg_value(struct pt_regs *regs, int idx) 30 { 41 { 31 #if __riscv_xlen == 64 !! 42 long v; 32 return PERF_SAMPLE_REGS_ABI_64; !! 43 33 #else !! 44 switch (idx) { 34 return PERF_SAMPLE_REGS_ABI_32; !! 45 case PERF_REG_MIPS_PC: 35 #endif !! 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. */ 36 } 61 } 37 62 38 void perf_get_regs_user(struct perf_regs *regs 63 void perf_get_regs_user(struct perf_regs *regs_user, 39 struct pt_regs *regs) 64 struct pt_regs *regs) 40 { 65 { 41 regs_user->regs = task_pt_regs(current 66 regs_user->regs = task_pt_regs(current); 42 regs_user->abi = perf_reg_abi(current) 67 regs_user->abi = perf_reg_abi(current); 43 } 68 } 44 69
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.