svn commit: r341177 - head/sys/powerpc/powerpc
Konstantin Belousov
kostikbel at gmail.com
Thu Nov 29 10:56:38 UTC 2018
On Thu, Nov 29, 2018 at 03:39:11AM +0000, Justin Hibbits wrote:
> 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) {
I recommend you to not do this, instead add a new sv_flag to indicate
ELFv2 for PPC. We already have almost machine-specific flags like ia32.
> + 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
> }
More information about the svn-src-all
mailing list