Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 Aug 2016 18:46:49 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r304051 - in head/sys/powerpc: aim booke powerpc
Message-ID:  <201608131846.u7DIknwl004117@repo.freebsd.org>

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



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