Author: luporl
Date: Thu Oct 31 12:03:47 2019
New Revision: 354214
URL: https://svnweb.freebsd.org/changeset/base/354214

Log:
  Fix GDB machdep code for PPC/PPC64
  
  There was a couple issues with GDB machdep code for PPC/PPC64, the main ones 
being:
  - wrong register sizes being returned
  - pcb_context index was wrong (this affects all PPC variants)
  
  Reviewed by:  jhibbits
  Differential Revision:        https://reviews.freebsd.org/D22201

Modified:
  head/sys/powerpc/include/gdb_machdep.h
  head/sys/powerpc/powerpc/gdb_machdep.c

Modified: head/sys/powerpc/include/gdb_machdep.h
==============================================================================
--- head/sys/powerpc/include/gdb_machdep.h      Thu Oct 31 11:59:00 2019        
(r354213)
+++ head/sys/powerpc/include/gdb_machdep.h      Thu Oct 31 12:03:47 2019        
(r354214)
@@ -36,10 +36,43 @@
 #define        PPC_GDB_NREGS4  (70 + 1)
 #define        PPC_GDB_NREGS8  (1 + 32)
 #define        PPC_GDB_NREGS16 0
+
 #else
+/*
+ *   0 - 32*GPR(4/8)
+ *  32 - 32*FPR(8)
+ *  64 - PC, PS (4/8)
+ *  66 - CR (4)
+ *  67 - LR, CTR (4/8)
+ *  69 - XER, FPSCR (4)
+ *  71 - 32*VR(16)
+ * 103 - VSCR, VRSAVE (4)
+ */
+
+#define        PPC_REGNUM_R0   0
+#define        PPC_REGNUM_R31  (PPC_REGNUM_R0 + 31)
+#define        PPC_REGNUM_FR0  32
+#define        PPC_REGNUM_FR31 (PPC_REGNUM_FR0 + 31)
+#define        PPC_REGNUM_PC   64
+#define        PPC_REGNUM_PS   65
+#define        PPC_REGNUM_CR   66
+#define        PPC_REGNUM_LR   67
+#define        PPC_REGNUM_CTR  68
+#define        PPC_REGNUM_XER  69
+#define        PPC_REGNUM_FPSCR 70
+#define        PPC_REGNUM_VR0  71
+#define        PPC_REGNUM_VR31 (PPC_REGNUM_VR0 + 31)
+
 #define        PPC_GDB_NREGS0  0
+
+#ifdef __powerpc64__
+#define        PPC_GDB_NREGS4  5
+#define        PPC_GDB_NREGS8  (64 + 4)
+#else
 #define        PPC_GDB_NREGS4  (32 + 7 + 2)
 #define        PPC_GDB_NREGS8  32
+#endif
+
 #define        PPC_GDB_NREGS16 32
 #endif
 
@@ -61,9 +94,15 @@ gdb_cpu_regsz(int regnum)
        if (regnum == 71 || regnum >= 73)
                return (8);
 #else
-       if (regnum >= 32 && regnum <= 63)
+#ifdef __powerpc64__
+       if ((regnum >= PPC_REGNUM_R0 && regnum <= PPC_REGNUM_PS) ||
+           regnum == PPC_REGNUM_LR || regnum == PPC_REGNUM_CTR)
                return (8);
-       if (regnum >= 71 && regnum <= 102)
+#else
+       if (regnum >= PPC_REGNUM_FR0 && regnum <= PPC_REGNUM_FR31)
+               return (8);
+#endif
+       if (regnum >= PPC_REGNUM_VR0 && regnum <= PPC_REGNUM_VR31)
                return (16);
 #endif
        return (4);

Modified: head/sys/powerpc/powerpc/gdb_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/gdb_machdep.c      Thu Oct 31 11:59:00 2019        
(r354213)
+++ head/sys/powerpc/powerpc/gdb_machdep.c      Thu Oct 31 12:03:47 2019        
(r354214)
@@ -65,8 +65,10 @@ gdb_cpu_getreg(int regnum, size_t *regsz)
 
        if (regnum == 1)
                return (&kdb_thrctx->pcb_sp);
-       if (regnum >= 14 && regnum <= 31)
-               return (kdb_thrctx->pcb_context + (regnum - 14));
+       if (regnum == 2 && *regsz == 8)
+               return (&kdb_thrctx->pcb_toc);
+       if (regnum >= 12 && regnum <= 31)
+               return (kdb_thrctx->pcb_context + (regnum - 12));
        if (regnum == 64)
                return (&kdb_thrctx->pcb_lr);
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to