summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/vax/conf/GENERIC4
-rw-r--r--sys/arch/vax/conf/files.vax4
-rw-r--r--sys/compat/vax1k/files.vax1k8
-rw-r--r--sys/compat/vax1k/vax1k_exec.c145
-rw-r--r--sys/compat/vax1k/vax1k_exec.h48
-rw-r--r--sys/compat/vax1k/vax1k_subr.c96
-rw-r--r--sys/kern/exec_conf.c9
7 files changed, 309 insertions, 5 deletions
diff --git a/sys/arch/vax/conf/GENERIC b/sys/arch/vax/conf/GENERIC
index 7b523256b79..c7481304e5a 100644
--- a/sys/arch/vax/conf/GENERIC
+++ b/sys/arch/vax/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.27 2001/08/18 20:29:53 miod Exp $
+# $OpenBSD: GENERIC,v 1.28 2001/11/14 14:37:22 hugh Exp $
# $NetBSD: GENERIC,v 1.61 2000/04/19 06:50:36 itojun Exp $
machine vax # machine type; required
@@ -36,7 +36,7 @@ option WSDISPLAY_DEFAULTSCREENS=8
# Note that if COMPAT_ULTRIX is set, you lose compatibility with
# 4.3BSD Reno programs and get Ultrix compatibility instead.
# (They cannot coexist).
-#option COMPAT_VAX1K # Must be present to run pre-1.4 binaries.
+option COMPAT_VAX1K # Must be present to run old binaries.
#option COMPAT_ULTRIX
option INSN_EMULATE # CPU lacks some hardware instructions.
diff --git a/sys/arch/vax/conf/files.vax b/sys/arch/vax/conf/files.vax
index 3f42b577596..2274a84fb9a 100644
--- a/sys/arch/vax/conf/files.vax
+++ b/sys/arch/vax/conf/files.vax
@@ -1,4 +1,4 @@
-# $OpenBSD: files.vax,v 1.24 2001/05/16 22:15:18 hugh Exp $
+# $OpenBSD: files.vax,v 1.25 2001/11/14 14:37:22 hugh Exp $
# $NetBSD: files.vax,v 1.60 1999/08/27 20:04:32 ragge Exp $
#
# new style config file for vax architecture
@@ -358,7 +358,7 @@ attach asc at vsbus with asc_vsbus
file arch/vax/vsa/asc_vsbus.c asc needs-flag
include "compat/ultrix/files.ultrix"
-#include "compat/vax1k/files.vax1k"
+include "compat/vax1k/files.vax1k"
# Dom h{ra f}r vara kvar s} l{nge f}r vi se vilka vi beh|ver...
#arch/vax/vax/dkbad.c standard
diff --git a/sys/compat/vax1k/files.vax1k b/sys/compat/vax1k/files.vax1k
new file mode 100644
index 00000000000..359320c60ec
--- /dev/null
+++ b/sys/compat/vax1k/files.vax1k
@@ -0,0 +1,8 @@
+# $OpenBSD: files.vax1k,v 1.1 2001/11/14 14:37:22 hugh Exp $
+# $NetBSD: files.vax1k,v 1.1 1998/08/21 13:25:47 ragge Exp $
+#
+# Config file description for vax1k compat code. Included by
+# sys/arch/vax/conf/files.vax
+
+file compat/vax1k/vax1k_exec.c compat_vax1k
+file compat/vax1k/vax1k_subr.c compat_vax1k
diff --git a/sys/compat/vax1k/vax1k_exec.c b/sys/compat/vax1k/vax1k_exec.c
new file mode 100644
index 00000000000..a2e37b3916e
--- /dev/null
+++ b/sys/compat/vax1k/vax1k_exec.c
@@ -0,0 +1,145 @@
+/* $OpenBSD: vax1k_exec.c,v 1.1 2001/11/14 14:37:22 hugh Exp $ */
+/* $NetBSD: vax1k_exec.c,v 1.1 1998/08/21 13:25:47 ragge Exp $ */
+
+/*
+ * Copyright (c) 1993, 1994 Christopher G. Demetriou
+ * All rights reserved.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/*
+ * Exec glue to provide compatibility with older NetBSD vax1k exectuables.
+ *
+ * Because NetBSD/vax now uses 4k page size, older binaries (that started
+ * on an 1k boundary) cannot be mmap'ed. Therefore they are read in
+ * (via vn_rdwr) as OMAGIC binaries and executed. This will use a little
+ * bit more memory, but otherwise won't affect the execution speed.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/malloc.h>
+#include <sys/vnode.h>
+#include <sys/exec.h>
+#include <sys/resourcevar.h>
+
+#include <compat/vax1k/vax1k_exec.h>
+
+int exec_vax1k_prep_anymagic
+ __P((struct proc *, struct exec_package *, int));
+
+/*
+ * exec_vax1k_makecmds(): Check if it's an a.out-format executable
+ * with an vax1k magic number.
+ *
+ * Given a proc pointer and an exec package pointer, see if the referent
+ * of the epp is in a.out format. Just check 'standard' magic numbers for
+ * this architecture.
+ *
+ * This function, in the former case, or the hook, in the latter, is
+ * responsible for creating a set of vmcmds which can be used to build
+ * the process's vm space and inserting them into the exec package.
+ */
+
+int
+exec_vax1k_makecmds(p, epp)
+ struct proc *p;
+ struct exec_package *epp;
+{
+ u_long midmag, magic;
+ u_short mid;
+ int error;
+ struct exec *execp = epp->ep_hdr;
+
+ if (epp->ep_hdrvalid < sizeof(struct exec))
+ return ENOEXEC;
+
+ midmag = ntohl(execp->a_midmag);
+ mid = (midmag >> 16) & 0x3ff;
+ magic = midmag & 0xffff;
+
+ midmag = mid << 16 | magic;
+
+ switch (midmag) {
+ case (MID_VAX1K << 16) | ZMAGIC:
+ error = exec_vax1k_prep_anymagic(p, epp, 0);
+ break;
+
+ case (MID_VAX1K << 16) | NMAGIC:
+ case (MID_VAX1K << 16) | OMAGIC:
+ error = exec_vax1k_prep_anymagic(p, epp, sizeof(struct exec));
+ break;
+
+ default:
+ error = ENOEXEC;
+ }
+
+ if (error)
+ kill_vmcmds(&epp->ep_vmcmds);
+
+ return error;
+}
+
+/*
+ * exec_vax1k_prep_anymagic(): Prepare an vax1k ?MAGIC binary's exec package
+ *
+ * First, set of the various offsets/lengths in the exec package.
+ * Note that all code is mapped RW; no protection, but because it is
+ * only used for compatibility it won't hurt.
+ *
+ */
+int
+exec_vax1k_prep_anymagic(p, epp, off)
+ struct proc *p;
+ struct exec_package *epp;
+ int off;
+{
+ long etmp, tmp;
+ struct exec *execp = epp->ep_hdr;
+
+ epp->ep_taddr = execp->a_entry & ~(VAX1K_USRTEXT - 1);
+ epp->ep_tsize = execp->a_text + execp->a_data;
+ epp->ep_daddr = epp->ep_tsize + epp->ep_taddr;
+ epp->ep_dsize = execp->a_bss;
+ epp->ep_entry = execp->a_entry;
+
+ /* set up command for text segment */
+ NEW_VMCMD(&epp->ep_vmcmds, vax1k_map_readvn,
+ epp->ep_tsize, epp->ep_taddr, epp->ep_vp, off,
+ VM_PROT_WRITE|VM_PROT_READ|VM_PROT_EXECUTE);
+
+ tmp = round_page(epp->ep_daddr);
+ etmp = execp->a_bss - (tmp - epp->ep_daddr);
+
+ /* set up command for bss segment */
+ if (etmp > 0)
+ NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, etmp, tmp, NULLVP, 0,
+ VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
+
+ return exec_setup_stack(p, epp);
+}
diff --git a/sys/compat/vax1k/vax1k_exec.h b/sys/compat/vax1k/vax1k_exec.h
new file mode 100644
index 00000000000..dab327cdf53
--- /dev/null
+++ b/sys/compat/vax1k/vax1k_exec.h
@@ -0,0 +1,48 @@
+/* $OpenBSD: vax1k_exec.h,v 1.1 2001/11/14 14:37:22 hugh Exp $ */
+/* $NetBSD: vax1k_exec.h,v 1.1 1998/08/21 13:25:47 ragge Exp $ */
+
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 _VAX1K_EXEC_H_
+#define _VAX1K_EXEC_H_
+
+#define VAX1K_LDPGSZ 1024
+#define VAX1K_USRTEXT VAX1K_LDPGSZ
+
+int exec_vax1k_makecmds __P((struct proc *, struct exec_package *));
+int vax1k_map_readvn __P((struct proc *, struct exec_vmcmd *));
+#endif /* _VAX1K_EXEC_H_ */
diff --git a/sys/compat/vax1k/vax1k_subr.c b/sys/compat/vax1k/vax1k_subr.c
new file mode 100644
index 00000000000..b272219cf7f
--- /dev/null
+++ b/sys/compat/vax1k/vax1k_subr.c
@@ -0,0 +1,96 @@
+/* $OpenBSD: vax1k_subr.c,v 1.1 2001/11/14 14:37:22 hugh Exp $ */
+/* $NetBSD: vax1k_subr.c,v 1.2 1999/03/24 05:51:20 mrg Exp $ */
+
+/*
+ * Copyright (c) 1993, 1994, 1996 Christopher G. Demetriou
+ * All rights reserved.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/malloc.h>
+#include <sys/vnode.h>
+#include <sys/filedesc.h>
+#include <sys/exec.h>
+#include <sys/mman.h>
+
+#include <compat/vax1k/vax1k_exec.h>
+
+#include <uvm/uvm_extern.h>
+
+/*
+ * vax1k_map_readvn():
+ * handle vmcmd which specifies that a vnode should be read from.
+ * This is used to be able to read in and execute vax1k binaries
+ * even if the page size is bigger. (cannot mmap).
+ */
+int
+vax1k_map_readvn(p, cmd)
+ struct proc *p;
+ struct exec_vmcmd *cmd;
+{
+ vm_offset_t oaddr;
+ int error;
+
+ if (cmd->ev_len == 0)
+ return(KERN_SUCCESS); /* XXXCDC: should it happen? */
+
+ oaddr = cmd->ev_addr;
+ cmd->ev_addr = trunc_page(cmd->ev_addr); /* required by uvm_map */
+ error = uvm_map(&p->p_vmspace->vm_map, &cmd->ev_addr,
+ round_page(cmd->ev_len + (oaddr - cmd->ev_addr)),
+ NULL, UVM_UNKNOWN_OFFSET, 0,
+ UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_COPY,
+ UVM_ADV_NORMAL,
+ UVM_FLAG_FIXED|UVM_FLAG_OVERLAY|UVM_FLAG_COPYONW));
+
+ if (error)
+ return error;
+
+ error = vn_rdwr(UIO_READ, cmd->ev_vp, (caddr_t)oaddr,
+ cmd->ev_len, cmd->ev_offset, UIO_USERSPACE, IO_UNIT,
+ p->p_ucred, NULL, p);
+ if (error)
+ return error;
+
+ if (cmd->ev_prot != (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE)) {
+ /*
+ * we had to map in the area at PROT_ALL so that vn_rdwr()
+ * could write to it. however, the caller seems to want
+ * it mapped read-only, so now we are going to have to call
+ * uvm_map_protect() to fix up the protection. ICK.
+ */
+ return(uvm_map_protect(&p->p_vmspace->vm_map,
+ trunc_page(cmd->ev_addr),
+ round_page(cmd->ev_addr + cmd->ev_len),
+ cmd->ev_prot, FALSE));
+ } else {
+ return(KERN_SUCCESS);
+ }
+}
diff --git a/sys/kern/exec_conf.c b/sys/kern/exec_conf.c
index 0153a4e3c60..0af97b9e16b 100644
--- a/sys/kern/exec_conf.c
+++ b/sys/kern/exec_conf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: exec_conf.c,v 1.11 2001/09/19 13:28:43 art Exp $ */
+/* $OpenBSD: exec_conf.c,v 1.12 2001/11/14 14:37:22 hugh Exp $ */
/* $NetBSD: exec_conf.c,v 1.16 1995/12/09 05:34:47 cgd Exp $ */
/*
@@ -71,6 +71,10 @@
#include <compat/m68k4k/m68k4k_exec.h>
#endif
+#ifdef COMPAT_VAX1K
+#include <compat/vax1k/vax1k_exec.h>
+#endif
+
struct execsw execsw[] = {
#ifdef LKM
{ 0, NULL, }, /* entries for LKMs */
@@ -111,6 +115,9 @@ struct execsw execsw[] = {
#ifdef COMPAT_M68K4K
{ sizeof(struct exec), exec_m68k4k_makecmds, }, /* m68k4k a.out */
#endif
+#ifdef COMPAT_VAX1K
+ { sizeof(struct exec), exec_vax1k_makecmds, }, /* vax1k a.out */
+#endif
};
int nexecs = (sizeof execsw / sizeof(*execsw));
int exec_maxhdrsz;