RISC-V: Correct printing of MSTATUS and MISA.
authorJim Wilson <jimw@sifive.com>
Thu, 13 Dec 2018 18:48:23 +0000 (10:48 -0800)
committerJim Wilson <jimw@sifive.com>
Thu, 13 Dec 2018 18:48:23 +0000 (10:48 -0800)
* riscv-tdep.c (riscv_print_one_register_info): For MSTATUS, add
comment for SD field, and correct xlen calculation.  For MISA, add
comment for MXL field, add call to register_size, and correct base
calculation.

gdb/ChangeLog
gdb/riscv-tdep.c

index 45991576fc4ef3d0828b073b8bd5eadbfdb36a04..bf40e682a9249946cdb1b86aaba242d8e7ff9595 100644 (file)
@@ -1,3 +1,10 @@
+2018-12-13  Jim Wilson  <jimw@sifive.com>
+
+       * riscv-tdep.c (riscv_print_one_register_info): For MSTATUS, add
+       comment for SD field, and correct xlen calculation.  For MISA, add
+       comment for MXL field, add call to register_size, and correct base
+       calculation.
+
 2018-12-13  Stafford Horne  <shorne@gmail.com>
 
        * NEWS(New targets): Add or1k*-*-linux*.
index fc424fb042c29740cc032d5ceae184edeb246198..88b79af866f752404e8cad774a84a61cb873ca86 100644 (file)
@@ -701,8 +701,10 @@ riscv_print_one_register_info (struct gdbarch *gdbarch,
              int size = register_size (gdbarch, regnum);
              unsigned xlen;
 
+             /* The SD field is always in the upper bit of MSTATUS, regardless
+                of the number of bits in MSTATUS.  */
              d = value_as_long (val);
-             xlen = size * 4;
+             xlen = size * 8;
              fprintf_filtered (file,
                                "\tSD:%X VM:%02X MXR:%X PUM:%X MPRV:%X XS:%X "
                                "FS:%X MPP:%x HPP:%X SPP:%X MPIE:%X HPIE:%X "
@@ -731,9 +733,13 @@ riscv_print_one_register_info (struct gdbarch *gdbarch,
              int base;
              unsigned xlen, i;
              LONGEST d;
+             int size = register_size (gdbarch, regnum);
 
+             /* The MXL field is always in the upper two bits of MISA,
+                regardless of the number of bits in MISA.  Mask out other
+                bits to ensure we have a positive value.  */
              d = value_as_long (val);
-             base = d >> 30;
+             base = (d >> ((size * 8) - 2)) & 0x3;
              xlen = 16;
 
              for (; base > 0; base--)