From owner-svn-src-all@freebsd.org Thu Nov 29 03:39:12 2018 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 28454114C017; Thu, 29 Nov 2018 03:39:12 +0000 (UTC) (envelope-from jhibbits@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 B8AE57080F; Thu, 29 Nov 2018 03:39:11 +0000 (UTC) (envelope-from jhibbits@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 9986C13F6B; Thu, 29 Nov 2018 03:39:11 +0000 (UTC) (envelope-from jhibbits@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id wAT3dBZ3027973; Thu, 29 Nov 2018 03:39:11 GMT (envelope-from jhibbits@FreeBSD.org) Received: (from jhibbits@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id wAT3dBqf027972; Thu, 29 Nov 2018 03:39:11 GMT (envelope-from jhibbits@FreeBSD.org) Message-Id: <201811290339.wAT3dBqf027972@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jhibbits set sender to jhibbits@FreeBSD.org using -f From: Justin Hibbits Date: Thu, 29 Nov 2018 03:39:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r341177 - head/sys/powerpc/powerpc X-SVN-Group: head X-SVN-Commit-Author: jhibbits X-SVN-Commit-Paths: head/sys/powerpc/powerpc X-SVN-Commit-Revision: 341177 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: B8AE57080F X-Spamd-Result: default: False [1.19 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_SPAM_SHORT(0.48)[0.478,0]; NEURAL_SPAM_MEDIUM(0.25)[0.247,0]; NEURAL_SPAM_LONG(0.47)[0.465,0] X-Rspamd-Server: mx1.freebsd.org X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 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, 29 Nov 2018 03:39:12 -0000 Author: jhibbits Date: Thu Nov 29 03:39:11 2018 New Revision: 341177 URL: https://svnweb.freebsd.org/changeset/base/341177 Log: Fix thread creation in PowerPC64 ELFv2 processes. Summary: Currently, the upcall used to create threads assumes ELFv1. Instead, we should check which sysentvec is in use on the process and act accordingly. This makes ELFv2 threaded processes work. Submitted by: git_bdragon.rtk0.net Differential Revision: https://reviews.freebsd.org/D18330 Modified: head/sys/powerpc/powerpc/exec_machdep.c Modified: head/sys/powerpc/powerpc/exec_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/exec_machdep.c Thu Nov 29 02:52:08 2018 (r341176) +++ head/sys/powerpc/powerpc/exec_machdep.c Thu Nov 29 03:39:11 2018 (r341177) @@ -124,6 +124,10 @@ static int grab_mcontext32(struct thread *td, mcontext static int grab_mcontext(struct thread *, mcontext_t *, int); +#ifdef __powerpc64__ +extern struct sysentvec elf64_freebsd_sysvec_v2; +#endif + void sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) { @@ -1014,11 +1018,18 @@ cpu_set_upcall(struct thread *td, void (*entry)(void * #endif } else { #ifdef __powerpc64__ - register_t entry_desc[3]; - (void)copyin((void *)entry, entry_desc, sizeof(entry_desc)); - tf->srr0 = entry_desc[0]; - tf->fixreg[2] = entry_desc[1]; - tf->fixreg[11] = entry_desc[2]; + if (td->td_proc->p_sysent == &elf64_freebsd_sysvec_v2) { + tf->srr0 = (register_t)entry; + /* ELFv2 ABI requires that the global entry point be in r12. */ + tf->fixreg[12] = (register_t)entry; + } + else { + register_t entry_desc[3]; + (void)copyin((void *)entry, entry_desc, sizeof(entry_desc)); + tf->srr0 = entry_desc[0]; + tf->fixreg[2] = entry_desc[1]; + tf->fixreg[11] = entry_desc[2]; + } tf->srr1 = psl_userset | PSL_FE_DFLT; #endif }