svn commit: r304051 - in head/sys/powerpc: aim booke powerpc

Justin Hibbits jhibbits at FreeBSD.org
Sat Aug 13 18:46:51 UTC 2016


Author: jhibbits
Date: Sat Aug 13 18:46:49 2016
New Revision: 304051
URL: https://svnweb.freebsd.org/changeset/base/304051

Log:
  Add a kdb show command to print arbitrary SPRs on PowerPC
  
  Summary:
  There is often a need at the debugger to print arbitrary special
  purpose registers (SPRs) on PowerPC.  Using a rewritable asm stub, print any SPR
  provided on the command line.
  
  Note, as there is no checking in this, attempting to print a nonexistent SPR
  may cause a Program exception (illegal instruction, or boundedly undefined).
  
  Note also that this relies on the kernel text pages being writable.  If in the
  future this is made not the case, this will need to be reworked.
  
  Test Plan:
  Printing the Processor Version Register (PVR, SPR 287):
  
  db> show spr 11f
  SPR 287(11f): 80240012
  
  Differential Revision: https://reviews.freebsd.org/D7403

Modified:
  head/sys/powerpc/aim/locore.S
  head/sys/powerpc/booke/locore.S
  head/sys/powerpc/powerpc/machdep.c

Modified: head/sys/powerpc/aim/locore.S
==============================================================================
--- head/sys/powerpc/aim/locore.S	Sat Aug 13 18:10:32 2016	(r304050)
+++ head/sys/powerpc/aim/locore.S	Sat Aug 13 18:46:49 2016	(r304051)
@@ -6,3 +6,10 @@
 #include <powerpc/aim/locore32.S>
 #endif
 
+/*
+ * XXX: This should be moved to a shared AIM/booke asm file, if one ever is
+ * created.
+ */
+ENTRY(get_spr)
+	mfspr	%r3, 0
+	blr

Modified: head/sys/powerpc/booke/locore.S
==============================================================================
--- head/sys/powerpc/booke/locore.S	Sat Aug 13 18:10:32 2016	(r304050)
+++ head/sys/powerpc/booke/locore.S	Sat Aug 13 18:46:49 2016	(r304051)
@@ -848,6 +848,14 @@ ENTRY(dataloss_erratum_access)
 
 	blr
 
+/*
+ * XXX: This should be moved to a shared AIM/booke asm file, if one ever is
+ * created.
+ */
+ENTRY(get_spr)
+	mfspr	%r3, 0
+	blr
+
 /************************************************************************/
 /* Data section								*/
 /************************************************************************/

Modified: head/sys/powerpc/powerpc/machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/machdep.c	Sat Aug 13 18:10:32 2016	(r304050)
+++ head/sys/powerpc/powerpc/machdep.c	Sat Aug 13 18:46:49 2016	(r304051)
@@ -516,3 +516,31 @@ spinlock_exit(void)
 	}
 }
 
+/*
+ * Simple ddb(4) command/hack to view any SPR on the running CPU.
+ * Uses a trivial asm function to perform the mfspr, and rewrites the mfspr
+ * instruction each time.
+ * XXX: Since it uses code modification, it won't work if the kernel code pages
+ * are marked RO.
+ */
+extern register_t get_spr(int);
+
+DB_SHOW_COMMAND(spr, db_show_spr)
+{
+	register_t spr;
+	volatile uint32_t *p;
+	int sprno, saved_sprno;
+
+	if (!have_addr)
+		return;
+
+	saved_sprno = sprno = (intptr_t) addr;
+	sprno = ((sprno & 0x3e0) >> 5) | ((sprno & 0x1f) << 5);
+	p = (uint32_t *)(void *)&get_spr;
+	*p = (*p & ~0x001ff800) | (sprno << 11);
+	__syncicache(get_spr, cacheline_size);
+	spr = get_spr(sprno);
+
+	db_printf("SPR %d(%x): %lx\n", saved_sprno, saved_sprno,
+	    (unsigned long)spr);
+}


More information about the svn-src-all mailing list