Module Name: src
Committed By: rin
Date: Thu Oct 15 22:52:08 UTC 2020
Modified Files:
src/sys/arch/aarch64/aarch64: vm_machdep.c
Log Message:
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.8 -r1.9 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.8 src/sys/arch/aarch64/aarch64/vm_machdep.c:1.9
--- src/sys/arch/aarch64/aarch64/vm_machdep.c:1.8 Sat May 23 18:08:59 2020
+++ src/sys/arch/aarch64/aarch64/vm_machdep.c Thu Oct 15 22:52:08 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.8 2020/05/23 18:08:59 ryo Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.9 2020/10/15 22:52:08 rin Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,10 +29,11 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include "opt_compat_netbsd32.h"
#include "opt_ddb.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.8 2020/05/23 18:08:59 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.9 2020/10/15 22:52:08 rin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -143,11 +144,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;