Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Oct 2019 12:03:48 +0000 (UTC)
From:      Leandro Lupori <luporl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r354214 - in head/sys/powerpc: include powerpc
Message-ID:  <201910311203.x9VC3mN0026674@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201910311203.x9VC3mN0026674>