xref: /dragonfly/contrib/gdb-7/gdb/regcache.c (revision 783d47c4)
1 /* Cache and manage the values of registers for GDB, the GNU debugger.
2 
3    Copyright (C) 1986, 1987, 1989, 1991, 1994, 1995, 1996, 1998, 2000, 2001,
4    2002, 2004, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
5 
6    This file is part of GDB.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20 
21 #include "defs.h"
22 #include "inferior.h"
23 #include "target.h"
24 #include "gdbarch.h"
25 #include "gdbcmd.h"
26 #include "regcache.h"
27 #include "reggroups.h"
28 #include "gdb_assert.h"
29 #include "gdb_string.h"
30 #include "gdbcmd.h"		/* For maintenanceprintlist.  */
31 #include "observer.h"
32 #include "exceptions.h"
33 
34 /*
35  * DATA STRUCTURE
36  *
37  * Here is the actual register cache.
38  */
39 
40 /* Per-architecture object describing the layout of a register cache.
41    Computed once when the architecture is created.  */
42 
43 struct gdbarch_data *regcache_descr_handle;
44 
45 struct regcache_descr
46 {
47   /* The architecture this descriptor belongs to.  */
48   struct gdbarch *gdbarch;
49 
50   /* The raw register cache.  Each raw (or hard) register is supplied
51      by the target interface.  The raw cache should not contain
52      redundant information - if the PC is constructed from two
53      registers then those registers and not the PC lives in the raw
54      cache.  */
55   int nr_raw_registers;
56   long sizeof_raw_registers;
57   long sizeof_raw_register_status;
58 
59   /* The cooked register space.  Each cooked register in the range
60      [0..NR_RAW_REGISTERS) is direct-mapped onto the corresponding raw
61      register.  The remaining [NR_RAW_REGISTERS
62      .. NR_COOKED_REGISTERS) (a.k.a. pseudo registers) are mapped onto
63      both raw registers and memory by the architecture methods
64      gdbarch_pseudo_register_read and gdbarch_pseudo_register_write.  */
65   int nr_cooked_registers;
66   long sizeof_cooked_registers;
67   long sizeof_cooked_register_status;
68 
69   /* Offset and size (in 8 bit bytes), of reach register in the
70      register cache.  All registers (including those in the range
71      [NR_RAW_REGISTERS .. NR_COOKED_REGISTERS) are given an
72      offset.  */
73   long *register_offset;
74   long *sizeof_register;
75 
76   /* Cached table containing the type of each register.  */
77   struct type **register_type;
78 };
79 
80 static void *
81 init_regcache_descr (struct gdbarch *gdbarch)
82 {
83   int i;
84   struct regcache_descr *descr;
85   gdb_assert (gdbarch != NULL);
86 
87   /* Create an initial, zero filled, table.  */
88   descr = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct regcache_descr);
89   descr->gdbarch = gdbarch;
90 
91   /* Total size of the register space.  The raw registers are mapped
92      directly onto the raw register cache while the pseudo's are
93      either mapped onto raw-registers or memory.  */
94   descr->nr_cooked_registers = gdbarch_num_regs (gdbarch)
95 			       + gdbarch_num_pseudo_regs (gdbarch);
96   descr->sizeof_cooked_register_status
97     = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
98 
99   /* Fill in a table of register types.  */
100   descr->register_type
101     = GDBARCH_OBSTACK_CALLOC (gdbarch, descr->nr_cooked_registers,
102 			      struct type *);
103   for (i = 0; i < descr->nr_cooked_registers; i++)
104     descr->register_type[i] = gdbarch_register_type (gdbarch, i);
105 
106   /* Construct a strictly RAW register cache.  Don't allow pseudo's
107      into the register cache.  */
108   descr->nr_raw_registers = gdbarch_num_regs (gdbarch);
109   descr->sizeof_raw_register_status = gdbarch_num_regs (gdbarch);
110 
111   /* Lay out the register cache.
112 
113      NOTE: cagney/2002-05-22: Only register_type() is used when
114      constructing the register cache.  It is assumed that the
115      register's raw size, virtual size and type length are all the
116      same.  */
117 
118   {
119     long offset = 0;
120 
121     descr->sizeof_register
122       = GDBARCH_OBSTACK_CALLOC (gdbarch, descr->nr_cooked_registers, long);
123     descr->register_offset
124       = GDBARCH_OBSTACK_CALLOC (gdbarch, descr->nr_cooked_registers, long);
125     for (i = 0; i < descr->nr_raw_registers; i++)
126       {
127 	descr->sizeof_register[i] = TYPE_LENGTH (descr->register_type[i]);
128 	descr->register_offset[i] = offset;
129 	offset += descr->sizeof_register[i];
130 	gdb_assert (MAX_REGISTER_SIZE >= descr->sizeof_register[i]);
131       }
132     /* Set the real size of the raw register cache buffer.  */
133     descr->sizeof_raw_registers = offset;
134 
135     for (; i < descr->nr_cooked_registers; i++)
136       {
137 	descr->sizeof_register[i] = TYPE_LENGTH (descr->register_type[i]);
138 	descr->register_offset[i] = offset;
139 	offset += descr->sizeof_register[i];
140 	gdb_assert (MAX_REGISTER_SIZE >= descr->sizeof_register[i]);
141       }
142     /* Set the real size of the readonly register cache buffer.  */
143     descr->sizeof_cooked_registers = offset;
144   }
145 
146   return descr;
147 }
148 
149 static struct regcache_descr *
150 regcache_descr (struct gdbarch *gdbarch)
151 {
152   return gdbarch_data (gdbarch, regcache_descr_handle);
153 }
154 
155 /* Utility functions returning useful register attributes stored in
156    the regcache descr.  */
157 
158 struct type *
159 register_type (struct gdbarch *gdbarch, int regnum)
160 {
161   struct regcache_descr *descr = regcache_descr (gdbarch);
162 
163   gdb_assert (regnum >= 0 && regnum < descr->nr_cooked_registers);
164   return descr->register_type[regnum];
165 }
166 
167 /* Utility functions returning useful register attributes stored in
168    the regcache descr.  */
169 
170 int
171 register_size (struct gdbarch *gdbarch, int regnum)
172 {
173   struct regcache_descr *descr = regcache_descr (gdbarch);
174   int size;
175 
176   gdb_assert (regnum >= 0
177 	      && regnum < (gdbarch_num_regs (gdbarch)
178 			   + gdbarch_num_pseudo_regs (gdbarch)));
179   size = descr->sizeof_register[regnum];
180   return size;
181 }
182 
183 /* The register cache for storing raw register values.  */
184 
185 struct regcache
186 {
187   struct regcache_descr *descr;
188 
189   /* The address space of this register cache (for registers where it
190      makes sense, like PC or SP).  */
191   struct address_space *aspace;
192 
193   /* The register buffers.  A read-only register cache can hold the
194      full [0 .. gdbarch_num_regs + gdbarch_num_pseudo_regs) while a read/write
195      register cache can only hold [0 .. gdbarch_num_regs).  */
196   gdb_byte *registers;
197   /* Register cache status.  */
198   signed char *register_status;
199   /* Is this a read-only cache?  A read-only cache is used for saving
200      the target's register state (e.g, across an inferior function
201      call or just before forcing a function return).  A read-only
202      cache can only be updated via the methods regcache_dup() and
203      regcache_cpy().  The actual contents are determined by the
204      reggroup_save and reggroup_restore methods.  */
205   int readonly_p;
206   /* If this is a read-write cache, which thread's registers is
207      it connected to?  */
208   ptid_t ptid;
209 };
210 
211 static struct regcache *
212 regcache_xmalloc_1 (struct gdbarch *gdbarch, struct address_space *aspace,
213 		    int readonly_p)
214 {
215   struct regcache_descr *descr;
216   struct regcache *regcache;
217 
218   gdb_assert (gdbarch != NULL);
219   descr = regcache_descr (gdbarch);
220   regcache = XMALLOC (struct regcache);
221   regcache->descr = descr;
222   regcache->readonly_p = readonly_p;
223   if (readonly_p)
224     {
225       regcache->registers
226 	= XCALLOC (descr->sizeof_cooked_registers, gdb_byte);
227       regcache->register_status
228 	= XCALLOC (descr->sizeof_cooked_register_status, gdb_byte);
229     }
230   else
231     {
232       regcache->registers
233 	= XCALLOC (descr->sizeof_raw_registers, gdb_byte);
234       regcache->register_status
235 	= XCALLOC (descr->sizeof_raw_register_status, gdb_byte);
236     }
237   regcache->aspace = aspace;
238   regcache->ptid = minus_one_ptid;
239   return regcache;
240 }
241 
242 struct regcache *
243 regcache_xmalloc (struct gdbarch *gdbarch, struct address_space *aspace)
244 {
245   return regcache_xmalloc_1 (gdbarch, aspace, 1);
246 }
247 
248 void
249 regcache_xfree (struct regcache *regcache)
250 {
251   if (regcache == NULL)
252     return;
253   xfree (regcache->registers);
254   xfree (regcache->register_status);
255   xfree (regcache);
256 }
257 
258 static void
259 do_regcache_xfree (void *data)
260 {
261   regcache_xfree (data);
262 }
263 
264 struct cleanup *
265 make_cleanup_regcache_xfree (struct regcache *regcache)
266 {
267   return make_cleanup (do_regcache_xfree, regcache);
268 }
269 
270 /* Return REGCACHE's architecture.  */
271 
272 struct gdbarch *
273 get_regcache_arch (const struct regcache *regcache)
274 {
275   return regcache->descr->gdbarch;
276 }
277 
278 struct address_space *
279 get_regcache_aspace (const struct regcache *regcache)
280 {
281   return regcache->aspace;
282 }
283 
284 /* Return  a pointer to register REGNUM's buffer cache.  */
285 
286 static gdb_byte *
287 register_buffer (const struct regcache *regcache, int regnum)
288 {
289   return regcache->registers + regcache->descr->register_offset[regnum];
290 }
291 
292 void
293 regcache_save (struct regcache *dst, regcache_cooked_read_ftype *cooked_read,
294 	       void *src)
295 {
296   struct gdbarch *gdbarch = dst->descr->gdbarch;
297   gdb_byte buf[MAX_REGISTER_SIZE];
298   int regnum;
299 
300   /* The DST should be `read-only', if it wasn't then the save would
301      end up trying to write the register values back out to the
302      target.  */
303   gdb_assert (dst->readonly_p);
304   /* Clear the dest.  */
305   memset (dst->registers, 0, dst->descr->sizeof_cooked_registers);
306   memset (dst->register_status, 0,
307 	  dst->descr->sizeof_cooked_register_status);
308   /* Copy over any registers (identified by their membership in the
309      save_reggroup) and mark them as valid.  The full [0 .. gdbarch_num_regs +
310      gdbarch_num_pseudo_regs) range is checked since some architectures need
311      to save/restore `cooked' registers that live in memory.  */
312   for (regnum = 0; regnum < dst->descr->nr_cooked_registers; regnum++)
313     {
314       if (gdbarch_register_reggroup_p (gdbarch, regnum, save_reggroup))
315 	{
316 	  enum register_status status = cooked_read (src, regnum, buf);
317 
318 	  if (status == REG_VALID)
319 	    memcpy (register_buffer (dst, regnum), buf,
320 		    register_size (gdbarch, regnum));
321 	  else
322 	    {
323 	      gdb_assert (status != REG_UNKNOWN);
324 
325 	      memset (register_buffer (dst, regnum), 0,
326 		      register_size (gdbarch, regnum));
327 	    }
328 	  dst->register_status[regnum] = status;
329 	}
330     }
331 }
332 
333 void
334 regcache_restore (struct regcache *dst,
335 		  regcache_cooked_read_ftype *cooked_read,
336 		  void *cooked_read_context)
337 {
338   struct gdbarch *gdbarch = dst->descr->gdbarch;
339   gdb_byte buf[MAX_REGISTER_SIZE];
340   int regnum;
341 
342   /* The dst had better not be read-only.  If it is, the `restore'
343      doesn't make much sense.  */
344   gdb_assert (!dst->readonly_p);
345   /* Copy over any registers, being careful to only restore those that
346      were both saved and need to be restored.  The full [0 .. gdbarch_num_regs
347      + gdbarch_num_pseudo_regs) range is checked since some architectures need
348      to save/restore `cooked' registers that live in memory.  */
349   for (regnum = 0; regnum < dst->descr->nr_cooked_registers; regnum++)
350     {
351       if (gdbarch_register_reggroup_p (gdbarch, regnum, restore_reggroup))
352 	{
353 	  int valid = cooked_read (cooked_read_context, regnum, buf);
354 
355 	  if (valid)
356 	    regcache_cooked_write (dst, regnum, buf);
357 	}
358     }
359 }
360 
361 static enum register_status
362 do_cooked_read (void *src, int regnum, gdb_byte *buf)
363 {
364   struct regcache *regcache = src;
365 
366   return regcache_cooked_read (regcache, regnum, buf);
367 }
368 
369 void
370 regcache_cpy (struct regcache *dst, struct regcache *src)
371 {
372   gdb_assert (src != NULL && dst != NULL);
373   gdb_assert (src->descr->gdbarch == dst->descr->gdbarch);
374   gdb_assert (src != dst);
375   gdb_assert (src->readonly_p || dst->readonly_p);
376 
377   if (!src->readonly_p)
378     regcache_save (dst, do_cooked_read, src);
379   else if (!dst->readonly_p)
380     regcache_restore (dst, do_cooked_read, src);
381   else
382     regcache_cpy_no_passthrough (dst, src);
383 }
384 
385 void
386 regcache_cpy_no_passthrough (struct regcache *dst, struct regcache *src)
387 {
388   gdb_assert (src != NULL && dst != NULL);
389   gdb_assert (src->descr->gdbarch == dst->descr->gdbarch);
390   /* NOTE: cagney/2002-05-17: Don't let the caller do a no-passthrough
391      move of data into a thread's regcache.  Doing this would be silly
392      - it would mean that regcache->register_status would be
393      completely invalid.  */
394   gdb_assert (dst->readonly_p && src->readonly_p);
395 
396   memcpy (dst->registers, src->registers,
397 	  dst->descr->sizeof_cooked_registers);
398   memcpy (dst->register_status, src->register_status,
399 	  dst->descr->sizeof_cooked_register_status);
400 }
401 
402 struct regcache *
403 regcache_dup (struct regcache *src)
404 {
405   struct regcache *newbuf;
406 
407   newbuf = regcache_xmalloc (src->descr->gdbarch, get_regcache_aspace (src));
408   regcache_cpy (newbuf, src);
409   return newbuf;
410 }
411 
412 int
413 regcache_register_status (const struct regcache *regcache, int regnum)
414 {
415   gdb_assert (regcache != NULL);
416   gdb_assert (regnum >= 0);
417   if (regcache->readonly_p)
418     gdb_assert (regnum < regcache->descr->nr_cooked_registers);
419   else
420     gdb_assert (regnum < regcache->descr->nr_raw_registers);
421 
422   return regcache->register_status[regnum];
423 }
424 
425 void
426 regcache_invalidate (struct regcache *regcache, int regnum)
427 {
428   gdb_assert (regcache != NULL);
429   gdb_assert (regnum >= 0);
430   gdb_assert (!regcache->readonly_p);
431   gdb_assert (regnum < regcache->descr->nr_raw_registers);
432   regcache->register_status[regnum] = REG_UNKNOWN;
433 }
434 
435 
436 /* Global structure containing the current regcache.  */
437 
438 /* NOTE: this is a write-through cache.  There is no "dirty" bit for
439    recording if the register values have been changed (eg. by the
440    user).  Therefore all registers must be written back to the
441    target when appropriate.  */
442 
443 struct regcache_list
444 {
445   struct regcache *regcache;
446   struct regcache_list *next;
447 };
448 
449 static struct regcache_list *current_regcache;
450 
451 struct regcache *
452 get_thread_arch_regcache (ptid_t ptid, struct gdbarch *gdbarch)
453 {
454   struct regcache_list *list;
455   struct regcache *new_regcache;
456   struct address_space *aspace;
457 
458   for (list = current_regcache; list; list = list->next)
459     if (ptid_equal (list->regcache->ptid, ptid)
460 	&& get_regcache_arch (list->regcache) == gdbarch)
461       return list->regcache;
462 
463   /* For the benefit of "maint print registers" & co when debugging an
464      executable, allow dumping the regcache even when there is no
465      thread selected (target_thread_address_space internal-errors if
466      no address space is found).  Note that normal user commands will
467      fail higher up on the call stack due to no
468      target_has_registers.  */
469   aspace = (ptid_equal (null_ptid, ptid)
470 	    ? NULL
471 	    : target_thread_address_space (ptid));
472 
473   new_regcache = regcache_xmalloc_1 (gdbarch, aspace, 0);
474   new_regcache->ptid = ptid;
475 
476   list = xmalloc (sizeof (struct regcache_list));
477   list->regcache = new_regcache;
478   list->next = current_regcache;
479   current_regcache = list;
480 
481   return new_regcache;
482 }
483 
484 static ptid_t current_thread_ptid;
485 static struct gdbarch *current_thread_arch;
486 
487 struct regcache *
488 get_thread_regcache (ptid_t ptid)
489 {
490   if (!current_thread_arch || !ptid_equal (current_thread_ptid, ptid))
491     {
492       current_thread_ptid = ptid;
493       current_thread_arch = target_thread_architecture (ptid);
494     }
495 
496   return get_thread_arch_regcache (ptid, current_thread_arch);
497 }
498 
499 struct regcache *
500 get_current_regcache (void)
501 {
502   return get_thread_regcache (inferior_ptid);
503 }
504 
505 
506 /* Observer for the target_changed event.  */
507 
508 static void
509 regcache_observer_target_changed (struct target_ops *target)
510 {
511   registers_changed ();
512 }
513 
514 /* Update global variables old ptids to hold NEW_PTID if they were
515    holding OLD_PTID.  */
516 static void
517 regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid)
518 {
519   struct regcache_list *list;
520 
521   for (list = current_regcache; list; list = list->next)
522     if (ptid_equal (list->regcache->ptid, old_ptid))
523       list->regcache->ptid = new_ptid;
524 }
525 
526 /* Low level examining and depositing of registers.
527 
528    The caller is responsible for making sure that the inferior is
529    stopped before calling the fetching routines, or it will get
530    garbage.  (a change from GDB version 3, in which the caller got the
531    value from the last stop).  */
532 
533 /* REGISTERS_CHANGED ()
534 
535    Indicate that registers may have changed, so invalidate the cache.  */
536 
537 void
538 registers_changed_ptid (ptid_t ptid)
539 {
540   struct regcache_list *list, **list_link;
541   int wildcard = ptid_equal (ptid, minus_one_ptid);
542 
543   list = current_regcache;
544   list_link = &current_regcache;
545   while (list)
546     {
547       if (ptid_match (list->regcache->ptid, ptid))
548 	{
549 	  struct regcache_list *dead = list;
550 
551 	  *list_link = list->next;
552 	  regcache_xfree (list->regcache);
553 	  list = *list_link;
554 	  xfree (dead);
555 	  continue;
556 	}
557 
558       list_link = &list->next;
559       list = *list_link;
560     }
561 
562   if (wildcard || ptid_equal (ptid, current_thread_ptid))
563     {
564       current_thread_ptid = null_ptid;
565       current_thread_arch = NULL;
566     }
567 
568   if (wildcard || ptid_equal (ptid, inferior_ptid))
569     {
570       /* We just deleted the regcache of the current thread.  Need to
571 	 forget about any frames we have cached, too.  */
572       reinit_frame_cache ();
573     }
574 }
575 
576 void
577 registers_changed (void)
578 {
579   registers_changed_ptid (minus_one_ptid);
580 
581   /* Force cleanup of any alloca areas if using C alloca instead of
582      a builtin alloca.  This particular call is used to clean up
583      areas allocated by low level target code which may build up
584      during lengthy interactions between gdb and the target before
585      gdb gives control to the user (ie watchpoints).  */
586   alloca (0);
587 }
588 
589 enum register_status
590 regcache_raw_read (struct regcache *regcache, int regnum, gdb_byte *buf)
591 {
592   gdb_assert (regcache != NULL && buf != NULL);
593   gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
594   /* Make certain that the register cache is up-to-date with respect
595      to the current thread.  This switching shouldn't be necessary
596      only there is still only one target side register cache.  Sigh!
597      On the bright side, at least there is a regcache object.  */
598   if (!regcache->readonly_p
599       && regcache_register_status (regcache, regnum) == REG_UNKNOWN)
600     {
601       struct cleanup *old_chain = save_inferior_ptid ();
602 
603       inferior_ptid = regcache->ptid;
604       target_fetch_registers (regcache, regnum);
605       do_cleanups (old_chain);
606 
607       /* A number of targets can't access the whole set of raw
608 	 registers (because the debug API provides no means to get at
609 	 them).  */
610       if (regcache->register_status[regnum] == REG_UNKNOWN)
611 	regcache->register_status[regnum] = REG_UNAVAILABLE;
612     }
613 
614   if (regcache->register_status[regnum] != REG_VALID)
615     memset (buf, 0, regcache->descr->sizeof_register[regnum]);
616   else
617     memcpy (buf, register_buffer (regcache, regnum),
618 	    regcache->descr->sizeof_register[regnum]);
619 
620   return regcache->register_status[regnum];
621 }
622 
623 enum register_status
624 regcache_raw_read_signed (struct regcache *regcache, int regnum, LONGEST *val)
625 {
626   gdb_byte *buf;
627   enum register_status status;
628 
629   gdb_assert (regcache != NULL);
630   gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
631   buf = alloca (regcache->descr->sizeof_register[regnum]);
632   status = regcache_raw_read (regcache, regnum, buf);
633   if (status == REG_VALID)
634     *val = extract_signed_integer
635       (buf, regcache->descr->sizeof_register[regnum],
636        gdbarch_byte_order (regcache->descr->gdbarch));
637   else
638     *val = 0;
639   return status;
640 }
641 
642 enum register_status
643 regcache_raw_read_unsigned (struct regcache *regcache, int regnum,
644 			    ULONGEST *val)
645 {
646   gdb_byte *buf;
647   enum register_status status;
648 
649   gdb_assert (regcache != NULL);
650   gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
651   buf = alloca (regcache->descr->sizeof_register[regnum]);
652   status = regcache_raw_read (regcache, regnum, buf);
653   if (status == REG_VALID)
654     *val = extract_unsigned_integer
655       (buf, regcache->descr->sizeof_register[regnum],
656        gdbarch_byte_order (regcache->descr->gdbarch));
657   else
658     *val = 0;
659   return status;
660 }
661 
662 void
663 regcache_raw_write_signed (struct regcache *regcache, int regnum, LONGEST val)
664 {
665   void *buf;
666 
667   gdb_assert (regcache != NULL);
668   gdb_assert (regnum >=0 && regnum < regcache->descr->nr_raw_registers);
669   buf = alloca (regcache->descr->sizeof_register[regnum]);
670   store_signed_integer (buf, regcache->descr->sizeof_register[regnum],
671 			gdbarch_byte_order (regcache->descr->gdbarch), val);
672   regcache_raw_write (regcache, regnum, buf);
673 }
674 
675 void
676 regcache_raw_write_unsigned (struct regcache *regcache, int regnum,
677 			     ULONGEST val)
678 {
679   void *buf;
680 
681   gdb_assert (regcache != NULL);
682   gdb_assert (regnum >=0 && regnum < regcache->descr->nr_raw_registers);
683   buf = alloca (regcache->descr->sizeof_register[regnum]);
684   store_unsigned_integer (buf, regcache->descr->sizeof_register[regnum],
685 			  gdbarch_byte_order (regcache->descr->gdbarch), val);
686   regcache_raw_write (regcache, regnum, buf);
687 }
688 
689 enum register_status
690 regcache_cooked_read (struct regcache *regcache, int regnum, gdb_byte *buf)
691 {
692   gdb_assert (regnum >= 0);
693   gdb_assert (regnum < regcache->descr->nr_cooked_registers);
694   if (regnum < regcache->descr->nr_raw_registers)
695     return regcache_raw_read (regcache, regnum, buf);
696   else if (regcache->readonly_p
697 	   && regcache->register_status[regnum] != REG_UNKNOWN)
698     {
699       /* Read-only register cache, perhaps the cooked value was
700 	 cached?  */
701       struct gdbarch *gdbarch = regcache->descr->gdbarch;
702 
703       if (regcache->register_status[regnum] == REG_VALID)
704 	memcpy (buf, register_buffer (regcache, regnum),
705 		regcache->descr->sizeof_register[regnum]);
706       else
707 	memset (buf, 0, regcache->descr->sizeof_register[regnum]);
708 
709       return regcache->register_status[regnum];
710     }
711   else
712     return gdbarch_pseudo_register_read (regcache->descr->gdbarch, regcache,
713 					 regnum, buf);
714 }
715 
716 enum register_status
717 regcache_cooked_read_signed (struct regcache *regcache, int regnum,
718 			     LONGEST *val)
719 {
720   enum register_status status;
721   gdb_byte *buf;
722 
723   gdb_assert (regcache != NULL);
724   gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_cooked_registers);
725   buf = alloca (regcache->descr->sizeof_register[regnum]);
726   status = regcache_cooked_read (regcache, regnum, buf);
727   if (status == REG_VALID)
728     *val = extract_signed_integer
729       (buf, regcache->descr->sizeof_register[regnum],
730        gdbarch_byte_order (regcache->descr->gdbarch));
731   else
732     *val = 0;
733   return status;
734 }
735 
736 enum register_status
737 regcache_cooked_read_unsigned (struct regcache *regcache, int regnum,
738 			       ULONGEST *val)
739 {
740   enum register_status status;
741   gdb_byte *buf;
742 
743   gdb_assert (regcache != NULL);
744   gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_cooked_registers);
745   buf = alloca (regcache->descr->sizeof_register[regnum]);
746   status = regcache_cooked_read (regcache, regnum, buf);
747   if (status == REG_VALID)
748     *val = extract_unsigned_integer
749       (buf, regcache->descr->sizeof_register[regnum],
750        gdbarch_byte_order (regcache->descr->gdbarch));
751   else
752     *val = 0;
753   return status;
754 }
755 
756 void
757 regcache_cooked_write_signed (struct regcache *regcache, int regnum,
758 			      LONGEST val)
759 {
760   void *buf;
761 
762   gdb_assert (regcache != NULL);
763   gdb_assert (regnum >=0 && regnum < regcache->descr->nr_cooked_registers);
764   buf = alloca (regcache->descr->sizeof_register[regnum]);
765   store_signed_integer (buf, regcache->descr->sizeof_register[regnum],
766 			gdbarch_byte_order (regcache->descr->gdbarch), val);
767   regcache_cooked_write (regcache, regnum, buf);
768 }
769 
770 void
771 regcache_cooked_write_unsigned (struct regcache *regcache, int regnum,
772 				ULONGEST val)
773 {
774   void *buf;
775 
776   gdb_assert (regcache != NULL);
777   gdb_assert (regnum >=0 && regnum < regcache->descr->nr_cooked_registers);
778   buf = alloca (regcache->descr->sizeof_register[regnum]);
779   store_unsigned_integer (buf, regcache->descr->sizeof_register[regnum],
780 			  gdbarch_byte_order (regcache->descr->gdbarch), val);
781   regcache_cooked_write (regcache, regnum, buf);
782 }
783 
784 void
785 regcache_raw_write (struct regcache *regcache, int regnum,
786 		    const gdb_byte *buf)
787 {
788   struct cleanup *old_chain;
789 
790   gdb_assert (regcache != NULL && buf != NULL);
791   gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
792   gdb_assert (!regcache->readonly_p);
793 
794   /* On the sparc, writing %g0 is a no-op, so we don't even want to
795      change the registers array if something writes to this register.  */
796   if (gdbarch_cannot_store_register (get_regcache_arch (regcache), regnum))
797     return;
798 
799   /* If we have a valid copy of the register, and new value == old
800      value, then don't bother doing the actual store.  */
801   if (regcache_register_status (regcache, regnum) == REG_VALID
802       && (memcmp (register_buffer (regcache, regnum), buf,
803 		  regcache->descr->sizeof_register[regnum]) == 0))
804     return;
805 
806   old_chain = save_inferior_ptid ();
807   inferior_ptid = regcache->ptid;
808 
809   target_prepare_to_store (regcache);
810   memcpy (register_buffer (regcache, regnum), buf,
811 	  regcache->descr->sizeof_register[regnum]);
812   regcache->register_status[regnum] = REG_VALID;
813   target_store_registers (regcache, regnum);
814 
815   do_cleanups (old_chain);
816 }
817 
818 void
819 regcache_cooked_write (struct regcache *regcache, int regnum,
820 		       const gdb_byte *buf)
821 {
822   gdb_assert (regnum >= 0);
823   gdb_assert (regnum < regcache->descr->nr_cooked_registers);
824   if (regnum < regcache->descr->nr_raw_registers)
825     regcache_raw_write (regcache, regnum, buf);
826   else
827     gdbarch_pseudo_register_write (regcache->descr->gdbarch, regcache,
828 				   regnum, buf);
829 }
830 
831 /* Perform a partial register transfer using a read, modify, write
832    operation.  */
833 
834 typedef void (regcache_read_ftype) (struct regcache *regcache, int regnum,
835 				    void *buf);
836 typedef void (regcache_write_ftype) (struct regcache *regcache, int regnum,
837 				     const void *buf);
838 
839 static enum register_status
840 regcache_xfer_part (struct regcache *regcache, int regnum,
841 		    int offset, int len, void *in, const void *out,
842 		    enum register_status (*read) (struct regcache *regcache,
843 						  int regnum,
844 						  gdb_byte *buf),
845 		    void (*write) (struct regcache *regcache, int regnum,
846 				   const gdb_byte *buf))
847 {
848   struct regcache_descr *descr = regcache->descr;
849   gdb_byte reg[MAX_REGISTER_SIZE];
850 
851   gdb_assert (offset >= 0 && offset <= descr->sizeof_register[regnum]);
852   gdb_assert (len >= 0 && offset + len <= descr->sizeof_register[regnum]);
853   /* Something to do?  */
854   if (offset + len == 0)
855     return REG_VALID;
856   /* Read (when needed) ...  */
857   if (in != NULL
858       || offset > 0
859       || offset + len < descr->sizeof_register[regnum])
860     {
861       enum register_status status;
862 
863       gdb_assert (read != NULL);
864       status = read (regcache, regnum, reg);
865       if (status != REG_VALID)
866 	return status;
867     }
868   /* ... modify ...  */
869   if (in != NULL)
870     memcpy (in, reg + offset, len);
871   if (out != NULL)
872     memcpy (reg + offset, out, len);
873   /* ... write (when needed).  */
874   if (out != NULL)
875     {
876       gdb_assert (write != NULL);
877       write (regcache, regnum, reg);
878     }
879 
880   return REG_VALID;
881 }
882 
883 enum register_status
884 regcache_raw_read_part (struct regcache *regcache, int regnum,
885 			int offset, int len, gdb_byte *buf)
886 {
887   struct regcache_descr *descr = regcache->descr;
888 
889   gdb_assert (regnum >= 0 && regnum < descr->nr_raw_registers);
890   return regcache_xfer_part (regcache, regnum, offset, len, buf, NULL,
891 			     regcache_raw_read, regcache_raw_write);
892 }
893 
894 void
895 regcache_raw_write_part (struct regcache *regcache, int regnum,
896 			 int offset, int len, const gdb_byte *buf)
897 {
898   struct regcache_descr *descr = regcache->descr;
899 
900   gdb_assert (regnum >= 0 && regnum < descr->nr_raw_registers);
901   regcache_xfer_part (regcache, regnum, offset, len, NULL, buf,
902 		      regcache_raw_read, regcache_raw_write);
903 }
904 
905 enum register_status
906 regcache_cooked_read_part (struct regcache *regcache, int regnum,
907 			   int offset, int len, gdb_byte *buf)
908 {
909   struct regcache_descr *descr = regcache->descr;
910 
911   gdb_assert (regnum >= 0 && regnum < descr->nr_cooked_registers);
912   return regcache_xfer_part (regcache, regnum, offset, len, buf, NULL,
913 			     regcache_cooked_read, regcache_cooked_write);
914 }
915 
916 void
917 regcache_cooked_write_part (struct regcache *regcache, int regnum,
918 			    int offset, int len, const gdb_byte *buf)
919 {
920   struct regcache_descr *descr = regcache->descr;
921 
922   gdb_assert (regnum >= 0 && regnum < descr->nr_cooked_registers);
923   regcache_xfer_part (regcache, regnum, offset, len, NULL, buf,
924 		      regcache_cooked_read, regcache_cooked_write);
925 }
926 
927 /* Supply register REGNUM, whose contents are stored in BUF, to REGCACHE.  */
928 
929 void
930 regcache_raw_supply (struct regcache *regcache, int regnum, const void *buf)
931 {
932   void *regbuf;
933   size_t size;
934 
935   gdb_assert (regcache != NULL);
936   gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
937   gdb_assert (!regcache->readonly_p);
938 
939   regbuf = register_buffer (regcache, regnum);
940   size = regcache->descr->sizeof_register[regnum];
941 
942   if (buf)
943     {
944       memcpy (regbuf, buf, size);
945       regcache->register_status[regnum] = REG_VALID;
946     }
947   else
948     {
949       /* This memset not strictly necessary, but better than garbage
950 	 in case the register value manages to escape somewhere (due
951 	 to a bug, no less).  */
952       memset (regbuf, 0, size);
953       regcache->register_status[regnum] = REG_UNAVAILABLE;
954     }
955 }
956 
957 /* Collect register REGNUM from REGCACHE and store its contents in BUF.  */
958 
959 void
960 regcache_raw_collect (const struct regcache *regcache, int regnum, void *buf)
961 {
962   const void *regbuf;
963   size_t size;
964 
965   gdb_assert (regcache != NULL && buf != NULL);
966   gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers);
967 
968   regbuf = register_buffer (regcache, regnum);
969   size = regcache->descr->sizeof_register[regnum];
970   memcpy (buf, regbuf, size);
971 }
972 
973 
974 /* Special handling for register PC.  */
975 
976 CORE_ADDR
977 regcache_read_pc (struct regcache *regcache)
978 {
979   struct gdbarch *gdbarch = get_regcache_arch (regcache);
980 
981   CORE_ADDR pc_val;
982 
983   if (gdbarch_read_pc_p (gdbarch))
984     pc_val = gdbarch_read_pc (gdbarch, regcache);
985   /* Else use per-frame method on get_current_frame.  */
986   else if (gdbarch_pc_regnum (gdbarch) >= 0)
987     {
988       ULONGEST raw_val;
989 
990       if (regcache_cooked_read_unsigned (regcache,
991 					 gdbarch_pc_regnum (gdbarch),
992 					 &raw_val) == REG_UNAVAILABLE)
993 	throw_error (NOT_AVAILABLE_ERROR, _("PC register is not available"));
994 
995       pc_val = gdbarch_addr_bits_remove (gdbarch, raw_val);
996     }
997   else
998     internal_error (__FILE__, __LINE__,
999 		    _("regcache_read_pc: Unable to find PC"));
1000   return pc_val;
1001 }
1002 
1003 void
1004 regcache_write_pc (struct regcache *regcache, CORE_ADDR pc)
1005 {
1006   struct gdbarch *gdbarch = get_regcache_arch (regcache);
1007 
1008   if (gdbarch_write_pc_p (gdbarch))
1009     gdbarch_write_pc (gdbarch, regcache, pc);
1010   else if (gdbarch_pc_regnum (gdbarch) >= 0)
1011     regcache_cooked_write_unsigned (regcache,
1012 				    gdbarch_pc_regnum (gdbarch), pc);
1013   else
1014     internal_error (__FILE__, __LINE__,
1015 		    _("regcache_write_pc: Unable to update PC"));
1016 
1017   /* Writing the PC (for instance, from "load") invalidates the
1018      current frame.  */
1019   reinit_frame_cache ();
1020 }
1021 
1022 
1023 static void
1024 reg_flush_command (char *command, int from_tty)
1025 {
1026   /* Force-flush the register cache.  */
1027   registers_changed ();
1028   if (from_tty)
1029     printf_filtered (_("Register cache flushed.\n"));
1030 }
1031 
1032 static void
1033 dump_endian_bytes (struct ui_file *file, enum bfd_endian endian,
1034 		   const unsigned char *buf, long len)
1035 {
1036   int i;
1037 
1038   switch (endian)
1039     {
1040     case BFD_ENDIAN_BIG:
1041       for (i = 0; i < len; i++)
1042 	fprintf_unfiltered (file, "%02x", buf[i]);
1043       break;
1044     case BFD_ENDIAN_LITTLE:
1045       for (i = len - 1; i >= 0; i--)
1046 	fprintf_unfiltered (file, "%02x", buf[i]);
1047       break;
1048     default:
1049       internal_error (__FILE__, __LINE__, _("Bad switch"));
1050     }
1051 }
1052 
1053 enum regcache_dump_what
1054 {
1055   regcache_dump_none, regcache_dump_raw,
1056   regcache_dump_cooked, regcache_dump_groups
1057 };
1058 
1059 static void
1060 regcache_dump (struct regcache *regcache, struct ui_file *file,
1061 	       enum regcache_dump_what what_to_dump)
1062 {
1063   struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
1064   struct gdbarch *gdbarch = regcache->descr->gdbarch;
1065   int regnum;
1066   int footnote_nr = 0;
1067   int footnote_register_size = 0;
1068   int footnote_register_offset = 0;
1069   int footnote_register_type_name_null = 0;
1070   long register_offset = 0;
1071   unsigned char buf[MAX_REGISTER_SIZE];
1072 
1073 #if 0
1074   fprintf_unfiltered (file, "nr_raw_registers %d\n",
1075 		      regcache->descr->nr_raw_registers);
1076   fprintf_unfiltered (file, "nr_cooked_registers %d\n",
1077 		      regcache->descr->nr_cooked_registers);
1078   fprintf_unfiltered (file, "sizeof_raw_registers %ld\n",
1079 		      regcache->descr->sizeof_raw_registers);
1080   fprintf_unfiltered (file, "sizeof_raw_register_status %ld\n",
1081 		      regcache->descr->sizeof_raw_register_status);
1082   fprintf_unfiltered (file, "gdbarch_num_regs %d\n",
1083 		      gdbarch_num_regs (gdbarch));
1084   fprintf_unfiltered (file, "gdbarch_num_pseudo_regs %d\n",
1085 		      gdbarch_num_pseudo_regs (gdbarch));
1086 #endif
1087 
1088   gdb_assert (regcache->descr->nr_cooked_registers
1089 	      == (gdbarch_num_regs (gdbarch)
1090 		  + gdbarch_num_pseudo_regs (gdbarch)));
1091 
1092   for (regnum = -1; regnum < regcache->descr->nr_cooked_registers; regnum++)
1093     {
1094       /* Name.  */
1095       if (regnum < 0)
1096 	fprintf_unfiltered (file, " %-10s", "Name");
1097       else
1098 	{
1099 	  const char *p = gdbarch_register_name (gdbarch, regnum);
1100 
1101 	  if (p == NULL)
1102 	    p = "";
1103 	  else if (p[0] == '\0')
1104 	    p = "''";
1105 	  fprintf_unfiltered (file, " %-10s", p);
1106 	}
1107 
1108       /* Number.  */
1109       if (regnum < 0)
1110 	fprintf_unfiltered (file, " %4s", "Nr");
1111       else
1112 	fprintf_unfiltered (file, " %4d", regnum);
1113 
1114       /* Relative number.  */
1115       if (regnum < 0)
1116 	fprintf_unfiltered (file, " %4s", "Rel");
1117       else if (regnum < gdbarch_num_regs (gdbarch))
1118 	fprintf_unfiltered (file, " %4d", regnum);
1119       else
1120 	fprintf_unfiltered (file, " %4d",
1121 			    (regnum - gdbarch_num_regs (gdbarch)));
1122 
1123       /* Offset.  */
1124       if (regnum < 0)
1125 	fprintf_unfiltered (file, " %6s  ", "Offset");
1126       else
1127 	{
1128 	  fprintf_unfiltered (file, " %6ld",
1129 			      regcache->descr->register_offset[regnum]);
1130 	  if (register_offset != regcache->descr->register_offset[regnum]
1131 	      || (regnum > 0
1132 		  && (regcache->descr->register_offset[regnum]
1133 		      != (regcache->descr->register_offset[regnum - 1]
1134 			  + regcache->descr->sizeof_register[regnum - 1])))
1135 	      )
1136 	    {
1137 	      if (!footnote_register_offset)
1138 		footnote_register_offset = ++footnote_nr;
1139 	      fprintf_unfiltered (file, "*%d", footnote_register_offset);
1140 	    }
1141 	  else
1142 	    fprintf_unfiltered (file, "  ");
1143 	  register_offset = (regcache->descr->register_offset[regnum]
1144 			     + regcache->descr->sizeof_register[regnum]);
1145 	}
1146 
1147       /* Size.  */
1148       if (regnum < 0)
1149 	fprintf_unfiltered (file, " %5s ", "Size");
1150       else
1151 	fprintf_unfiltered (file, " %5ld",
1152 			    regcache->descr->sizeof_register[regnum]);
1153 
1154       /* Type.  */
1155       {
1156 	const char *t;
1157 
1158 	if (regnum < 0)
1159 	  t = "Type";
1160 	else
1161 	  {
1162 	    static const char blt[] = "builtin_type";
1163 
1164 	    t = TYPE_NAME (register_type (regcache->descr->gdbarch, regnum));
1165 	    if (t == NULL)
1166 	      {
1167 		char *n;
1168 
1169 		if (!footnote_register_type_name_null)
1170 		  footnote_register_type_name_null = ++footnote_nr;
1171 		n = xstrprintf ("*%d", footnote_register_type_name_null);
1172 		make_cleanup (xfree, n);
1173 		t = n;
1174 	      }
1175 	    /* Chop a leading builtin_type.  */
1176 	    if (strncmp (t, blt, strlen (blt)) == 0)
1177 	      t += strlen (blt);
1178 	  }
1179 	fprintf_unfiltered (file, " %-15s", t);
1180       }
1181 
1182       /* Leading space always present.  */
1183       fprintf_unfiltered (file, " ");
1184 
1185       /* Value, raw.  */
1186       if (what_to_dump == regcache_dump_raw)
1187 	{
1188 	  if (regnum < 0)
1189 	    fprintf_unfiltered (file, "Raw value");
1190 	  else if (regnum >= regcache->descr->nr_raw_registers)
1191 	    fprintf_unfiltered (file, "<cooked>");
1192 	  else if (regcache_register_status (regcache, regnum) == REG_UNKNOWN)
1193 	    fprintf_unfiltered (file, "<invalid>");
1194 	  else if (regcache_register_status (regcache, regnum) == REG_UNAVAILABLE)
1195 	    fprintf_unfiltered (file, "<unavailable>");
1196 	  else
1197 	    {
1198 	      regcache_raw_read (regcache, regnum, buf);
1199 	      fprintf_unfiltered (file, "0x");
1200 	      dump_endian_bytes (file,
1201 				 gdbarch_byte_order (gdbarch), buf,
1202 				 regcache->descr->sizeof_register[regnum]);
1203 	    }
1204 	}
1205 
1206       /* Value, cooked.  */
1207       if (what_to_dump == regcache_dump_cooked)
1208 	{
1209 	  if (regnum < 0)
1210 	    fprintf_unfiltered (file, "Cooked value");
1211 	  else
1212 	    {
1213 	      enum register_status status;
1214 
1215 	      status = regcache_cooked_read (regcache, regnum, buf);
1216 	      if (status == REG_UNKNOWN)
1217 		fprintf_unfiltered (file, "<invalid>");
1218 	      else if (status == REG_UNAVAILABLE)
1219 		fprintf_unfiltered (file, "<unavailable>");
1220 	      else
1221 		{
1222 		  fprintf_unfiltered (file, "0x");
1223 		  dump_endian_bytes (file,
1224 				     gdbarch_byte_order (gdbarch), buf,
1225 				     regcache->descr->sizeof_register[regnum]);
1226 		}
1227 	    }
1228 	}
1229 
1230       /* Group members.  */
1231       if (what_to_dump == regcache_dump_groups)
1232 	{
1233 	  if (regnum < 0)
1234 	    fprintf_unfiltered (file, "Groups");
1235 	  else
1236 	    {
1237 	      const char *sep = "";
1238 	      struct reggroup *group;
1239 
1240 	      for (group = reggroup_next (gdbarch, NULL);
1241 		   group != NULL;
1242 		   group = reggroup_next (gdbarch, group))
1243 		{
1244 		  if (gdbarch_register_reggroup_p (gdbarch, regnum, group))
1245 		    {
1246 		      fprintf_unfiltered (file,
1247 					  "%s%s", sep, reggroup_name (group));
1248 		      sep = ",";
1249 		    }
1250 		}
1251 	    }
1252 	}
1253 
1254       fprintf_unfiltered (file, "\n");
1255     }
1256 
1257   if (footnote_register_size)
1258     fprintf_unfiltered (file, "*%d: Inconsistent register sizes.\n",
1259 			footnote_register_size);
1260   if (footnote_register_offset)
1261     fprintf_unfiltered (file, "*%d: Inconsistent register offsets.\n",
1262 			footnote_register_offset);
1263   if (footnote_register_type_name_null)
1264     fprintf_unfiltered (file,
1265 			"*%d: Register type's name NULL.\n",
1266 			footnote_register_type_name_null);
1267   do_cleanups (cleanups);
1268 }
1269 
1270 static void
1271 regcache_print (char *args, enum regcache_dump_what what_to_dump)
1272 {
1273   if (args == NULL)
1274     regcache_dump (get_current_regcache (), gdb_stdout, what_to_dump);
1275   else
1276     {
1277       struct cleanup *cleanups;
1278       struct ui_file *file = gdb_fopen (args, "w");
1279 
1280       if (file == NULL)
1281 	perror_with_name (_("maintenance print architecture"));
1282       cleanups = make_cleanup_ui_file_delete (file);
1283       regcache_dump (get_current_regcache (), file, what_to_dump);
1284       do_cleanups (cleanups);
1285     }
1286 }
1287 
1288 static void
1289 maintenance_print_registers (char *args, int from_tty)
1290 {
1291   regcache_print (args, regcache_dump_none);
1292 }
1293 
1294 static void
1295 maintenance_print_raw_registers (char *args, int from_tty)
1296 {
1297   regcache_print (args, regcache_dump_raw);
1298 }
1299 
1300 static void
1301 maintenance_print_cooked_registers (char *args, int from_tty)
1302 {
1303   regcache_print (args, regcache_dump_cooked);
1304 }
1305 
1306 static void
1307 maintenance_print_register_groups (char *args, int from_tty)
1308 {
1309   regcache_print (args, regcache_dump_groups);
1310 }
1311 
1312 extern initialize_file_ftype _initialize_regcache; /* -Wmissing-prototype */
1313 
1314 void
1315 _initialize_regcache (void)
1316 {
1317   regcache_descr_handle
1318     = gdbarch_data_register_post_init (init_regcache_descr);
1319 
1320   observer_attach_target_changed (regcache_observer_target_changed);
1321   observer_attach_thread_ptid_changed (regcache_thread_ptid_changed);
1322 
1323   add_com ("flushregs", class_maintenance, reg_flush_command,
1324 	   _("Force gdb to flush its register cache (maintainer command)"));
1325 
1326   add_cmd ("registers", class_maintenance, maintenance_print_registers,
1327 	   _("Print the internal register configuration.\n"
1328 	     "Takes an optional file parameter."), &maintenanceprintlist);
1329   add_cmd ("raw-registers", class_maintenance,
1330 	   maintenance_print_raw_registers,
1331 	   _("Print the internal register configuration "
1332 	     "including raw values.\n"
1333 	     "Takes an optional file parameter."), &maintenanceprintlist);
1334   add_cmd ("cooked-registers", class_maintenance,
1335 	   maintenance_print_cooked_registers,
1336 	   _("Print the internal register configuration "
1337 	     "including cooked values.\n"
1338 	     "Takes an optional file parameter."), &maintenanceprintlist);
1339   add_cmd ("register-groups", class_maintenance,
1340 	   maintenance_print_register_groups,
1341 	   _("Print the internal register configuration "
1342 	     "including each register's group.\n"
1343 	     "Takes an optional file parameter."),
1344 	   &maintenanceprintlist);
1345 
1346 }
1347