cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dwarf-regs.c (1987B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.
      4 * Mapping of DWARF debug register numbers into register names.
      5 */
      6
      7#include <stddef.h>
      8#include <errno.h> /* for EINVAL */
      9#include <string.h> /* for strcmp */
     10#include <dwarf-regs.h>
     11
     12struct pt_regs_dwarfnum {
     13	const char *name;
     14	unsigned int dwarfnum;
     15};
     16
     17#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
     18#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
     19
     20struct pt_regs_dwarfnum riscv_dwarf_regs_table[] = {
     21	REG_DWARFNUM_NAME("%zero", 0),
     22	REG_DWARFNUM_NAME("%ra", 1),
     23	REG_DWARFNUM_NAME("%sp", 2),
     24	REG_DWARFNUM_NAME("%gp", 3),
     25	REG_DWARFNUM_NAME("%tp", 4),
     26	REG_DWARFNUM_NAME("%t0", 5),
     27	REG_DWARFNUM_NAME("%t1", 6),
     28	REG_DWARFNUM_NAME("%t2", 7),
     29	REG_DWARFNUM_NAME("%s0", 8),
     30	REG_DWARFNUM_NAME("%s1", 9),
     31	REG_DWARFNUM_NAME("%a0", 10),
     32	REG_DWARFNUM_NAME("%a1", 11),
     33	REG_DWARFNUM_NAME("%a2", 12),
     34	REG_DWARFNUM_NAME("%a3", 13),
     35	REG_DWARFNUM_NAME("%a4", 14),
     36	REG_DWARFNUM_NAME("%a5", 15),
     37	REG_DWARFNUM_NAME("%a6", 16),
     38	REG_DWARFNUM_NAME("%a7", 17),
     39	REG_DWARFNUM_NAME("%s2", 18),
     40	REG_DWARFNUM_NAME("%s3", 19),
     41	REG_DWARFNUM_NAME("%s4", 20),
     42	REG_DWARFNUM_NAME("%s5", 21),
     43	REG_DWARFNUM_NAME("%s6", 22),
     44	REG_DWARFNUM_NAME("%s7", 23),
     45	REG_DWARFNUM_NAME("%s8", 24),
     46	REG_DWARFNUM_NAME("%s9", 25),
     47	REG_DWARFNUM_NAME("%s10", 26),
     48	REG_DWARFNUM_NAME("%s11", 27),
     49	REG_DWARFNUM_NAME("%t3", 28),
     50	REG_DWARFNUM_NAME("%t4", 29),
     51	REG_DWARFNUM_NAME("%t5", 30),
     52	REG_DWARFNUM_NAME("%t6", 31),
     53	REG_DWARFNUM_END,
     54};
     55
     56#define RISCV_MAX_REGS ((sizeof(riscv_dwarf_regs_table) / \
     57		 sizeof(riscv_dwarf_regs_table[0])) - 1)
     58
     59const char *get_arch_regstr(unsigned int n)
     60{
     61	return (n < RISCV_MAX_REGS) ? riscv_dwarf_regs_table[n].name : NULL;
     62}
     63
     64int regs_query_register_offset(const char *name)
     65{
     66	const struct pt_regs_dwarfnum *roff;
     67
     68	for (roff = riscv_dwarf_regs_table; roff->name; roff++)
     69		if (!strcmp(roff->name, name))
     70			return roff->dwarfnum;
     71	return -EINVAL;
     72}