1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 /***************************************************************************
4 * Generic Xtensa target API for OpenOCD *
5 * Copyright (C) 2020-2022 Cadence Design Systems, Inc. *
6 * Copyright (C) 2016-2019 Espressif Systems Ltd. *
7 * Author: Angus Gratton gus@projectgus.com *
8 ***************************************************************************/
10 #ifndef OPENOCD_TARGET_XTENSA_REGS_H
11 #define OPENOCD_TARGET_XTENSA_REGS_H
18 XT_REG_IDX_ARFIRST = XT_REG_IDX_AR0,
34 XT_REG_IDX_ARLAST = 64, /* Max 64 ARs */
35 XT_REG_IDX_WINDOWBASE,
36 XT_REG_IDX_WINDOWSTART,
38 XT_REG_IDX_IBREAKENABLE,
48 XT_REG_IDX_DEBUGCAUSE,
50 XT_REG_IDX_ICOUNTLEVEL,
70 typedef uint32_t xtensa_reg_val_t;
72 #define XT_NUM_A_REGS 16
74 enum xtensa_reg_type {
75 XT_REG_GENERAL = 0, /* General-purpose register; part of the windowed register set */
76 XT_REG_USER = 1, /* User register, needs RUR to read */
77 XT_REG_SPECIAL = 2, /* Special register, needs RSR to read */
78 XT_REG_DEBUG = 3, /* Register used for the debug interface. Don't mess with this. */
79 XT_REG_RELGEN = 4, /* Relative general address. Points to the absolute addresses plus the window
81 XT_REG_FR = 5, /* Floating-point register */
82 XT_REG_TIE = 6, /* TIE (custom) register */
83 XT_REG_OTHER = 7, /* Other (typically legacy) register */
86 /* enum names must be one of the above types + _VAL or _MASK */
87 XT_REG_GENERAL_MASK = 0xFFC0,
88 XT_REG_GENERAL_VAL = 0x0100,
89 XT_REG_USER_MASK = 0xFF00,
90 XT_REG_USER_VAL = 0x0300,
91 XT_REG_SPECIAL_MASK = 0xFF00,
92 XT_REG_SPECIAL_VAL = 0x0200,
93 XT_REG_DEBUG_MASK = 0xFF00,
94 XT_REG_DEBUG_VAL = 0x0200,
95 XT_REG_RELGEN_MASK = 0xFFE0,
96 XT_REG_RELGEN_VAL = 0x0000,
97 XT_REG_FR_MASK = 0xFFF0,
98 XT_REG_FR_VAL = 0x0030,
99 XT_REG_TIE_MASK = 0xF000,
100 XT_REG_TIE_VAL = 0xF000, /* unused */
101 XT_REG_OTHER_MASK = 0xFFFF,
102 XT_REG_OTHER_VAL = 0xF000, /* unused */
104 XT_REG_INDEX_MASK = 0x00FF
107 enum xtensa_reg_flags {
108 XT_REGF_NOREAD = 0x01, /* Register is write-only */
109 XT_REGF_COPROC0 = 0x02, /* Can't be read if coproc0 isn't enabled */
113 struct xtensa_reg_desc {
116 unsigned int reg_num; /* ISA register num (meaning depends on register type) */
117 unsigned int dbreg_num; /* Debugger-visible register num (reg type encoded) */
118 enum xtensa_reg_type type;
119 enum xtensa_reg_flags flags;
122 #define _XT_MK_DBREGN(reg_num, reg_type) \
123 ((reg_type ## _VAL) | (reg_num))
125 #define _XT_MK_DBREGN_MASK(reg_num, reg_mask) \
126 ((reg_mask) | (reg_num))
128 #define XT_MK_REG_DESC(n, r, t, f) \
129 { .name = (n), .exist = false, .reg_num = (r), \
130 .dbreg_num = _XT_MK_DBREGN(r, t), .type = (t), \
133 extern struct xtensa_reg_desc xtensa_regs[XT_NUM_REGS];
135 #endif /* OPENOCD_TARGET_XTENSA_REGS_H */