svn commit: r354214 - in head/sys/powerpc: include powerpc
Leandro Lupori
luporl at FreeBSD.org
Thu Oct 31 12:03:49 UTC 2019
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);
More information about the svn-src-all
mailing list