Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 29 Nov 2009 17:25:33 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r199900 - in projects/ppc64/sys/powerpc: aim powerpc
Message-ID:  <200911291725.nATHPX3q002250@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Sun Nov 29 17:25:32 2009
New Revision: 199900
URL: http://svn.freebsd.org/changeset/base/199900

Log:
  Add TLS support for 64-bit binaries and move both TLS setting and syscall
  returns to powerpc/exec_machdep.c, which is meant to handle userland ABI
  details.

Modified:
  projects/ppc64/sys/powerpc/aim/vm_machdep.c
  projects/ppc64/sys/powerpc/powerpc/exec_machdep.c

Modified: projects/ppc64/sys/powerpc/aim/vm_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/vm_machdep.c	Sun Nov 29 10:53:34 2009	(r199899)
+++ projects/ppc64/sys/powerpc/aim/vm_machdep.c	Sun Nov 29 17:25:32 2009	(r199900)
@@ -81,7 +81,6 @@
 #include <sys/kernel.h>
 #include <sys/mbuf.h>
 #include <sys/sf_buf.h>
-#include <sys/syscall.h>
 #include <sys/sysctl.h>
 #include <sys/sysent.h>
 #include <sys/unistd.h>
@@ -438,60 +437,6 @@ cpu_thread_swapout(struct thread *td)
 }
 
 void
-cpu_set_syscall_retval(struct thread *td, int error)
-{
-	struct proc *p;
-	struct trapframe *tf;
-	int fixup;
-
-	if (error == EJUSTRETURN)
-		return;
-
-	p = td->td_proc;
-	tf = td->td_frame;
-
-	if (tf->fixreg[0] == SYS___syscall &&
-	    (p->p_sysent->sv_flags & SV_ILP32)) {
-		int code = tf->fixreg[FIRSTARG + 1];
-		if (p->p_sysent->sv_mask)
-			code &= p->p_sysent->sv_mask;
-		fixup = (code != SYS_freebsd6_lseek && code != SYS_lseek) ?
-		    1 : 0;
-	} else
-		fixup = 0;
-
-	switch (error) {
-	case 0:
-		if (fixup) {
-			/*
-			 * 64-bit return, 32-bit syscall. Fixup byte order
-			 */
-			tf->fixreg[FIRSTARG] = 0;
-			tf->fixreg[FIRSTARG + 1] = td->td_retval[0];
-		} else {
-			tf->fixreg[FIRSTARG] = td->td_retval[0];
-			tf->fixreg[FIRSTARG + 1] = td->td_retval[1];
-		}
-		tf->cr &= ~0x10000000;		/* XXX: Magic number */
-		break;
-	case ERESTART:
-		/*
-		 * Set user's pc back to redo the system call.
-		 */
-		tf->srr0 -= 4;
-		break;
-	default:
-		if (p->p_sysent->sv_errsize) {
-			error = (error < p->p_sysent->sv_errsize) ?
-			    p->p_sysent->sv_errtbl[error] : -1;
-		}
-		tf->fixreg[FIRSTARG] = error;
-		tf->cr |= 0x10000000;		/* XXX: Magic number */
-		break;
-	}
-}
-
-void
 cpu_set_upcall(struct thread *td, struct thread *td0)
 {
 	struct pcb *pcb2;
@@ -555,10 +500,3 @@ cpu_set_upcall_kse(struct thread *td, vo
 	td->td_retval[1] = 0;
 }
 
-int
-cpu_set_user_tls(struct thread *td, void *tls_base)
-{
-
-	td->td_frame->fixreg[2] = (register_t)tls_base + 0x7008;
-	return (0);
-}

Modified: projects/ppc64/sys/powerpc/powerpc/exec_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/exec_machdep.c	Sun Nov 29 10:53:34 2009	(r199899)
+++ projects/ppc64/sys/powerpc/powerpc/exec_machdep.c	Sun Nov 29 17:25:32 2009	(r199900)
@@ -75,6 +75,7 @@ __FBSDID("$FreeBSD: projects/ppc64/sys/p
 #include <sys/malloc.h>
 #include <sys/mutex.h>
 #include <sys/signalvar.h>
+#include <sys/syscall.h>
 #include <sys/sysent.h>
 #include <sys/sysproto.h>
 #include <sys/ucontext.h>
@@ -845,3 +846,68 @@ freebsd32_swapcontext(struct thread *td,
 
 #endif
 
+void
+cpu_set_syscall_retval(struct thread *td, int error)
+{
+	struct proc *p;
+	struct trapframe *tf;
+	int fixup;
+
+	if (error == EJUSTRETURN)
+		return;
+
+	p = td->td_proc;
+	tf = td->td_frame;
+
+	if (tf->fixreg[0] == SYS___syscall &&
+	    (p->p_sysent->sv_flags & SV_ILP32)) {
+		int code = tf->fixreg[FIRSTARG + 1];
+		if (p->p_sysent->sv_mask)
+			code &= p->p_sysent->sv_mask;
+		fixup = (code != SYS_freebsd6_lseek && code != SYS_lseek) ?
+		    1 : 0;
+	} else
+		fixup = 0;
+
+	switch (error) {
+	case 0:
+		if (fixup) {
+			/*
+			 * 64-bit return, 32-bit syscall. Fixup byte order
+			 */
+			tf->fixreg[FIRSTARG] = 0;
+			tf->fixreg[FIRSTARG + 1] = td->td_retval[0];
+		} else {
+			tf->fixreg[FIRSTARG] = td->td_retval[0];
+			tf->fixreg[FIRSTARG + 1] = td->td_retval[1];
+		}
+		tf->cr &= ~0x10000000;		/* XXX: Magic number */
+		break;
+	case ERESTART:
+		/*
+		 * Set user's pc back to redo the system call.
+		 */
+		tf->srr0 -= 4;
+		break;
+	default:
+		if (p->p_sysent->sv_errsize) {
+			error = (error < p->p_sysent->sv_errsize) ?
+			    p->p_sysent->sv_errtbl[error] : -1;
+		}
+		tf->fixreg[FIRSTARG] = error;
+		tf->cr |= 0x10000000;		/* XXX: Magic number */
+		break;
+	}
+}
+
+int
+cpu_set_user_tls(struct thread *td, void *tls_base)
+{
+
+	if (td->td_proc->p_sysent->sv_flags & SV_LP64) 
+		td->td_frame->fixreg[13] = (register_t)tls_base + 0x8000;
+	else
+		td->td_frame->fixreg[2] = (register_t)tls_base + 0x7008;
+	return (0);
+}
+



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