gdb: xtensa: fix test for privileged register number
authorMax Filippov <jcmvbkbc@gmail.com>
Tue, 21 Feb 2017 23:41:31 +0000 (15:41 -0800)
committerMax Filippov <jcmvbkbc@gmail.com>
Mon, 27 Mar 2017 20:00:55 +0000 (13:00 -0700)
There are no a0-a15 pseudoregisters at the top of the register set in
call0 registers layout. All registers above gdbarch_num_regs (gdbarch)
are privileged. Treat them as such. This fixes the following gdb
assertion seen when 'finish' command is invoked:

  regcache.c:649: internal-error: register_status
  regcache_raw_read(regcache*, int, gdb_byte*):
  Assertion `regnum >= 0 && regnum < regcache->descr->nr_raw_registers'
  failed.

gdb/
2017-03-27  Max Filippov  <jcmvbkbc@gmail.com>

* xtensa-tdep.c (xtensa_pseudo_register_read): Treat all
registers above gdbarch_num_regs (gdbarch) as privileged in
call0 ABI.

gdb/ChangeLog
gdb/xtensa-tdep.c

index 2faf489..2cebe10 100644 (file)
@@ -1,5 +1,11 @@
 2017-03-27  Max Filippov  <jcmvbkbc@gmail.com>
 
 2017-03-27  Max Filippov  <jcmvbkbc@gmail.com>
 
+       * xtensa-tdep.c (xtensa_pseudo_register_read): Treat all
+       registers above gdbarch_num_regs (gdbarch) as privileged in
+       call0 ABI.
+
+2017-03-27  Max Filippov  <jcmvbkbc@gmail.com>
+
        * xtensa-linux-nat.c (fill_gregset): Call regcache_raw_collect
        for a single specified register or for all registers in
        a0_base..a0_base + C0_NREGS range.
        * xtensa-linux-nat.c (fill_gregset): Call regcache_raw_collect
        for a single specified register or for all registers in
        a0_base..a0_base + C0_NREGS range.
index 0000155..2338ac1 100644 (file)
@@ -578,7 +578,8 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
   /* We have to find out how to deal with priveleged registers.
      Let's treat them as pseudo-registers, but we cannot read/write them.  */
      
   /* We have to find out how to deal with priveleged registers.
      Let's treat them as pseudo-registers, but we cannot read/write them.  */
      
-  else if (regnum < gdbarch_tdep (gdbarch)->a0_base)
+  else if (gdbarch_tdep (gdbarch)->call_abi == CallAbiCall0Only
+          || regnum < gdbarch_tdep (gdbarch)->a0_base)
     {
       buffer[0] = (gdb_byte)0;
       buffer[1] = (gdb_byte)0;
     {
       buffer[0] = (gdb_byte)0;
       buffer[1] = (gdb_byte)0;