Module Name:    src
Committed By:   matt
Date:           Fri Aug  3 07:59:23 UTC 2012

Modified Files:
        src/sys/arch/arm/arm32: vm_machdep.c
        src/sys/arch/arm/conf: files.arm
        src/sys/arch/arm/include: elf_machdep.h mcontext.h param.h types.h
Added Files:
        src/sys/arch/arm/arm: cpu_exec.c
        src/sys/arch/arm/arm32: netbsd32_machdep.c
        src/sys/arch/arm/include: netbsd32_machdep.h

Log Message:
COMPAT_NETBSD32 support for ARM.  Which is strange since ARM is already
32-bits.  But the newer ARM ABI AAPCS changes the alignment of 64-bit
fields so structures need to copied in and out to deal with the alignment
change.  This is a kludge but makes debugging of AAPCS support much easier.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/arm/cpu_exec.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/arm32/netbsd32_machdep.c
cvs rdiff -u -r1.56 -r1.57 src/sys/arch/arm/arm32/vm_machdep.c
cvs rdiff -u -r1.106 -r1.107 src/sys/arch/arm/conf/files.arm
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/include/elf_machdep.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/include/mcontext.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/include/netbsd32_machdep.h
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/include/param.h
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/arm/include/types.h

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/arm/arm32/vm_machdep.c
diff -u src/sys/arch/arm/arm32/vm_machdep.c:1.56 src/sys/arch/arm/arm32/vm_machdep.c:1.57
--- src/sys/arch/arm/arm32/vm_machdep.c:1.56	Sun Feb 19 21:06:05 2012
+++ src/sys/arch/arm/arm32/vm_machdep.c	Fri Aug  3 07:59:22 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.56 2012/02/19 21:06:05 rmind Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.57 2012/08/03 07:59:22 matt Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.56 2012/02/19 21:06:05 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.57 2012/08/03 07:59:22 matt Exp $");
 
 #include "opt_armfpe.h"
 #include "opt_pmap_debug.h"
@@ -184,10 +184,11 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 	*tf = *pcb1->pcb_tf;
 
 	/*
-	 * If specified, give the child a different stack.
+	 * If specified, give the child a different stack (make sure
+	 * it's 8-byte aligned).
 	 */
 	if (stack != NULL)
-		tf->tf_usr_sp = (u_int)stack + stacksize;
+		tf->tf_usr_sp = ((vaddr_t)(stack) + stacksize) & -8;
 
 	sf = (struct switchframe *)tf - 1;
 	sf->sf_r4 = (u_int)func;

Index: src/sys/arch/arm/conf/files.arm
diff -u src/sys/arch/arm/conf/files.arm:1.106 src/sys/arch/arm/conf/files.arm:1.107
--- src/sys/arch/arm/conf/files.arm:1.106	Sat Jul 21 12:19:15 2012
+++ src/sys/arch/arm/conf/files.arm	Fri Aug  3 07:59:22 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: files.arm,v 1.106 2012/07/21 12:19:15 skrll Exp $
+#	$NetBSD: files.arm,v 1.107 2012/08/03 07:59:22 matt Exp $
 
 # temporary define to allow easy moving to ../arch/arm/arm32
 defflag				ARM32
@@ -150,6 +150,7 @@ file	arch/arm/arm/cpufunc_asm_xscale.S	c
 						    cpu_cortex
 file	arch/arm/arm/cpufunc_asm_ixp12x0.S	cpu_ixp12x0
 file	arch/arm/arm/cpufunc_asm_sheeva.S	cpu_sheeva
+file	arch/arm/arm/cpu_exec.c
 file	arch/arm/arm/fusu.S
 file	arch/arm/arm/idle_machdep.c
 file	arch/arm/arm/lock_cas.S
@@ -187,6 +188,10 @@ file	arch/arm/arm32/cortex_pmc.c		cortex
 # arm32 library functions
 file	arch/arm/arm32/bcopy_page.S		arm32
 
+#
+include "compat/netbsd32/files.netbsd32"
+file	arch/arm/arm32/netbsd32_machdep.c	arm32 & compat_netbsd32
+
 # Linux binary compatibility (COMPAT_LINUX)
 include "compat/ossaudio/files.ossaudio"
 include "compat/linux/files.linux"

Index: src/sys/arch/arm/include/elf_machdep.h
diff -u src/sys/arch/arm/include/elf_machdep.h:1.8 src/sys/arch/arm/include/elf_machdep.h:1.9
--- src/sys/arch/arm/include/elf_machdep.h:1.8	Sat May 30 05:56:52 2009
+++ src/sys/arch/arm/include/elf_machdep.h	Fri Aug  3 07:59:23 2012
@@ -1,4 +1,7 @@
-/*	$NetBSD: elf_machdep.h,v 1.8 2009/05/30 05:56:52 skrll Exp $	*/
+/*	$NetBSD: elf_machdep.h,v 1.9 2012/08/03 07:59:23 matt Exp $	*/
+
+#ifndef _ARM_ELF_MACHDEP_H_
+#define _ARM_ELF_MACHDEP_H_
 
 #if defined(__ARMEB__)
 #define ELF32_MACHDEP_ENDIANNESS	ELFDATA2MSB
@@ -115,3 +118,16 @@
 
 /* Processor specific symbol types */
 #define STT_ARM_TFUNC		STT_LOPROC
+
+#ifdef _KERNEL
+#ifdef ELFSIZE
+#define	ELF_MD_PROBE_FUNC	ELFNAME2(arm_netbsd,probe)
+#endif
+
+struct exec_package;
+
+int arm_netbsd_elf32_probe(struct lwp *, struct exec_package *, void *, char *,
+	vaddr_t *);
+#endif
+
+#endif /* _ARM_ELF_MACHDEP_H_ */

Index: src/sys/arch/arm/include/mcontext.h
diff -u src/sys/arch/arm/include/mcontext.h:1.10 src/sys/arch/arm/include/mcontext.h:1.11
--- src/sys/arch/arm/include/mcontext.h:1.10	Mon Feb 13 17:07:45 2012
+++ src/sys/arch/arm/include/mcontext.h	Fri Aug  3 07:59:23 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.10 2012/02/13 17:07:45 matt Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.11 2012/08/03 07:59:23 matt Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -88,7 +88,7 @@ typedef struct {
 		__vfpregset_t __vfpregs;
 	} __fpu;
 	__greg_t	_mc_tlsbase;
-} mcontext_t;
+} mcontext_t, mcontext32_t;
 
 /* Machine-dependent uc_flags */
 #define	_UC_ARM_VFP	0x00010000	/* FPU field is VFP */

Index: src/sys/arch/arm/include/param.h
diff -u src/sys/arch/arm/include/param.h:1.15 src/sys/arch/arm/include/param.h:1.16
--- src/sys/arch/arm/include/param.h:1.15	Tue Jan 24 20:03:36 2012
+++ src/sys/arch/arm/include/param.h	Fri Aug  3 07:59:23 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: param.h,v 1.15 2012/01/24 20:03:36 christos Exp $	*/
+/*	$NetBSD: param.h,v 1.16 2012/08/03 07:59:23 matt Exp $	*/
 
 /*
  * Copyright (c) 1994,1995 Mark Brinicombe.
@@ -81,6 +81,7 @@
 
 /* ARM-specific macro to align a stack pointer (downwards). */
 #define STACK_ALIGNBYTES	(8 - 1)
+#define	ALIGNBYTES32	3
 
 #define	DEV_BSHIFT	9		/* log2(DEV_BSIZE) */
 #define	DEV_BSIZE	(1 << DEV_BSHIFT)

Index: src/sys/arch/arm/include/types.h
diff -u src/sys/arch/arm/include/types.h:1.21 src/sys/arch/arm/include/types.h:1.22
--- src/sys/arch/arm/include/types.h:1.21	Fri Nov 18 16:10:02 2011
+++ src/sys/arch/arm/include/types.h	Fri Aug  3 07:59:23 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: types.h,v 1.21 2011/11/18 16:10:02 joerg Exp $	*/
+/*	$NetBSD: types.h,v 1.22 2012/08/03 07:59:23 matt Exp $	*/
 
 /*
  * Copyright (c) 1990 The Regents of the University of California.
@@ -61,7 +61,7 @@ typedef unsigned long	vsize_t;
 #define	PRIuVSIZE	"lu"
 #endif
 
-typedef int		register_t;
+typedef int		register_t, register32_t;
 #define	PRIxREGISTER	"x"
 
 typedef unsigned long	pmc_evid_t;

Added files:

Index: src/sys/arch/arm/arm/cpu_exec.c
diff -u /dev/null src/sys/arch/arm/arm/cpu_exec.c:1.1
--- /dev/null	Fri Aug  3 07:59:23 2012
+++ src/sys/arch/arm/arm/cpu_exec.c	Fri Aug  3 07:59:22 2012
@@ -0,0 +1,93 @@
+/*	$NetBSD: cpu_exec.c,v 1.1 2012/08/03 07:59:22 matt Exp $	*/
+
+/*-
+ * Copyright (c) 2012 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: cpu_exec.c,v 1.1 2012/08/03 07:59:22 matt Exp $");
+
+#include "opt_compat_netbsd.h"
+#include "opt_compat_netbsd32.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/exec.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <compat/common/compat_util.h>
+#include <sys/exec_elf.h>			/* mandatory */
+
+#ifdef COMPAT_NETBSD32
+#include <compat/netbsd32/netbsd32_exec.h>
+#endif
+
+#if EXEC_ELF32
+int
+arm_netbsd_elf32_probe(struct lwp *l, struct exec_package *epp, void *eh0,
+	char *itp, vaddr_t *start_p)
+{
+	const char *itp_suffix = NULL;
+	const bool elf_aapcs_p = (epp->ep_flags & EXEC_ARM_AAPCS) != 0;
+#ifdef COMPAT_NETBSD32
+	const bool netbsd32_p = (epp->ep_esch->es_emul == &emul_netbsd32);
+#else
+	const bool netbsd32_p = false;
+#endif
+#ifdef __ARM_EABI__
+	const bool aapcs_p = true;
+#else
+	const bool aapcs_p = false;
+#endif
+
+	/*
+	 * This is subtle.  If are netbsd32, then we don't want to match the
+	 * same ABI as the kernel.  If we aren't (netbsd32 == false), then we
+	 * don't want to be different from the kernel's ABI.
+	 *    true   true   true  ENOEXEC
+	 *    true   false  true  0
+	 *    true   true   false 0
+	 *    true   false  false ENOEXEC
+	 *    false  true   true  0
+	 *    false  false  true  ENOEXEC
+	 *    false  true   false ENOEXEC
+	 *    false  false  false 0
+	 */
+	if (netbsd32_p ^ elf_aapcs_p ^ aapcs_p)
+		return ENOEXEC;
+
+	if (netbsd32_p)
+		itp_suffix = (elf_aapcs_p) ? "eabi" : "apcs32";
+
+	if (itp_suffix != NULL)
+		(void)compat_elf_check_interp(epp, itp, itp_suffix);
+	return 0;
+}
+#endif

Index: src/sys/arch/arm/arm32/netbsd32_machdep.c
diff -u /dev/null src/sys/arch/arm/arm32/netbsd32_machdep.c:1.1
--- /dev/null	Fri Aug  3 07:59:23 2012
+++ src/sys/arch/arm/arm32/netbsd32_machdep.c	Fri Aug  3 07:59:22 2012
@@ -0,0 +1,96 @@
+/*-
+ * Copyright (c) 2012 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+__KERNEL_RCSID(1, "$NetBSD: netbsd32_machdep.c,v 1.1 2012/08/03 07:59:22 matt Exp $");
+
+#include <sys/param.h>
+#include <sys/core.h>
+#include <sys/exec.h>
+#include <sys/lwp.h>
+#include <sys/signalvar.h>
+#include <sys/syscallargs.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <compat/netbsd32/netbsd32.h>
+#include <compat/netbsd32/netbsd32_exec.h>
+#include <compat/netbsd32/netbsd32_syscallargs.h>
+
+const char machine32[] = MACHINE;
+const char machine_arch32[] = MACHINE_ARCH;
+
+int
+cpu_coredump32(struct lwp *l, void *iocookie, struct core32 *chdr)
+{
+	return cpu_coredump(l, iocookie, (struct core *)chdr);
+}
+
+void
+netbsd32_sendsig (const ksiginfo_t *ksi, const sigset_t *ss)
+{
+	sendsig(ksi, ss);
+}
+
+void
+startlwp32(void *arg)
+{
+	startlwp(arg);
+}
+
+int
+cpu_mcontext32_validate(struct lwp *l, const mcontext32_t *mcp)
+{
+	return cpu_mcontext_validate(l, mcp);
+}
+void
+cpu_getmcontext32(struct lwp *l, mcontext32_t *mcp, unsigned int *flagsp)
+{
+	cpu_getmcontext(l, mcp, flagsp);
+}
+
+int
+cpu_setmcontext32(struct lwp *l, const mcontext32_t *mcp, unsigned int flags)
+{
+	return cpu_setmcontext(l, mcp, flags);
+}
+
+int
+netbsd32_sysarch(struct lwp *l, const struct netbsd32_sysarch_args *uap,
+	register_t *retval)
+{
+	return sys_sysarch(l, (const struct sys_sysarch_args *)uap, retval);
+}
+
+vaddr_t
+netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size)
+{
+	return VM_DEFAULT_ADDRESS(base, size);
+}

Index: src/sys/arch/arm/include/netbsd32_machdep.h
diff -u /dev/null src/sys/arch/arm/include/netbsd32_machdep.h:1.1
--- /dev/null	Fri Aug  3 07:59:23 2012
+++ src/sys/arch/arm/include/netbsd32_machdep.h	Fri Aug  3 07:59:23 2012
@@ -0,0 +1,69 @@
+/*	$NetBSD: netbsd32_machdep.h,v 1.1 2012/08/03 07:59:23 matt Exp $	*/
+
+/*-
+ * Copyright (c) 2012 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas <[email protected]>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _ARM_NETBSD32_H_
+#define _ARM_NETBSD32_H_
+
+#include <sys/types.h>
+
+#define	NETBSD32_POINTER_TYPE			uint32_t
+typedef struct { NETBSD32_POINTER_TYPE i32; }	netbsd32_pointer_t;
+
+#ifdef __ARM_EABI__
+#define NETBSD32_INT64_ALIGN			__attribute__((__aligned__(4)))
+#else
+#define NETBSD32_INT64_ALIGN			__attribute__((__aligned__(8)))
+#endif
+
+typedef netbsd32_pointer_t			netbsd32_sigcontextp_t;
+
+/*
+ * The sigcode is ABI neutral.
+ */
+#define	netbsd32_sigcode			sigcode
+#define	netbsd32_esigcode			esigcode
+
+/*
+ * Note: syscall_intern and setregs do not care about COMPAT_NETBSD32.
+ */
+#define	netbsd32_syscall_intern			syscall_intern
+#define	netbsd32_setregs			setregs
+
+#define	VM_MAXUSER_ADDRESS32	VM_MAXUSER_ADDRESS
+#define	NETBSD32_MID_MACHINE	MID_MACHINE
+#define	USRSTACK32		USRSTACK
+#define	MAXTSIZ32		MAXTSIZ
+#define	DFLDSIZ32		DFLDSIZ		
+#define	MAXDSIZ32		MAXDSIZ	
+#define	DFLSSIZ32		DFLSSIZ		
+#define	MAXSSIZ32		MAXSSIZ		
+
+#endif /* _ARM_NETBSD32_H_ */

Reply via email to