162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Mapping of DWARF debug register numbers into register names. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright IBM Corp. 2010, 2017 662306a36Sopenharmony_ci * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <errno.h> 1162306a36Sopenharmony_ci#include <stddef.h> 1262306a36Sopenharmony_ci#include <stdlib.h> 1362306a36Sopenharmony_ci#include <linux/kernel.h> 1462306a36Sopenharmony_ci#include <asm/ptrace.h> 1562306a36Sopenharmony_ci#include <string.h> 1662306a36Sopenharmony_ci#include <dwarf-regs.h> 1762306a36Sopenharmony_ci#include "dwarf-regs-table.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciconst char *get_arch_regstr(unsigned int n) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci return (n >= ARRAY_SIZE(s390_dwarf_regs)) ? NULL : s390_dwarf_regs[n]; 2262306a36Sopenharmony_ci} 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* 2562306a36Sopenharmony_ci * Convert the register name into an offset to struct pt_regs (kernel). 2662306a36Sopenharmony_ci * This is required by the BPF prologue generator. The BPF 2762306a36Sopenharmony_ci * program is called in the BPF overflow handler in the perf 2862306a36Sopenharmony_ci * core. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ciint regs_query_register_offset(const char *name) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci unsigned long gpr; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci if (!name || strncmp(name, "%r", 2)) 3562306a36Sopenharmony_ci return -EINVAL; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci errno = 0; 3862306a36Sopenharmony_ci gpr = strtoul(name + 2, NULL, 10); 3962306a36Sopenharmony_ci if (errno || gpr >= 16) 4062306a36Sopenharmony_ci return -EINVAL; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci return offsetof(user_pt_regs, gprs) + 8 * gpr; 4362306a36Sopenharmony_ci} 44