From owner-svn-src-projects@FreeBSD.ORG Mon Feb 1 01:06:37 2010 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 350E31065676; Mon, 1 Feb 2010 01:06:37 +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 239858FC1B; Mon, 1 Feb 2010 01:06:37 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o1116bVb092419; Mon, 1 Feb 2010 01:06:37 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o1116bTJ092416; Mon, 1 Feb 2010 01:06:37 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201002010106.o1116bTJ092416@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 1 Feb 2010 01:06:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r203332 - in projects/ppc64/lib/libc/powerpc64: . sys X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 01 Feb 2010 01:06:37 -0000 Author: nwhitehorn Date: Mon Feb 1 01:06:36 2010 New Revision: 203332 URL: http://svn.freebsd.org/changeset/base/203332 Log: Restoration of the TOC value is done by a linker-rewritten nop after branch instructions. Setting of the TOC is done by a linker-written trampoline, and the old value stored in the stack. If two TOC-based function calls were made back-to-back with the same stack frame, this resulted in corruption of the TOC pointer. This happened predominently with cerror, so fix some additional bugs here. With these changes, all dynamically linked executables seem to work, given LD_BIND_NOW. Next up: fix lazy PLT loading. Modified: projects/ppc64/lib/libc/powerpc64/SYS.h projects/ppc64/lib/libc/powerpc64/sys/cerror.S Modified: projects/ppc64/lib/libc/powerpc64/SYS.h ============================================================================== --- projects/ppc64/lib/libc/powerpc64/SYS.h Mon Feb 1 00:13:30 2010 (r203331) +++ projects/ppc64/lib/libc/powerpc64/SYS.h Mon Feb 1 01:06:36 2010 (r203332) @@ -42,8 +42,15 @@ #define SYSCALL(x) \ .text; \ .align 2; \ -2: b PIC_PLT(CNAME(HIDENAME(cerror))); \ +2: mflr %r0; \ + std %r0,16(%r1); \ + stdu %r1,-48(%r1); \ + bl PIC_PLT(CNAME(HIDENAME(cerror))); \ nop; \ + addi %r1,%r1,48; \ + ld %r0,16(%r1); \ + mtlr %r0; \ + blr; \ ENTRY(__CONCAT(__sys_,x)); \ .weak CNAME(x); \ .set CNAME(x),CNAME(__CONCAT(__sys_,x)); \ @@ -66,14 +73,19 @@ ENTRY(__CONCAT(__sys_,x)); \ .set CNAME(__CONCAT(._,x)),CNAME(__CONCAT(.__sys_,x));\ _SYSCALL(x); \ bnslr; \ - b PIC_PLT(CNAME(HIDENAME(cerror))); \ - nop + mflr %r0; \ + std %r0,16(%r1); \ + stdu %r1,-48(%r1); \ + bl PIC_PLT(CNAME(HIDENAME(cerror))); \ + nop; \ + addi %r1,%r1,48; \ + ld %r0,16(%r1); \ + mtlr %r0; \ + blr; #define RSYSCALL(x) \ .text; \ .align 2; \ -2: b PIC_PLT(CNAME(HIDENAME(cerror))); \ - nop; \ ENTRY(__CONCAT(__sys_,x)); \ .weak CNAME(x); \ .set CNAME(x),CNAME(__CONCAT(__sys_,x)); \ @@ -85,5 +97,13 @@ ENTRY(__CONCAT(__sys_,x)); \ .set CNAME(__CONCAT(._,x)),CNAME(__CONCAT(.__sys_,x));\ _SYSCALL(x); \ bnslr; \ - b PIC_PLT(CNAME(HIDENAME(cerror))); \ - nop + \ + mflr %r0; \ + std %r0,16(%r1); \ + stdu %r1,-48(%r1); \ + bl PIC_PLT(CNAME(HIDENAME(cerror))); \ + nop; \ + addi %r1,%r1,48; \ + ld %r0,16(%r1); \ + mtlr %r0; \ + blr; Modified: projects/ppc64/lib/libc/powerpc64/sys/cerror.S ============================================================================== --- projects/ppc64/lib/libc/powerpc64/sys/cerror.S Mon Feb 1 00:13:30 2010 (r203331) +++ projects/ppc64/lib/libc/powerpc64/sys/cerror.S Mon Feb 1 01:06:36 2010 (r203332) @@ -40,19 +40,21 @@ __FBSDID("$FreeBSD$"); */ ENTRY(HIDENAME(cerror)) mflr %r0 + std %r0,16(%r1) /* save lr */ stdu %r1,-56(%r1) /* allocate new stack frame */ - std %r0,16(%r1) /* and save lr, r31 */ std %r31,48(%r1) + mr %r31,%r3 /* stash errval in callee-saved register */ bl PIC_PLT(CNAME(__error)) nop - std %r31,0(%r3) /* store errval into &errno */ - ld %r0,16(%r1) + stw %r31,0(%r3) /* store errval into &errno */ + ld %r31,48(%r1) - mtlr %r0 ld %r1,0(%r1) + ld %r0,16(%r1) + mtlr %r0 li %r3,-1 li %r4,-1 - blr /* return to callers caller */ + blr