From owner-svn-src-stable@FreeBSD.ORG Sat Apr 21 00:26:04 2012 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 71269106566B; Sat, 21 Apr 2012 00:26:04 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 508808FC15; Sat, 21 Apr 2012 00:26:04 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q3L0Q4iV062733; Sat, 21 Apr 2012 00:26:04 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q3L0Q4QJ062725; Sat, 21 Apr 2012 00:26:04 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201204210026.q3L0Q4QJ062725@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 21 Apr 2012 00:26:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r234520 - in stable/9: lib/libc/powerpc/gen lib/libc/powerpc64/gen sys/powerpc/powerpc X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Apr 2012 00:26:04 -0000 Author: nwhitehorn Date: Sat Apr 21 00:26:03 2012 New Revision: 234520 URL: http://svn.freebsd.org/changeset/base/234520 Log: MFC r234115: Do not restore the register holding the TLS pointer when doing various usermode context switches (long jumps and ucontext operations). If these are used across threads, multiple threads can end up with the same TLS base. Madness will then result. This makes behavior on PPC match that on x86 systems and on Linux. Modified: stable/9/lib/libc/powerpc/gen/_setjmp.S stable/9/lib/libc/powerpc/gen/setjmp.S stable/9/lib/libc/powerpc/gen/sigsetjmp.S stable/9/lib/libc/powerpc64/gen/_setjmp.S stable/9/lib/libc/powerpc64/gen/setjmp.S stable/9/lib/libc/powerpc64/gen/sigsetjmp.S stable/9/sys/powerpc/powerpc/exec_machdep.c Directory Properties: stable/9/lib/libc/ (props changed) stable/9/sys/ (props changed) Modified: stable/9/lib/libc/powerpc/gen/_setjmp.S ============================================================================== --- stable/9/lib/libc/powerpc/gen/_setjmp.S Fri Apr 20 23:40:43 2012 (r234519) +++ stable/9/lib/libc/powerpc/gen/_setjmp.S Sat Apr 21 00:26:03 2012 (r234520) @@ -63,7 +63,6 @@ ENTRY(_longjmp) lmw %r9,20(%r3) mtlr %r11 mtcr %r12 - mr %r2,%r9 mr %r1,%r10 or. %r3,%r4,%r4 bnelr Modified: stable/9/lib/libc/powerpc/gen/setjmp.S ============================================================================== --- stable/9/lib/libc/powerpc/gen/setjmp.S Fri Apr 20 23:40:43 2012 (r234519) +++ stable/9/lib/libc/powerpc/gen/setjmp.S Sat Apr 21 00:26:03 2012 (r234520) @@ -76,7 +76,6 @@ ENTRY(__longjmp) mr %r6,%r4 /* save val param */ mtlr %r11 /* r11 -> link reg */ mtcr %r12 /* r12 -> condition reg */ - mr %r2,%r9 /* r9 -> global ptr */ mr %r1,%r10 /* r10 -> stackptr */ mr %r4,%r3 li %r3,3 /* SIG_SETMASK */ Modified: stable/9/lib/libc/powerpc/gen/sigsetjmp.S ============================================================================== --- stable/9/lib/libc/powerpc/gen/sigsetjmp.S Fri Apr 20 23:40:43 2012 (r234519) +++ stable/9/lib/libc/powerpc/gen/sigsetjmp.S Sat Apr 21 00:26:03 2012 (r234520) @@ -80,7 +80,6 @@ ENTRY(siglongjmp) mr %r6,%r4 mtlr %r11 mtcr %r12 - mr %r2,%r9 mr %r1,%r10 or. %r7,%r7,%r7 beq 1f Modified: stable/9/lib/libc/powerpc64/gen/_setjmp.S ============================================================================== --- stable/9/lib/libc/powerpc64/gen/_setjmp.S Fri Apr 20 23:40:43 2012 (r234519) +++ stable/9/lib/libc/powerpc64/gen/_setjmp.S Sat Apr 21 00:26:03 2012 (r234520) @@ -86,7 +86,6 @@ ENTRY(_longjmp) ld %r10,40 + 1*8(%r3) ld %r11,40 + 2*8(%r3) ld %r12,40 + 3*8(%r3) - ld %r13,40 + 4*8(%r3) ld %r14,40 + 5*8(%r3) ld %r15,40 + 6*8(%r3) ld %r16,40 + 7*8(%r3) Modified: stable/9/lib/libc/powerpc64/gen/setjmp.S ============================================================================== --- stable/9/lib/libc/powerpc64/gen/setjmp.S Fri Apr 20 23:40:43 2012 (r234519) +++ stable/9/lib/libc/powerpc64/gen/setjmp.S Sat Apr 21 00:26:03 2012 (r234520) @@ -102,7 +102,6 @@ ENTRY(__longjmp) ld %r10,40 + 1*8(%r3) ld %r11,40 + 2*8(%r3) ld %r12,40 + 3*8(%r3) - ld %r13,40 + 4*8(%r3) ld %r14,40 + 5*8(%r3) ld %r15,40 + 6*8(%r3) ld %r16,40 + 7*8(%r3) Modified: stable/9/lib/libc/powerpc64/gen/sigsetjmp.S ============================================================================== --- stable/9/lib/libc/powerpc64/gen/sigsetjmp.S Fri Apr 20 23:40:43 2012 (r234519) +++ stable/9/lib/libc/powerpc64/gen/sigsetjmp.S Sat Apr 21 00:26:03 2012 (r234520) @@ -103,7 +103,6 @@ ENTRY(siglongjmp) ld %r10,40 + 1*8(%r3) ld %r11,40 + 2*8(%r3) ld %r12,40 + 3*8(%r3) - ld %r13,40 + 4*8(%r3) ld %r14,40 + 5*8(%r3) ld %r15,40 + 6*8(%r3) ld %r16,40 + 7*8(%r3) Modified: stable/9/sys/powerpc/powerpc/exec_machdep.c ============================================================================== --- stable/9/sys/powerpc/powerpc/exec_machdep.c Fri Apr 20 23:40:43 2012 (r234519) +++ stable/9/sys/powerpc/powerpc/exec_machdep.c Sat Apr 21 00:26:03 2012 (r234520) @@ -441,6 +441,7 @@ set_mcontext(struct thread *td, const mc { struct pcb *pcb; struct trapframe *tf; + register_t tls; pcb = td->td_pcb; tf = td->td_frame; @@ -448,16 +449,25 @@ set_mcontext(struct thread *td, const mc if (mcp->mc_vers != _MC_VERSION || mcp->mc_len != sizeof(*mcp)) return (EINVAL); - #ifdef AIM +#ifdef AIM /* * Don't let the user set privileged MSR bits */ if ((mcp->mc_srr1 & PSL_USERSTATIC) != (tf->srr1 & PSL_USERSTATIC)) { return (EINVAL); } - #endif +#endif + /* Copy trapframe, preserving TLS pointer across context change */ + if (SV_PROC_FLAG(td->td_proc, SV_LP64)) + tls = tf->fixreg[13]; + else + tls = tf->fixreg[2]; memcpy(tf, mcp->mc_frame, sizeof(mcp->mc_frame)); + if (SV_PROC_FLAG(td->td_proc, SV_LP64)) + tf->fixreg[13] = tls; + else + tf->fixreg[2] = tls; #ifdef AIM if (mcp->mc_flags & _MC_FP_VALID) {