Fix the read/write flag for these registers on AArch64
[deliverable/binutils-gdb.git] / gdb / user-regs.c
CommitLineData
eb8bc282
AC
1/* User visible, per-frame registers, for GDB, the GNU debugger.
2
e2882c85 3 Copyright (C) 2002-2018 Free Software Foundation, Inc.
eb8bc282
AC
4
5 Contributed by Red Hat.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
eb8bc282
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
eb8bc282
AC
21
22#include "defs.h"
23#include "user-regs.h"
24#include "gdbtypes.h"
eb8bc282 25#include "frame.h"
f5b95c01
AA
26#include "arch-utils.h"
27#include "command.h"
28#include "cli/cli-cmds.h"
eb8bc282
AC
29
30/* A table of user registers.
31
32 User registers have regnum's that live above of the range [0
f57d151a
UW
33 .. gdbarch_num_regs + gdbarch_num_pseudo_regs)
34 (which is controlled by the target).
eb8bc282
AC
35 The target should never see a user register's regnum value.
36
37 Always append, never delete. By doing this, the relative regnum
f57d151a
UW
38 (offset from gdbarch_num_regs + gdbarch_num_pseudo_regs)
39 assigned to each user register never changes. */
eb8bc282
AC
40
41struct user_reg
42{
43 const char *name;
123dc839
DJ
44 struct value *(*read) (struct frame_info * frame, const void *baton);
45 const void *baton;
63022984 46 struct user_reg *next;
eb8bc282
AC
47};
48
8b9740d8
DJ
49/* This structure is named gdb_user_regs instead of user_regs to avoid
50 conflicts with any "struct user_regs" in system headers. For instance,
51 on ARM GNU/Linux native builds, nm-linux.h includes <signal.h> includes
52 <sys/ucontext.h> includes <sys/procfs.h> includes <sys/user.h>, which
53 declares "struct user_regs". */
54
55struct gdb_user_regs
eb8bc282 56{
63022984
AC
57 struct user_reg *first;
58 struct user_reg **last;
eb8bc282
AC
59};
60
61static void
8b9740d8 62append_user_reg (struct gdb_user_regs *regs, const char *name,
123dc839
DJ
63 user_reg_read_ftype *read, const void *baton,
64 struct user_reg *reg)
eb8bc282 65{
63022984
AC
66 /* The caller is responsible for allocating memory needed to store
67 the register. By doing this, the function can operate on a
68 register list stored in the common heap or a specific obstack. */
69 gdb_assert (reg != NULL);
70 reg->name = name;
71 reg->read = read;
123dc839 72 reg->baton = baton;
63022984
AC
73 reg->next = NULL;
74 (*regs->last) = reg;
75 regs->last = &(*regs->last)->next;
eb8bc282
AC
76}
77
78/* An array of the builtin user registers. */
79
3e43a32a
MS
80static struct gdb_user_regs builtin_user_regs = {
81 NULL, &builtin_user_regs.first
82};
eb8bc282
AC
83
84void
123dc839
DJ
85user_reg_add_builtin (const char *name, user_reg_read_ftype *read,
86 const void *baton)
eb8bc282 87{
123dc839 88 append_user_reg (&builtin_user_regs, name, read, baton,
70ba0933 89 XNEW (struct user_reg));
eb8bc282
AC
90}
91
92/* Per-architecture user registers. Start with the builtin user
93 registers and then, again, append. */
94
95static struct gdbarch_data *user_regs_data;
96
97static void *
98user_regs_init (struct gdbarch *gdbarch)
99{
63022984 100 struct user_reg *reg;
5d502164
MS
101 struct gdb_user_regs *regs
102 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs);
103
63022984
AC
104 regs->last = &regs->first;
105 for (reg = builtin_user_regs.first; reg != NULL; reg = reg->next)
123dc839 106 append_user_reg (regs, reg->name, reg->read, reg->baton,
63022984 107 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
eb8bc282
AC
108 return regs;
109}
110
eb8bc282
AC
111void
112user_reg_add (struct gdbarch *gdbarch, const char *name,
123dc839 113 user_reg_read_ftype *read, const void *baton)
eb8bc282 114{
19ba03f4
SM
115 struct gdb_user_regs *regs
116 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
5d502164 117
eb8bc282
AC
118 if (regs == NULL)
119 {
120 /* ULGH, called during architecture initialization. Patch
121 things up. */
19ba03f4 122 regs = (struct gdb_user_regs *) user_regs_init (gdbarch);
030f20e1 123 deprecated_set_gdbarch_data (gdbarch, user_regs_data, regs);
eb8bc282 124 }
123dc839 125 append_user_reg (regs, name, read, baton,
63022984 126 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg));
eb8bc282
AC
127}
128
129int
130user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name,
131 int len)
132{
133 /* Make life easy, set the len to something reasonable. */
134 if (len < 0)
135 len = strlen (name);
136
137 /* Search register name space first - always let an architecture
138 specific register override the user registers. */
139 {
140 int i;
141 int maxregs = (gdbarch_num_regs (gdbarch)
142 + gdbarch_num_pseudo_regs (gdbarch));
5d502164 143
eb8bc282
AC
144 for (i = 0; i < maxregs; i++)
145 {
146 const char *regname = gdbarch_register_name (gdbarch, i);
5d502164 147
eb8bc282
AC
148 if (regname != NULL && len == strlen (regname)
149 && strncmp (regname, name, len) == 0)
150 {
151 return i;
152 }
153 }
154 }
155
156 /* Search the user name space. */
157 {
19ba03f4
SM
158 struct gdb_user_regs *regs
159 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
63022984
AC
160 struct user_reg *reg;
161 int nr;
5d502164 162
63022984 163 for (nr = 0, reg = regs->first; reg != NULL; reg = reg->next, nr++)
eb8bc282 164 {
63022984
AC
165 if ((len < 0 && strcmp (reg->name, name))
166 || (len == strlen (reg->name)
167 && strncmp (reg->name, name, len) == 0))
40a6adc1
MD
168 return gdbarch_num_regs (gdbarch)
169 + gdbarch_num_pseudo_regs (gdbarch) + nr;
eb8bc282
AC
170 }
171 }
172
173 return -1;
174}
175
63022984
AC
176static struct user_reg *
177usernum_to_user_reg (struct gdbarch *gdbarch, int usernum)
178{
19ba03f4
SM
179 struct gdb_user_regs *regs
180 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
63022984 181 struct user_reg *reg;
5d502164 182
63022984
AC
183 for (reg = regs->first; reg != NULL; reg = reg->next)
184 {
185 if (usernum == 0)
186 return reg;
187 usernum--;
188 }
189 return NULL;
190}
191
eb8bc282
AC
192const char *
193user_reg_map_regnum_to_name (struct gdbarch *gdbarch, int regnum)
194{
195 int maxregs = (gdbarch_num_regs (gdbarch)
196 + gdbarch_num_pseudo_regs (gdbarch));
5d502164 197
eb8bc282
AC
198 if (regnum < 0)
199 return NULL;
63022984 200 else if (regnum < maxregs)
eb8bc282 201 return gdbarch_register_name (gdbarch, regnum);
63022984
AC
202 else
203 {
204 struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
205 if (reg == NULL)
206 return NULL;
207 else
208 return reg->name;
209 }
eb8bc282
AC
210}
211
212struct value *
213value_of_user_reg (int regnum, struct frame_info *frame)
214{
215 struct gdbarch *gdbarch = get_frame_arch (frame);
63022984
AC
216 int maxregs = (gdbarch_num_regs (gdbarch)
217 + gdbarch_num_pseudo_regs (gdbarch));
218 struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
5d502164 219
63022984 220 gdb_assert (reg != NULL);
123dc839 221 return reg->read (frame, reg->baton);
eb8bc282
AC
222}
223
f5b95c01 224static void
4d4589ef 225maintenance_print_user_registers (const char *args, int from_tty)
f5b95c01
AA
226{
227 struct gdbarch *gdbarch = get_current_arch ();
228 struct gdb_user_regs *regs;
229 struct user_reg *reg;
230 int regnum;
231
19ba03f4 232 regs = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
f5b95c01
AA
233 regnum = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
234
25dda427 235 fprintf_unfiltered (gdb_stdout, " %-11s %3s\n", "Name", "Nr");
f5b95c01 236 for (reg = regs->first; reg != NULL; reg = reg->next, ++regnum)
25dda427 237 fprintf_unfiltered (gdb_stdout, " %-11s %3d\n", reg->name, regnum);
f5b95c01
AA
238}
239
eb8bc282
AC
240void
241_initialize_user_regs (void)
242{
030f20e1 243 user_regs_data = gdbarch_data_register_post_init (user_regs_init);
f5b95c01
AA
244
245 add_cmd ("user-registers", class_maintenance,
246 maintenance_print_user_registers,
247 _("List the names of the current user registers.\n"),
248 &maintenanceprintlist);
eb8bc282 249}
This page took 1.567072 seconds and 4 git commands to generate.