From owner-svn-src-all@freebsd.org Thu Jan 18 07:42:52 2018 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7C4C2EBABC3; Thu, 18 Jan 2018 07:42:52 +0000 (UTC) (envelope-from wma@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 5736A7E52F; Thu, 18 Jan 2018 07:42:52 +0000 (UTC) (envelope-from wma@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 94AD61B7EE; Thu, 18 Jan 2018 07:42:51 +0000 (UTC) (envelope-from wma@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w0I7gpPb058440; Thu, 18 Jan 2018 07:42:51 GMT (envelope-from wma@FreeBSD.org) Received: (from wma@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w0I7gpav058438; Thu, 18 Jan 2018 07:42:51 GMT (envelope-from wma@FreeBSD.org) Message-Id: <201801180742.w0I7gpav058438@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: wma set sender to wma@FreeBSD.org using -f From: Wojciech Macek Date: Thu, 18 Jan 2018 07:42:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r328112 - head/sys/powerpc/powerpc X-SVN-Group: head X-SVN-Commit-Author: wma X-SVN-Commit-Paths: head/sys/powerpc/powerpc X-SVN-Commit-Revision: 328112 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Jan 2018 07:42:52 -0000 Author: wma Date: Thu Jan 18 07:42:51 2018 New Revision: 328112 URL: https://svnweb.freebsd.org/changeset/base/328112 Log: PPC64: fix TOC behavior on process initialization Set stack pointer to correct value after thread's stack pointer restore Restoring new thread's stack pointer caused stack corruption because restored stack pointer didn't point to callee (cpu_switch) stack frame but caller stack frame. As a result we had mysterious errors in caller function (sched_switch). Solution: simply set stack pointer to correct value Also, initialize TOC to a valid pointer once the thread is being created. Created by: Patryk Duda Submitted by: Wojciech Macek Obtained from: Semihalf Reviewed by: nwhitehorn Differential revision: https://reviews.freebsd.org/D13947 Sponsored by: QCM Technologies Modified: head/sys/powerpc/powerpc/swtch64.S head/sys/powerpc/powerpc/vm_machdep.c Modified: head/sys/powerpc/powerpc/swtch64.S ============================================================================== --- head/sys/powerpc/powerpc/swtch64.S Thu Jan 18 07:41:04 2018 (r328111) +++ head/sys/powerpc/powerpc/swtch64.S Thu Jan 18 07:42:51 2018 (r328112) @@ -160,6 +160,7 @@ blocked_loop: ld %r17,TD_PCB(%r13) /* Get new PCB */ ld %r1,PCB_SP(%r17) /* Load the stack pointer */ + addi %r1,%r1,-48 /* Remember about cpu_switch stack frame */ /* Release old thread now that we have a stack pointer set up */ cmpdi %r14,0 Modified: head/sys/powerpc/powerpc/vm_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/vm_machdep.c Thu Jan 18 07:41:04 2018 (r328111) +++ head/sys/powerpc/powerpc/vm_machdep.c Thu Jan 18 07:42:51 2018 (r328112) @@ -190,6 +190,9 @@ cpu_fork_kthread_handler(struct thread *td, void (*fun cf = (struct callframe *)td->td_pcb->pcb_sp; + #if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1) + cf->cf_toc = ((register_t *)func)[1]; + #endif cf->cf_func = (register_t)func; cf->cf_arg0 = (register_t)arg; }