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