Module Name: src Committed By: martin Date: Fri Jan 1 13:06:39 UTC 2021
Modified Files: src/sys/arch/aarch64/aarch64 [netbsd-9]: vm_machdep.c Log Message: Pull up following revision(s) (requested by rin in ticket #1174): sys/arch/aarch64/aarch64/vm_machdep.c: revision 1.9 (patch) Fix clone(2) for COMPAT_NETBSD32. (1) Set r13 (sp for arm32 processes) appropriately when stack is specified to fork1(). (2) For arm32 processes, align stack to 8-byte boundary, instead of 16-byte for native aarch64 processes, to match our 32-bit ABI: https://nxr.netbsd.org/xref/src/sys/arch/arm/arm32/vm_machdep.c#150 Note that sp alignment checking is disabled in aarch32 mode, and this works fine with AARCH64_EL0_STACK_ALIGNMENT_CHECK option. OK ryo To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.5.4.1 src/sys/arch/aarch64/aarch64/vm_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/aarch64/aarch64/vm_machdep.c diff -u src/sys/arch/aarch64/aarch64/vm_machdep.c:1.5 src/sys/arch/aarch64/aarch64/vm_machdep.c:1.5.4.1 --- src/sys/arch/aarch64/aarch64/vm_machdep.c:1.5 Thu Dec 27 09:55:27 2018 +++ src/sys/arch/aarch64/aarch64/vm_machdep.c Fri Jan 1 13:06:39 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_machdep.c,v 1.5 2018/12/27 09:55:27 mrg Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.5.4.1 2021/01/01 13:06:39 martin Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -29,8 +29,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "opt_compat_netbsd32.h" + #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.5 2018/12/27 09:55:27 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.5.4.1 2021/01/01 13:06:39 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -116,11 +118,19 @@ cpu_lwp_fork(struct lwp *l1, struct lwp *utf = *l1->l_md.md_utf; /* - * If specified, give the child a different stack - * (make sure it's 16-byte aligned). + * If specified, give the child a different stack (make sure it's + * 16- or 8-byte aligned for 64- or 32-bit processes, respectively). */ - if (stack != NULL) - utf->tf_sp = ((vaddr_t)(stack) + stacksize) & -16; + if (stack != NULL) { + utf->tf_sp = (vaddr_t)(stack) + stacksize; +#ifdef COMPAT_NETBSD32 + if (__predict_false(l2->l_proc->p_flag & PK_32)) { + utf->tf_sp &= -8; + utf->tf_reg[13] = utf->tf_sp; + } else +#endif + utf->tf_sp &= -16; + } /* build a new switchframe */ struct trapframe * const ktf = utf - 1;