svn commit: r356862 - in head/sys/powerpc: aim include

Brandon Bergren bdragon at FreeBSD.org
Sat Jan 18 04:12:42 UTC 2020


Author: bdragon
Date: Sat Jan 18 04:12:41 2020
New Revision: 356862
URL: https://svnweb.freebsd.org/changeset/base/356862

Log:
  D23057: [PowerPC] Fix offset calculations in bridge mode
  
  In rS354701, I replaced text relocations with offsets from &generictrap.
  
  Unfortunately, the magic variable I was using doesn't actually mean the
  address of &generictrap, in bridge mode it actually means &generictrap64.
  
  So, for bridge mode to work, it is necessary to differentiate between
  "where do we need to branch to to handle a trap" and "where is &generictrap
  for purposes of doing relative math".
  
  Introduce a new TRAP_ENTRY and use it instead of TRAP_GENTRAP for doing
  actual calls to the generic trap handler.
  
  Reported by:	Mark Millard <marklmi at yahoo.com>
  Reviewed by:	jhibbits
  Sponsored by:	Tag1 Consulting, Inc.
  Differential Revision:	https://reviews.freebsd.org/D23057
  > Description of fields to fill in above:                     76 columns --|
  > PR:                       If and which Problem Report is related.
  > Submitted by:             If someone else sent in the change.
  > Reported by:              If someone else reported the issue.
  > Reviewed by:              If someone else reviewed your modification.
  > Approved by:              If you needed approval for this commit.
  > Obtained from:            If the change is from a third party.
  > MFC after:                N [day[s]|week[s]|month[s]].  Request a reminder email.
  > MFH:                      Ports tree branch name.  Request approval for merge.
  > Relnotes:                 Set to 'yes' for mention in release notes.
  > Security:                 Vulnerability reference (one per line) or description.
  > Sponsored by:             If the change was sponsored by an organization (each collaborator).
  > Differential Revision:    https://reviews.freebsd.org/D### (*full* phabric URL needed).
  > Empty fields above will be automatically removed.
  
  M    sys/powerpc/aim/aim_machdep.c
  M    sys/powerpc/aim/trap_subr32.S
  M    sys/powerpc/aim/trap_subr64.S
  M    sys/powerpc/include/trap.h

Modified:
  head/sys/powerpc/aim/aim_machdep.c
  head/sys/powerpc/aim/trap_subr32.S
  head/sys/powerpc/aim/trap_subr64.S
  head/sys/powerpc/include/trap.h

Modified: head/sys/powerpc/aim/aim_machdep.c
==============================================================================
--- head/sys/powerpc/aim/aim_machdep.c	Sat Jan 18 03:33:44 2020	(r356861)
+++ head/sys/powerpc/aim/aim_machdep.c	Sat Jan 18 04:12:41 2020	(r356862)
@@ -388,16 +388,18 @@ aim_cpu_init(vm_offset_t toc)
 	bcopy(&dsitrap,  (void *)(EXC_DSI + trap_offset),  (size_t)&dsiend -
 	    (size_t)&dsitrap);
 
+	/* Set address of generictrap for self-reloc calculations */
+	*((void **)TRAP_GENTRAP) = &generictrap;
 	#ifdef __powerpc64__
 	/* Set TOC base so that the interrupt code can get at it */
-	*((void **)TRAP_GENTRAP) = &generictrap;
+	*((void **)TRAP_ENTRY) = &generictrap;
 	*((register_t *)TRAP_TOCBASE) = toc;
 	#else
 	/* Set branch address for trap code */
 	if (cpu_features & PPC_FEATURE_64)
-		*((void **)TRAP_GENTRAP) = &generictrap64;
+		*((void **)TRAP_ENTRY) = &generictrap64;
 	else
-		*((void **)TRAP_GENTRAP) = &generictrap;
+		*((void **)TRAP_ENTRY) = &generictrap;
 	*((void **)TRAP_TOCBASE) = _GLOBAL_OFFSET_TABLE_;
 
 	/* G2-specific TLB miss helper handlers */

Modified: head/sys/powerpc/aim/trap_subr32.S
==============================================================================
--- head/sys/powerpc/aim/trap_subr32.S	Sat Jan 18 03:33:44 2020	(r356861)
+++ head/sys/powerpc/aim/trap_subr32.S	Sat Jan 18 04:12:41 2020	(r356862)
@@ -348,7 +348,7 @@ CNAME(trapcode):
 	mtsprg1	%r1			/* save SP */
 	mflr	%r1			/* Save the old LR in r1 */
 	mtsprg2 %r1			/* And then in SPRG2 */
-	lwz	%r1, TRAP_GENTRAP(0)	/* Get branch address */
+	lwz	%r1, TRAP_ENTRY(0)	/* Get branch address */
 	mtlr	%r1
 	li	%r1, 0xe0		/* How to get the vector from LR */
 	blrl				/* LR & (0xff00 | r1) is exception # */
@@ -908,7 +908,7 @@ CNAME(dblow):
         mflr	%r1			/* save LR */
 	mtsprg2 %r1			/* And then in SPRG2 */
 
-	lwz	%r1, TRAP_GENTRAP(0)	/* Get branch address */
+	lwz	%r1, TRAP_ENTRY(0)	/* Get branch address */
 	mtlr	%r1
 	li	%r1, 0			/* How to get the vector from LR */
 	blrl				/* LR & (0xff00 | r1) is exception # */

Modified: head/sys/powerpc/aim/trap_subr64.S
==============================================================================
--- head/sys/powerpc/aim/trap_subr64.S	Sat Jan 18 03:33:44 2020	(r356861)
+++ head/sys/powerpc/aim/trap_subr64.S	Sat Jan 18 04:12:41 2020	(r356862)
@@ -318,7 +318,7 @@ CNAME(rstcode):
 	 * It is software reset when 46:47 = 0b00
 	 */
 	/* 0x00 */
-	ld	%r2,TRAP_GENTRAP(0)	/* Real-mode &generictrap */
+	ld	%r2,TRAP_ENTRY(0)	/* Real-mode &generictrap */
 	mfsrr1	%r9			/* Load SRR1 into r9 */
 	andis.	%r9,%r9,0x3		/* Logic AND with 46:47 bits */
 
@@ -446,7 +446,7 @@ CNAME(trapcode):
 	mtsprg1	%r1			/* save SP */
 	mflr	%r1			/* Save the old LR in r1 */
 	mtsprg2 %r1			/* And then in SPRG2 */
-	ld	%r1,TRAP_GENTRAP(0)
+	ld	%r1,TRAP_ENTRY(0)
 	mtlr	%r1
 	li	%r1, 0xe0		/* How to get the vector from LR */
 	blrl				/* Branch to generictrap */
@@ -493,7 +493,7 @@ CNAME(slbtrap):
 	mflr	%r1
 	/* 0x30 */
 	mtsprg2 %r1				/* save LR in SPRG2 */
-	ld	%r1,TRAP_GENTRAP(0)		/* real-mode &generictrap */
+	ld	%r1,TRAP_ENTRY(0)		/* real-mode &generictrap */
 	mtlr	%r1
 	li	%r1, 0x80		/* How to get the vector from LR */
 	/* 0x40 */
@@ -955,7 +955,7 @@ CNAME(dblow):
         mflr	%r1			/* save LR */
 	mtsprg2 %r1			/* And then in SPRG2 */
 
-	ld	%r1, TRAP_GENTRAP(0)	/* Get branch address */
+	ld	%r1, TRAP_ENTRY(0)	/* Get branch address */
 	mtlr	%r1
 	li	%r1, 0	 		/* How to get the vector from LR */
 	blrl				/* Branch to generictrap */

Modified: head/sys/powerpc/include/trap.h
==============================================================================
--- head/sys/powerpc/include/trap.h	Sat Jan 18 03:33:44 2020	(r356861)
+++ head/sys/powerpc/include/trap.h	Sat Jan 18 04:12:41 2020	(r356862)
@@ -147,8 +147,9 @@
 #define EXC_DTRACE	0x7ffff808
 
 /* Magic pointer to store TOC base and other info for trap handlers on ppc64 */
-#define TRAP_GENTRAP	0x1f0
-#define TRAP_TOCBASE	0x1f8
+#define	TRAP_ENTRY	0x1e8
+#define	TRAP_GENTRAP	0x1f0
+#define	TRAP_TOCBASE	0x1f8
 
 #ifndef LOCORE
 struct	trapframe;


More information about the svn-src-all mailing list