svn commit: r199412 - in projects/ppc64/sys: conf powerpc/include powerpc/powerpc

Nathan Whitehorn nwhitehorn at FreeBSD.org
Tue Nov 17 17:53:52 UTC 2009


Author: nwhitehorn
Date: Tue Nov 17 17:53:52 2009
New Revision: 199412
URL: http://svn.freebsd.org/changeset/base/199412

Log:
  Split up 32 and 64-bit sigcode, add a skeleton implementation of 64-bit
  sigcode, and fix 32-bit signal delivery some more.

Added:
  projects/ppc64/sys/powerpc/powerpc/sigcode32.S
     - copied, changed from r198415, projects/ppc64/sys/powerpc/powerpc/sigcode.S
  projects/ppc64/sys/powerpc/powerpc/sigcode64.S
     - copied, changed from r198415, projects/ppc64/sys/powerpc/powerpc/sigcode.S
Deleted:
  projects/ppc64/sys/powerpc/powerpc/sigcode.S
Modified:
  projects/ppc64/sys/conf/files.powerpc
  projects/ppc64/sys/conf/files.powerpc64
  projects/ppc64/sys/powerpc/include/md_var.h
  projects/ppc64/sys/powerpc/powerpc/elf32_machdep.c
  projects/ppc64/sys/powerpc/powerpc/elf64_machdep.c
  projects/ppc64/sys/powerpc/powerpc/exec_machdep.c

Modified: projects/ppc64/sys/conf/files.powerpc
==============================================================================
--- projects/ppc64/sys/conf/files.powerpc	Tue Nov 17 17:38:41 2009	(r199411)
+++ projects/ppc64/sys/conf/files.powerpc	Tue Nov 17 17:53:52 2009	(r199412)
@@ -171,7 +171,7 @@ powerpc/powerpc/platform.c	standard
 powerpc/powerpc/platform_if.m	standard
 powerpc/powerpc/sc_machdep.c	optional	sc
 powerpc/powerpc/setjmp.S	standard
-powerpc/powerpc/sigcode.S	standard
+powerpc/powerpc/sigcode32.S	standard
 powerpc/powerpc/stack_machdep.c	optional	ddb | stack
 powerpc/powerpc/suswintr.c	standard
 powerpc/powerpc/syncicache.c	standard

Modified: projects/ppc64/sys/conf/files.powerpc64
==============================================================================
--- projects/ppc64/sys/conf/files.powerpc64	Tue Nov 17 17:38:41 2009	(r199411)
+++ projects/ppc64/sys/conf/files.powerpc64	Tue Nov 17 17:53:52 2009	(r199412)
@@ -125,7 +125,8 @@ powerpc/powerpc/platform.c	standard
 powerpc/powerpc/platform_if.m	standard
 powerpc/powerpc/sc_machdep.c	optional	sc
 powerpc/powerpc/setjmp.S	standard
-powerpc/powerpc/sigcode.S	standard
+powerpc/powerpc/sigcode32.S	optional	compat_freebsd32
+powerpc/powerpc/sigcode64.S	standard
 powerpc/powerpc/stack_machdep.c	optional	ddb | stack
 powerpc/powerpc/suswintr.c	standard
 powerpc/powerpc/syncicache.c	standard

Modified: projects/ppc64/sys/powerpc/include/md_var.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/md_var.h	Tue Nov 17 17:38:41 2009	(r199411)
+++ projects/ppc64/sys/powerpc/include/md_var.h	Tue Nov 17 17:53:52 2009	(r199412)
@@ -33,9 +33,14 @@
  * Miscellaneous machine-dependent declarations.
  */
 
-extern	char	sigcode[];
-extern	char	esigcode[];
-extern	int	szsigcode;
+extern	char	sigcode32[];
+extern	int	szsigcode32;
+
+#ifdef __powerpc64__
+extern	char	sigcode64[];
+extern	int	szsigcode64;
+#endif
+
 extern	long	Maxmem;
 extern	int	busdma_swi_pending;
 

Modified: projects/ppc64/sys/powerpc/powerpc/elf32_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/elf32_machdep.c	Tue Nov 17 17:38:41 2009	(r199411)
+++ projects/ppc64/sys/powerpc/powerpc/elf32_machdep.c	Tue Nov 17 17:53:52 2009	(r199412)
@@ -72,8 +72,8 @@ struct sysentvec elf32_freebsd_sysvec = 
 	.sv_transtrap	= NULL,
 	.sv_fixup	= __elfN(freebsd_fixup),
 	.sv_sendsig	= sendsig,
-	.sv_sigcode	= sigcode,
-	.sv_szsigcode	= &szsigcode,
+	.sv_sigcode	= sigcode32,
+	.sv_szsigcode	= &szsigcode32,
 	.sv_prepsyscall	= NULL,
 	.sv_name	= "FreeBSD ELF32",
 	.sv_coredump	= __elfN(coredump),

Modified: projects/ppc64/sys/powerpc/powerpc/elf64_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/elf64_machdep.c	Tue Nov 17 17:38:41 2009	(r199411)
+++ projects/ppc64/sys/powerpc/powerpc/elf64_machdep.c	Tue Nov 17 17:53:52 2009	(r199412)
@@ -59,8 +59,8 @@ struct sysentvec elf64_freebsd_sysvec = 
 	.sv_transtrap	= NULL,
 	.sv_fixup	= __elfN(freebsd_fixup),
 	.sv_sendsig	= sendsig,
-	.sv_sigcode	= sigcode,
-	.sv_szsigcode	= &szsigcode,
+	.sv_sigcode	= sigcode64,
+	.sv_szsigcode	= &szsigcode64,
 	.sv_prepsyscall	= NULL,
 	.sv_name	= "FreeBSD ELF64",
 	.sv_coredump	= __elfN(coredump),

Modified: projects/ppc64/sys/powerpc/powerpc/exec_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/exec_machdep.c	Tue Nov 17 17:38:41 2009	(r199411)
+++ projects/ppc64/sys/powerpc/powerpc/exec_machdep.c	Tue Nov 17 17:53:52 2009	(r199412)
@@ -141,8 +141,6 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, 
 	tf = td->td_frame;
 	oonstack = sigonstack(tf->fixreg[1]);
 
-	rndfsize = ((sizeof(sf) + 15) / 16) * 16;
-
 	/*
 	 * Fill siginfo structure.
 	 */
@@ -162,6 +160,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, 
 		code = siginfo32.si_code;
 		sfp = (caddr_t)&sf32;
 		sfpsize = sizeof(sf32);
+		rndfsize = ((sizeof(sf32) + 15) / 16) * 16;
 
 		/*
 		 * Save user context
@@ -183,6 +182,15 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, 
 		code = ksi->ksi_code;
 		sfp = (caddr_t)&sf;
 		sfpsize = sizeof(sf);
+		#ifdef __powerpc64__
+		/*
+		 * 64-bit PPC defines a 288 byte scratch region
+		 * below the stack.
+		 */
+		rndfsize = 288 + ((sizeof(sf) + 47) / 48) * 48;
+		#else
+		rndfsize = ((sizeof(sf) + 15) / 16) * 16;
+		#endif
 
 		/*
 		 * Save user context
@@ -280,15 +288,8 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, 
 	mtx_unlock(&psp->ps_mtx);
 	PROC_UNLOCK(p);
 
-	#ifdef COMPAT_FREEBSD32
-	if (p->p_sysent->sv_flags & SV_ILP32)
-		tf->srr0 = (register_t)(FREEBSD32_PS_STRINGS -
-		    *(p->p_sysent->sv_szsigcode));
-	else
-	#else
-		tf->srr0 = (register_t)(PS_STRINGS -
-		    *(p->p_sysent->sv_szsigcode));
-	#endif
+	tf->srr0 = (register_t)(p->p_sysent->sv_psstrings -
+	    *(p->p_sysent->sv_szsigcode));
 
 	/*
 	 * copy the frame out to userland.

Copied and modified: projects/ppc64/sys/powerpc/powerpc/sigcode32.S (from r198415, projects/ppc64/sys/powerpc/powerpc/sigcode.S)
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/sigcode.S	Fri Oct 23 16:07:15 2009	(r198415, copy source)
+++ projects/ppc64/sys/powerpc/powerpc/sigcode32.S	Tue Nov 17 17:53:52 2009	(r199412)
@@ -43,8 +43,8 @@
  * On entry r1 points to a struct sigframe at bottom of current stack.
  * All other registers are unchanged.
  */
-	.globl	CNAME(sigcode),CNAME(szsigcode)
-CNAME(sigcode):
+	.globl	CNAME(sigcode32),CNAME(szsigcode32)
+CNAME(sigcode32):
 	addi	1,1,-16			/* reserved space for callee */
 	blrl
 	addi	3,1,16+SF_UC		/* restore sp, and get &frame->sf_uc */
@@ -52,8 +52,8 @@ CNAME(sigcode):
 	sc				/* sigreturn(scp) */
 	li	0,SYS_exit
 	sc				/* exit(errno) */
-endsigcode:
+endsigcode32:
 	
 	.data
-CNAME(szsigcode):
-	.long	endsigcode - CNAME(sigcode)
+CNAME(szsigcode32):
+	.long	endsigcode32 - CNAME(sigcode32)

Copied and modified: projects/ppc64/sys/powerpc/powerpc/sigcode64.S (from r198415, projects/ppc64/sys/powerpc/powerpc/sigcode.S)
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/sigcode.S	Fri Oct 23 16:07:15 2009	(r198415, copy source)
+++ projects/ppc64/sys/powerpc/powerpc/sigcode64.S	Tue Nov 17 17:53:52 2009	(r199412)
@@ -43,17 +43,23 @@
  * On entry r1 points to a struct sigframe at bottom of current stack.
  * All other registers are unchanged.
  */
-	.globl	CNAME(sigcode),CNAME(szsigcode)
-CNAME(sigcode):
-	addi	1,1,-16			/* reserved space for callee */
+	.globl	CNAME(sigcode64),CNAME(szsigcode64)
+CNAME(sigcode64):
+	addi	1,1,-48			/* reserved space for callee */
+	mflr	2			/* resolve function descriptor */
+	ld	0,0(2)			
+	ld	2,8(2)
+	mtlr	0
+
 	blrl
-	addi	3,1,16+SF_UC		/* restore sp, and get &frame->sf_uc */
+
+	addi	3,1,48+SF_UC		/* restore sp, and get &frame->sf_uc */
 	li	0,SYS_sigreturn
 	sc				/* sigreturn(scp) */
 	li	0,SYS_exit
 	sc				/* exit(errno) */
-endsigcode:
+endsigcode64:
 	
 	.data
-CNAME(szsigcode):
-	.long	endsigcode - CNAME(sigcode)
+CNAME(szsigcode64):
+	.long	endsigcode64 - CNAME(sigcode64)


More information about the svn-src-projects mailing list