1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Mapping of DWARF debug register numbers into register names. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright IBM Corp. 2010, 2017 6*4882a593Smuzhiyun * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>, 7*4882a593Smuzhiyun * Hendrik Brueckner <brueckner@linux.vnet.ibm.com> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <errno.h> 12*4882a593Smuzhiyun #include <stddef.h> 13*4882a593Smuzhiyun #include <stdlib.h> 14*4882a593Smuzhiyun #include <linux/kernel.h> 15*4882a593Smuzhiyun #include <asm/ptrace.h> 16*4882a593Smuzhiyun #include <string.h> 17*4882a593Smuzhiyun #include <dwarf-regs.h> 18*4882a593Smuzhiyun #include "dwarf-regs-table.h" 19*4882a593Smuzhiyun get_arch_regstr(unsigned int n)20*4882a593Smuzhiyunconst char *get_arch_regstr(unsigned int n) 21*4882a593Smuzhiyun { 22*4882a593Smuzhiyun return (n >= ARRAY_SIZE(s390_dwarf_regs)) ? NULL : s390_dwarf_regs[n]; 23*4882a593Smuzhiyun } 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* 26*4882a593Smuzhiyun * Convert the register name into an offset to struct pt_regs (kernel). 27*4882a593Smuzhiyun * This is required by the BPF prologue generator. The BPF 28*4882a593Smuzhiyun * program is called in the BPF overflow handler in the perf 29*4882a593Smuzhiyun * core. 30*4882a593Smuzhiyun */ regs_query_register_offset(const char * name)31*4882a593Smuzhiyunint regs_query_register_offset(const char *name) 32*4882a593Smuzhiyun { 33*4882a593Smuzhiyun unsigned long gpr; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun if (!name || strncmp(name, "%r", 2)) 36*4882a593Smuzhiyun return -EINVAL; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun errno = 0; 39*4882a593Smuzhiyun gpr = strtoul(name + 2, NULL, 10); 40*4882a593Smuzhiyun if (errno || gpr >= 16) 41*4882a593Smuzhiyun return -EINVAL; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun return offsetof(user_pt_regs, gprs) + 8 * gpr; 44*4882a593Smuzhiyun } 45