1 /* User visible, per-frame registers, for GDB, the GNU debugger. 2 3 Copyright (C) 2002-2017 Free Software Foundation, Inc. 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 11 the Free Software Foundation; either version 3 of the License, or 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 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 #include "defs.h" 23 #include "user-regs.h" 24 #include "gdbtypes.h" 25 #include "frame.h" 26 #include "arch-utils.h" 27 #include "command.h" 28 #include "cli/cli-cmds.h" 29 30 /* A table of user registers. 31 32 User registers have regnum's that live above of the range [0 33 .. gdbarch_num_regs + gdbarch_num_pseudo_regs) 34 (which is controlled by the target). 35 The target should never see a user register's regnum value. 36 37 Always append, never delete. By doing this, the relative regnum 38 (offset from gdbarch_num_regs + gdbarch_num_pseudo_regs) 39 assigned to each user register never changes. */ 40 41 struct user_reg 42 { 43 const char *name; 44 struct value *(*xread) (struct frame_info * frame, const void *baton); 45 const void *baton; 46 struct user_reg *next; 47 }; 48 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 55 struct gdb_user_regs 56 { 57 struct user_reg *first; 58 struct user_reg **last; 59 }; 60 61 static void 62 append_user_reg (struct gdb_user_regs *regs, const char *name, 63 user_reg_read_ftype *xread, const void *baton, 64 struct user_reg *reg) 65 { 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->xread = xread; 72 reg->baton = baton; 73 reg->next = NULL; 74 (*regs->last) = reg; 75 regs->last = &(*regs->last)->next; 76 } 77 78 /* An array of the builtin user registers. */ 79 80 static struct gdb_user_regs builtin_user_regs = { 81 NULL, &builtin_user_regs.first 82 }; 83 84 void 85 user_reg_add_builtin (const char *name, user_reg_read_ftype *xread, 86 const void *baton) 87 { 88 append_user_reg (&builtin_user_regs, name, xread, baton, 89 XNEW (struct user_reg)); 90 } 91 92 /* Per-architecture user registers. Start with the builtin user 93 registers and then, again, append. */ 94 95 static struct gdbarch_data *user_regs_data; 96 97 static void * 98 user_regs_init (struct gdbarch *gdbarch) 99 { 100 struct user_reg *reg; 101 struct gdb_user_regs *regs 102 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct gdb_user_regs); 103 104 regs->last = ®s->first; 105 for (reg = builtin_user_regs.first; reg != NULL; reg = reg->next) 106 append_user_reg (regs, reg->name, reg->xread, reg->baton, 107 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg)); 108 return regs; 109 } 110 111 void 112 user_reg_add (struct gdbarch *gdbarch, const char *name, 113 user_reg_read_ftype *xread, const void *baton) 114 { 115 struct gdb_user_regs *regs 116 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data); 117 118 if (regs == NULL) 119 { 120 /* ULGH, called during architecture initialization. Patch 121 things up. */ 122 regs = (struct gdb_user_regs *) user_regs_init (gdbarch); 123 deprecated_set_gdbarch_data (gdbarch, user_regs_data, regs); 124 } 125 append_user_reg (regs, name, xread, baton, 126 GDBARCH_OBSTACK_ZALLOC (gdbarch, struct user_reg)); 127 } 128 129 int 130 user_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)); 143 144 for (i = 0; i < maxregs; i++) 145 { 146 const char *regname = gdbarch_register_name (gdbarch, i); 147 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 { 158 struct gdb_user_regs *regs 159 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data); 160 struct user_reg *reg; 161 int nr; 162 163 for (nr = 0, reg = regs->first; reg != NULL; reg = reg->next, nr++) 164 { 165 if ((len < 0 && strcmp (reg->name, name)) 166 || (len == strlen (reg->name) 167 && strncmp (reg->name, name, len) == 0)) 168 return gdbarch_num_regs (gdbarch) 169 + gdbarch_num_pseudo_regs (gdbarch) + nr; 170 } 171 } 172 173 return -1; 174 } 175 176 static struct user_reg * 177 usernum_to_user_reg (struct gdbarch *gdbarch, int usernum) 178 { 179 struct gdb_user_regs *regs 180 = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data); 181 struct user_reg *reg; 182 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 192 const char * 193 user_reg_map_regnum_to_name (struct gdbarch *gdbarch, int regnum) 194 { 195 int maxregs = (gdbarch_num_regs (gdbarch) 196 + gdbarch_num_pseudo_regs (gdbarch)); 197 198 if (regnum < 0) 199 return NULL; 200 else if (regnum < maxregs) 201 return gdbarch_register_name (gdbarch, regnum); 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 } 210 } 211 212 struct value * 213 value_of_user_reg (int regnum, struct frame_info *frame) 214 { 215 struct gdbarch *gdbarch = get_frame_arch (frame); 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); 219 220 gdb_assert (reg != NULL); 221 return reg->xread (frame, reg->baton); 222 } 223 224 static void 225 maintenance_print_user_registers (char *args, int from_tty) 226 { 227 struct gdbarch *gdbarch = get_current_arch (); 228 struct gdb_user_regs *regs; 229 struct user_reg *reg; 230 int regnum; 231 232 regs = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data); 233 regnum = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); 234 235 fprintf_unfiltered (gdb_stdout, " %-11s %3s\n", "Name", "Nr"); 236 for (reg = regs->first; reg != NULL; reg = reg->next, ++regnum) 237 fprintf_unfiltered (gdb_stdout, " %-11s %3d\n", reg->name, regnum); 238 } 239 240 extern initialize_file_ftype _initialize_user_regs; /* -Wmissing-prototypes */ 241 242 void 243 _initialize_user_regs (void) 244 { 245 user_regs_data = gdbarch_data_register_post_init (user_regs_init); 246 247 add_cmd ("user-registers", class_maintenance, 248 maintenance_print_user_registers, 249 _("List the names of the current user registers.\n"), 250 &maintenanceprintlist); 251 } 252