Modernize OpenBSD/mvme68k to match various changes in m68k and hp300 code.
authordownsj <downsj@openbsd.org>
Mon, 31 Mar 1997 00:23:50 +0000 (00:23 +0000)
committerdownsj <downsj@openbsd.org>
Mon, 31 Mar 1997 00:23:50 +0000 (00:23 +0000)
Compiles, but untested for lack of hardware.

30 files changed:
sys/arch/mvme68k/conf/GENERIC
sys/arch/mvme68k/conf/MINIROOT
sys/arch/mvme68k/conf/MVME147
sys/arch/mvme68k/conf/MVME162
sys/arch/mvme68k/conf/MVME167
sys/arch/mvme68k/conf/Makefile.mvme68k
sys/arch/mvme68k/conf/X
sys/arch/mvme68k/conf/files.mvme68k
sys/arch/mvme68k/include/autoconf.h
sys/arch/mvme68k/include/cdefs.h
sys/arch/mvme68k/include/cpu.h
sys/arch/mvme68k/include/disklabel.h
sys/arch/mvme68k/include/exec.h
sys/arch/mvme68k/include/float.h
sys/arch/mvme68k/include/hpux_machdep.h [new file with mode: 0644]
sys/arch/mvme68k/include/nvram.h
sys/arch/mvme68k/include/param.h
sys/arch/mvme68k/include/pcb.h
sys/arch/mvme68k/include/pmap.h
sys/arch/mvme68k/include/proc.h
sys/arch/mvme68k/include/pte.h
sys/arch/mvme68k/include/reg.h
sys/arch/mvme68k/include/types.h
sys/arch/mvme68k/mvme68k/genassym.c [deleted file]
sys/arch/mvme68k/mvme68k/genassym.cf [new file with mode: 0644]
sys/arch/mvme68k/mvme68k/hpux_machdep.c [new file with mode: 0644]
sys/arch/mvme68k/mvme68k/locore.s
sys/arch/mvme68k/mvme68k/machdep.c
sys/arch/mvme68k/mvme68k/trap.c
sys/arch/mvme68k/mvme68k/vm_machdep.c

index 8c79303..ba6d581 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: GENERIC,v 1.8 1996/06/30 17:39:38 deraadt Exp $
+#      $OpenBSD: GENERIC,v 1.9 1997/03/31 00:23:50 downsj Exp $
 
 machine                mvme68k m68k
 
@@ -8,7 +8,6 @@ include "../../../conf/GENERIC"
 option         M68040          # support for 040
 option         FPSP            # MC68040 floating point support
 option         M68030          # support for 030
-option         FPCOPROC        # Support for MC6888[12] (Required)
 
 option         MVME147         # (requires M68030)
 option         MVME162         # (requires M68040, FPSP)
@@ -16,6 +15,8 @@ option                MVME167         # includes 166 (requires M68040, FPSP)
 #option                MVME177         # (requires M68060, ...)
 
 option         COMPAT_SUNOS
+option         COMPAT_HPUX
+option         COMPAT_M68K4K
 
 maxusers       32
 
index 5b7e189..403ec14 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: MINIROOT,v 1.1 1997/02/16 03:19:53 rahnds Exp $
+#      $OpenBSD: MINIROOT,v 1.2 1997/03/31 00:23:51 downsj Exp $
 
 machine                mvme68k m68k
 
@@ -8,7 +8,6 @@ include "../../../conf/GENERIC"
 option         M68040          # support for 040
 option         FPSP            # MC68040 floating point support
 option         M68030          # support for 030
-option         FPCOPROC        # Support for MC6888[12] (Required)
 
 option         MVME147         # (requires M68030)
 option         MVME162         # (requires M68040, FPSP)
@@ -16,6 +15,8 @@ option                MVME167         # includes 166 (requires M68040, FPSP)
 #option                MVME177         # (requires M68060, ...)
 
 #option                COMPAT_SUNOS
+#option                COMPAT_HPUX
+#option                COMPAT_M68K4K
 
 maxusers       32
 
index 5f92eb1..c552040 100644 (file)
@@ -1,11 +1,10 @@
-#      $OpenBSD: MVME147,v 1.9 1996/09/20 06:45:14 deraadt Exp $
+#      $OpenBSD: MVME147,v 1.10 1997/03/31 00:23:52 downsj Exp $
 
 machine                mvme68k m68k
 
 #option                "M68040"        # support for 040
 #option                FPSP            # MC68040 floating point support
 option         "M68030"        # support for 030
-option         FPCOPROC        # Support for MC6888[12] (Required)
 
 option         MVME147         # (requires M68030)
 #option                MVME162         # (requires M68040)
index 98bb0bf..cf3ec08 100644 (file)
@@ -1,11 +1,10 @@
-#      $OpenBSD: MVME162,v 1.9 1996/09/20 06:45:15 deraadt Exp $
+#      $OpenBSD: MVME162,v 1.10 1997/03/31 00:23:53 downsj Exp $
 
 machine                mvme68k m68k
 
 option         "M68040"        # support for 040
 option         FPSP            # MC68040 floating point support
 #option                "M68030"        # support for 030
-#option                FPCOPROC        # Support for MC6888[12] (Required)
 
 #option                MVME147         # (requires M68030)
 option         MVME162         # (requires M68040)
index 7661984..ff63dbe 100644 (file)
@@ -1,11 +1,10 @@
-#      $OpenBSD: MVME167,v 1.9 1996/09/20 06:45:15 deraadt Exp $
+#      $OpenBSD: MVME167,v 1.10 1997/03/31 00:23:54 downsj Exp $
 
 machine                mvme68k m68k
 
 option         "M68040"        # support for 040
 option         FPSP            # MC68040 floating point support
 #option                "M68030"        # support for 030
-#option                FPCOPROC        # Support for MC6888[12] (Required)
 
 #option                MVME147         # (requires M68030)
 #option                MVME162         # (requires M68040)
index a8dfe59..4b929ef 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile.mvme68k,v 1.7 1996/05/27 22:11:36 chuck Exp $
+#      $OpenBSD: Makefile.mvme68k,v 1.8 1997/03/31 00:23:54 downsj Exp $
 
 # This makefile is constructed from a machine description:
 #      config machineid
@@ -23,17 +23,24 @@ AS?=        as
 CC?=   cc
 CPP?=  cpp
 LD?=   ld
-STRIP?=        strip -d
-TOUCH?=        touch -f -c
+STRIP?=        strip
+COPTS?=        -O2
 
 # source tree is located via $S relative to the compilation directory
 S=     ../../../..
 MVME68K=../..
 
-INCLUDES=       -I. -I$S/arch -I$S
-CPPFLAGS=      ${INCLUDES} ${IDENT} -D_KERNEL -Dmvme68k
-CFLAGS=                ${DEBUG} -O2 -Werror
+INCLUDES=       -I. -I$S/arch -I$S -nostdinc
+CPPFLAGS=      ${INCLUDES} ${IDENT} ${PARAM} -D_KERNEL -Dmvme68k
+CWARNFLAGS=    -Werror
+CFLAGS=                ${DEBUG} ${COPTS} ${CWARNFLAGS} -msoft-float
 AFLAGS=                -x assembler-with-cpp -traditional-cpp -D_LOCORE
+LINKFLAGS=     -Ttext 0x10000 -z -e start
+STRIPFLAGS=    -d
+
+HOSTCC=        ${CC}
+HOSTED_CPPFLAGS=${CPPFLAGS:S/^-nostdinc$//}
+HOSTED_CFLAGS= ${CFLAGS}
 
 ### find out what to use for libkern
 .include "$S/lib/libkern/Makefile.inc"
@@ -54,19 +61,13 @@ LIBCOMPAT=  ${COMPATLIB_PROF}
 ### for the Motorola 68040 Floating Point Software Product
 .include "$S/arch/m68k/fpsp/Makefile.inc"
 
-# compile rules: rules are named ${TYPE}_${SUFFIX}${CONFIG_DEP}
-# where TYPE is NORMAL, DRIVER, or PROFILE}; SUFFIX is the file suffix,
-# capitalized (e.g. C for a .c file), and CONFIG_DEP is _C if the file
-# is marked as config-dependent.
+# compile rules: rules are named ${TYPE}_${SUFFIX} where TYPE is NORMAL or
+# HOSTED}, and SUFFIX is the file suffix, capitalized (e.g. C for a .c file).
 
 NORMAL_C=      ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c $<
-NORMAL_C_C=    ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} ${PARAM} -c $<
-
-DRIVER_C=      ${CC} -c ${CFLAGS} ${CPPFLAGS} ${PROF} $<
-DRIVER_C_C=    ${CC} -c ${CFLAGS} ${CPPFLAGS} ${PROF} ${PARAM} $<
-
 NORMAL_S=      ${CC} ${AFLAGS} ${CPPFLAGS} -c $<
-NORMAL_S_C=    ${CC} ${AFLAGS} ${CPPFLAGS} ${PARAM} -c $<
+
+HOSTED_C=      ${HOSTCC} ${HOSTED_CFLAGS} ${HOSTED_CPPFLAGS} -c $<
 
 %OBJS
 
@@ -79,37 +80,37 @@ NORMAL_S_C= ${CC} ${AFLAGS} ${CPPFLAGS} ${PARAM} -c $<
 #      ${SYSTEM_LD_HEAD}
 #      ${SYSTEM_LD} swapxxx.o
 #      ${SYSTEM_LD_TAIL}
+SYSTEM_OBJ=    locore.o ${FPSP} \
+               param.o ioconf.o ${OBJS} ${LIBKERN} ${LIBCOMPAT}
+SYSTEM_DEP=    Makefile ${SYSTEM_OBJ}
+SYSTEM_LD_HEAD=        @rm -f $@
+SYSTEM_LD=     @echo ${LD} ${LINKFLAGS} -o $@ '$${SYSTEM_OBJ}' vers.o; \
+               ${LD} ${LINKFLAGS} -o $@ ${SYSTEM_OBJ} vers.o
+SYSTEM_LD_TAIL=        @size $@; chmod 755 $@
+
 DEBUG?=
 .if ${DEBUG} == "-g"
-LDX=-X
+LINKFLAGS+=    -X
+SYSTEM_LD_TAIL+=; \
+               echo cp $@ $@.gdb; rm -f $@.gdb; cp $@ $@.gdb; \
+               echo ${STRIP} ${STRIPFLAGS} $@; ${STRIP} ${STRIPFLAGS} $@
 .else
-LDX=-x
+LINKFLAGS+=    -S
 .endif
-SYSTEM_OBJ=    locore.o ${OBJS} param.o ioconf.o ${FPSP} \
-               ${LIBKERN} ${LIBCOMPAT}
-SYSTEM_DEP=    Makefile ${SYSTEM_OBJ}
-SYSTEM_LD_HEAD=        @echo loading $@; rm -f $@
-SYSTEM_LD=     @${LD} ${LDX} -Ttext 0x10000 -z -o $@ -e start \
-                   ${SYSTEM_OBJ} vers.o
-SYSTEM_LD_TAIL=        @echo rearranging symbols; size $@; chmod 755 $@
 
 %LOAD
 
-assym.h: genassym
-       ./genassym >assym.h
-
-genassym: genassym.o
-       ${CC} -o $@ genassym.o
-
-genassym.o: ${MVME68K}/mvme68k/genassym.c
-       ${NORMAL_C_C}
+assym.h: $S/kern/genassym.sh ${MVME68K}/mvme68k/genassym.cf
+       sh $S/kern/genassym.sh ${CC} ${CFLAGS} ${CPPFLAGS} \
+           ${PARAM} < ${MVME68K}/mvme68k/genassym.cf > assym.h.tmp && \
+           mv -f assym.h.tmp assym.h
 
 param.c: $S/conf/param.c
        rm -f param.c
        cp $S/conf/param.c .
 
 param.o: param.c Makefile
-       ${NORMAL_C_C}
+       ${NORMAL_C}
 
 ioconf.o: ioconf.c
        ${NORMAL_C}
@@ -121,7 +122,7 @@ newvers: ${SYSTEM_DEP} ${SYSTEM_SWAP_DEP}
 
 clean::
        rm -f eddep bsd bsd.gdb tags *.o locore.i \
-           [a-z]*.s [Ee]rrs linterrs makelinks genassym
+           [a-z]*.s [Ee]rrs linterrs makelinks assym.h
 
 lint: /tmp param.c
        @lint -hbxn -DGENERIC -Dvolatile= ${COPTS} ${PARAM} -UKGDB \
@@ -148,7 +149,6 @@ depend:: .depend
        mkdep ${AFLAGS} ${CPPFLAGS} ${MVME68K}/mvme68k/locore.s
        mkdep -a ${CFLAGS} ${CPPFLAGS} param.c ioconf.c ${CFILES}
        mkdep -a ${AFLAGS} ${CPPFLAGS} ${SFILES}
-       mkdep -a ${CFLAGS} ${CPPFLAGS} ${PARAM} ${MVME68K}/mvme68k/genassym.c
 
 
 # depend on root or device configuration
@@ -160,7 +160,7 @@ if_tun.o if_loop.o if_ethersubr.o: Makefile
 in_proto.o: Makefile
 
 # depend on maxusers
-genassym.o machdep.o: Makefile
+assym.h machdep.o: Makefile
 
 # depend on CPU configuration 
 locore.o machdep.o: Makefile
index dc822c7..f61a031 100644 (file)
@@ -1,11 +1,10 @@
-#      $OpenBSD: X,v 1.2 1997/02/11 02:55:10 deraadt Exp $
+#      $OpenBSD: X,v 1.3 1997/03/31 00:23:55 downsj Exp $
 
 machine                mvme68k m68k
 
 option         "M68040"        # support for 040
 option         FPSP            # MC68040 floating point support
 #option                "M68030"        # support for 030
-#option                FPCOPROC        # Support for MC6888[12] (Required)
 
 #option                MVME147         # (requires M68030)
 option         MVME162         # (requires M68040)
index da3aff4..95d4a7c 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: files.mvme68k,v 1.8 1996/12/20 08:26:26 deraadt Exp $
+#      $OpenBSD: files.mvme68k,v 1.9 1997/03/31 00:23:56 downsj Exp $
 
 # config file for mvme68k
 
@@ -126,7 +126,6 @@ file arch/mvme68k/mvme68k/pmap_bootstrap.c
 file arch/mvme68k/mvme68k/sys_machdep.c
 file arch/mvme68k/mvme68k/trap.c
 file arch/mvme68k/mvme68k/vm_machdep.c
-file arch/m68k/m68k/copy.s
 file dev/cons.c
 file dev/cninit.c
 
@@ -134,8 +133,12 @@ file arch/m68k/m68k/db_memrw.c                     ddb
 
 # Compatibility modules
 
+# HP-UX binary compatibility
+include        "compat/hpux/files.hpux"
+file   arch/mvme68k/mvme68k/hpux_machdep.c     compat_hpux
+
 # SunOS Binary Compatibility (COMPAT_SUNOS)
-include        "../../../compat/sunos/files.sunos"
+include        "compat/sunos/files.sunos"
 file   arch/m68k/m68k/sunos_machdep.c          compat_sunos
 
 device wl: tty
index c7c19ac..1249e51 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: autoconf.h,v 1.5 1996/06/11 10:15:43 deraadt Exp $ */
+/*     $OpenBSD: autoconf.h,v 1.6 1997/03/31 00:23:58 downsj Exp $ */
 
 /*
  * Copyright (c) 1995 Theo de Raadt
@@ -31,6 +31,9 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#ifndef _MVME68K_AUTOCONF_H_
+#define _MVME68K_AUTOCONF_H_
+
 struct confargs {
        int     ca_bustype;
        void    *ca_vaddr;
@@ -65,3 +68,5 @@ struct        device *bootdv; /* boot device */
 
 void   *mapiodev __P((void *pa, int size));
 void   unmapiodev __P((void *kva, int size));
+
+#endif
index 8ab985b..7ff575c 100644 (file)
@@ -1,8 +1,3 @@
-/*     $OpenBSD: cdefs.h,v 1.3 1996/04/28 10:56:05 deraadt Exp $ */
-
-#ifndef _MACHINE_CDEFS_H_
-#define _MACHINE_CDEFS_H_
+/*     $OpenBSD: cdefs.h,v 1.4 1997/03/31 00:23:58 downsj Exp $ */
 
 #include <m68k/cdefs.h>
-
-#endif
index 492e23d..ecb5325 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.5 1997/02/10 17:49:09 deraadt Exp $ */
+/*     $OpenBSD: cpu.h,v 1.6 1997/03/31 00:23:59 downsj Exp $ */
 
 /*
  * Copyright (c) 1995 Theo de Raadt
@@ -71,6 +71,9 @@
  *     @(#)cpu.h       8.4 (Berkeley) 1/5/94
  */
 
+#ifndef _MVME68K_CPU_H_
+#define _MVME68K_CPU_H_
+
 /*
  * Exported definitions unique to mvme68k/68k cpu support.
  */
@@ -280,3 +283,4 @@ struct haltvec {
        void    (*hv_fn) __P((void));
        int     hv_pri;
 };
+#endif
index b3cc396..f2b386c 100644 (file)
@@ -1,3 +1,5 @@
+/*     $OpenBSD: disklabel.h,v 1.5 1997/03/31 00:24:00 downsj Exp $    */
+
 /*
  * Copyright (c) 1996 Nivas Madhur
  * Copyright (c) 1995 Dale Rahn.
@@ -29,8 +31,8 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */  
 
-#ifndef _MACHINE_DISKLABEL_H_
-#define _MACHINE_DISKLABEL_H_
+#ifndef _MVME68K_DISKLABEL_H_
+#define _MVME68K_DISKLABEL_H_
 
 /* number of boot pieces , ie xxboot bootxx */
 #define NUMBOOT                2
@@ -149,4 +151,4 @@ struct cpu_disklabel {
        u_long          magic2;
        u_char          cfg_4[192];
 };
-#endif _MACHINE_DISKLABEL_H_
+#endif /* _MVME68K_DISKLABEL_H_ */
index ef5cfd8..9de9c81 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: exec.h,v 1.5 1996/12/23 02:42:31 deraadt Exp $ */
+/*     $OpenBSD: exec.h,v 1.6 1997/03/31 00:24:01 downsj Exp $ */
 
 /*
  * Copyright (c) 1993 Christopher G. Demetriou
@@ -26,8 +26,8 @@
  * (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 _MACHINE_EXEC_H_
-#define _MACHINE_EXEC_H_
+#ifndef _MVME68K_EXEC_H_
+#define _MVME68K_EXEC_H_
 
 #define __LDPGSZ       8192
 
@@ -57,4 +57,4 @@ struct relocation_info_m68k {
 #define _KERN_DO_ELF
 #endif
 
-#endif  /* _MACHINE_EXEC_H_ */
+#endif  /* _MVME68K_EXEC_H_ */
index b171bd9..6c9b3c0 100644 (file)
@@ -1,8 +1,3 @@
-/*     $OpenBSD: float.h,v 1.3 1996/04/28 10:56:18 deraadt Exp $ */
-
-#ifndef _MACHINE_FLOAT_H_
-#define _MACHINE_FLOAT_H_
+/*     $OpenBSD: float.h,v 1.4 1997/03/31 00:24:01 downsj Exp $ */
 
 #include <m68k/float.h>
-
-#endif
diff --git a/sys/arch/mvme68k/include/hpux_machdep.h b/sys/arch/mvme68k/include/hpux_machdep.h
new file mode 100644 (file)
index 0000000..e9133eb
--- /dev/null
@@ -0,0 +1,80 @@
+/*     $OpenBSD: hpux_machdep.h,v 1.1 1997/03/31 00:24:02 downsj Exp $ */
+/*     $NetBSD: hpux_machdep.h,v 1.6 1997/03/16 10:02:40 thorpej Exp $ */
+
+/*-
+ * Copyright (c) 1996, 1997 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 REGENTS 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 _MVME68K_HPUX_MACHDEP_H_
+#define _MVME68K_HPUX_MACHDEP_H_
+
+/*    
+ * Information pushed on stack when a signal is delivered.
+ * This is used by the kernel to restore state following
+ * execution of the signal handler.  It is also made available
+ * to the handler to allow it to restore state properly if
+ * a non-standard exit is performed. 
+ */
+struct hpuxsigcontext {
+       int     hsc_syscall;            /* ??? (syscall number?) */
+       char    hsc_action;             /* ??? */
+       char    hsc_pad1;
+       char    hsc_pad2;
+       char    hsc_onstack;            /* sigstack state to restore */
+       int     hsc_mask;               /* signal mask to restore */
+       int     hsc_sp;                 /* sp to restore */
+       short   hsc_ps;                 /* psl to restore */
+       int     hsc_pc;                 /* pc to restore */
+
+       /*
+        * The following are not actually used by HP-UX.  They exist
+        * for the convenience of the compatibility code.
+        */
+       short   _hsc_pad;
+       int     _hsc_ap;                /* pointer to hpuxsigstate */
+};
+
+int    hpux_cpu_makecmds __P((struct proc *, struct exec_package *));
+int    hpux_cpu_vmcmd __P((struct proc *, struct exec_vmcmd *));
+void   hpux_cpu_bsd_to_hpux_stat __P((struct stat *, struct hpux_stat *));
+void   hpux_cpu_uname __P((struct hpux_utsname *));
+int    hpux_cpu_sysconf_arch __P((void));
+int    hpux_to_bsd_uoff __P((int *, int *, struct proc *));
+
+void   hpux_sendsig __P((sig_t, int, int, u_long, int, union sigval));
+void   hpux_setregs __P((struct proc *, struct exec_package *,
+           u_long, register_t *));
+
+#endif /* ! _MVME68K_HPUX_MACHDEP_H_ */
index 03ac2f5..2325ef8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: nvram.h,v 1.3 1996/04/28 10:56:23 deraadt Exp $ */
+/*     $OpenBSD: nvram.h,v 1.4 1997/03/31 00:24:03 downsj Exp $ */
 
 /*
  * Copyright (c) 1995 Theo de Raadt
@@ -31,6 +31,9 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#ifndef        _MVME68K_NVRAM_H_
+#define        _MVME68K_NVRAM_H_
+
 struct nvram_147 {
        u_char  user[0x400];
        u_char  os[0x200];
@@ -77,3 +80,5 @@ struct nvram_16x {
        } conf;
        /*struct clockreg cl; */
 };
+
+#endif
index 5b7219c..abc3e5e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: param.h,v 1.4 1996/04/28 10:55:42 deraadt Exp $ */
+/*     $OpenBSD: param.h,v 1.5 1997/03/31 00:24:04 downsj Exp $ */
 
 /*
  * Copyright (c) 1988 University of Utah.
 #ifdef _KERNEL
 #define DELAY(n)       delay(n)
 #endif
+
+#ifdef COMPAT_HPUX
+/*
+ * Constants/macros for HPUX multiple mapping of user address space.
+ * Pages in the first 256Mb are mapped in at every 256Mb segment.
+ */
+#define HPMMMASK       0xF0000000
+#define ISHPMMADDR(v) \
+       ((curproc->p_md.md_flags & MDP_HPUXMMAP) && \
+        ((unsigned)(v) & HPMMMASK) && \
+        ((unsigned)(v) & HPMMMASK) != HPMMMASK)
+#define HPMMBASEADDR(v) \
+       ((unsigned)(v) & ~HPMMMASK)
+#endif
index 211ecc7..bbdee87 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pcb.h,v 1.3 1996/04/28 10:56:24 deraadt Exp $ */
+/*     $OpenBSD: pcb.h,v 1.4 1997/03/31 00:24:04 downsj Exp $ */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -42,6 +42,9 @@
  *     @(#)pcb.h       8.1 (Berkeley) 6/10/93
  */
 
+#ifndef _MVME68K_PCB_H_
+#define _MVME68K_PCB_H_
+
 #include <machine/frame.h>
 
 /*
@@ -65,3 +68,5 @@ struct pcb {
 struct md_coredump {
        int     md_exec[16];    /* exec structure for HP-UX core dumps */
 };
+
+#endif
index ac1a785..905b3c5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pmap.h,v 1.3 1996/04/28 10:56:25 deraadt Exp $ */
+/*     $OpenBSD: pmap.h,v 1.4 1997/03/31 00:24:05 downsj Exp $ */
 
 /* 
  * Copyright (c) 1987 Carnegie-Mellon University
@@ -40,8 +40,8 @@
  *     @(#)pmap.h      8.1 (Berkeley) 6/10/93
  */
 
-#ifndef        _MACHINE_PMAP_H_
-#define        _MACHINE_PMAP_H_
+#ifndef        _MVME68K_PMAP_H_
+#define        _MVME68K_PMAP_H_
 
 #include <machine/pte.h>
 
@@ -155,4 +155,4 @@ extern pt_entry_t   *Sysmap;
 extern char            *vmmap;         /* map for mem, dumps, etc. */
 #endif /* _KERNEL */
 
-#endif /* !_MACHINE_PMAP_H_ */
+#endif /* !_MVME68K_PMAP_H_ */
index 1711d32..f55f547 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: proc.h,v 1.4 1996/04/28 10:56:25 deraadt Exp $ */
+/*     $OpenBSD: proc.h,v 1.5 1997/03/31 00:24:06 downsj Exp $ */
 
 /*
  * Copyright (c) 1991, 1993
@@ -35,6 +35,9 @@
  *     @(#)proc.h      8.1 (Berkeley) 6/10/93
  */
 
+#ifndef _MVME68K_PROC_H_
+#define _MVME68K_PROC_H_
+
 /*
  * Machine-dependent part of the proc structure for mvme68k.
  */
@@ -45,9 +48,10 @@ struct mdproc {
 
 /* md_flags */
 #define MDP_STACKADJ   0x0002  /* frame SP adjusted; undo when syscall does ERESTART */
-#define        MDP_HPUXTRACE   0x0004  /* being traced by HP-UX process */
 #define        MDP_HPUXMMAP    0x0008  /* VA space is multiply mapped */
 #define        MDP_CCBDATA     0x0010  /* copyback caching of data (68040) */
 #define        MDP_CCBSTACK    0x0020  /* copyback caching of stack (68040) */
 #define MDP_UNCACHE_WX 0x0040  /* The process might modify code, so
                                   don't cache writeable executable pages.  */
+
+#endif
index 6aa1b56..b5c2e6f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pte.h,v 1.3 1996/04/28 10:56:29 deraadt Exp $ */
+/*     $OpenBSD: pte.h,v 1.4 1997/03/31 00:24:07 downsj Exp $ */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -42,8 +42,8 @@
  *     @(#)pte.h       8.1 (Berkeley) 6/10/93
  */
 
-#ifndef        _MACHINE_PTE_H_
-#define        _MACHINE_PTE_H_
+#ifndef        _MVME68K_PTE_H_
+#define        _MVME68K_PTE_H_
 
 /*
  * m68k hardware segment/page table entries
@@ -149,4 +149,4 @@ typedef int pt_entry_t;     /* Mach page table entry */
 #define        kvtophys(va) \
        ((kvtopte(va)->pg_pfnum << PGSHIFT) | ((int)(va) & PGOFSET))
 
-#endif /* !_MACHINE_PTE_H_ */
+#endif /* !_MVME68K_PTE_H_ */
index adfeaea..ae0e25f 100644 (file)
@@ -1,8 +1,3 @@
-/*     $OpenBSD: reg.h,v 1.3 1996/04/28 10:56:31 deraadt Exp $ */
-
-#ifndef _MACHINE_REG_H_
-#define        _MACHINE_REG_H_
+/*     $OpenBSD: reg.h,v 1.4 1997/03/31 00:24:08 downsj Exp $ */
 
 #include <m68k/reg.h>
-
-#endif /* _MACHINE_REG_H_ */
index 578b514..f1474b8 100644 (file)
@@ -1,10 +1,5 @@
-/*     $OpenBSD: types.h,v 1.3 1996/04/28 10:56:35 deraadt Exp $ */
-
-#ifndef _MACHINE_TYPES_H_
-#define _MACHINE_TYPES_H_
+/*     $OpenBSD: types.h,v 1.4 1997/03/31 00:24:08 downsj Exp $ */
 
 #include <m68k/types.h>
 
 #define        __BDEVSW_DUMP_OLD_TYPE
-
-#endif
diff --git a/sys/arch/mvme68k/mvme68k/genassym.c b/sys/arch/mvme68k/mvme68k/genassym.c
deleted file mode 100644 (file)
index 7deeb6f..0000000
+++ /dev/null
@@ -1,288 +0,0 @@
-/*     $OpenBSD: genassym.c,v 1.4 1997/02/10 17:49:11 deraadt Exp $ */
-
-/*
- * Copyright (c) 1995 Theo de Raadt
- * 
- * 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 under OpenBSD by
- *     Theo de Raadt for Willowglen Singapore.
- * 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.
- *
- * Copyright (c) 1982, 1990, 1993
- *     The Regents of the University of California.  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 the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
- *
- *     @(#)genassym.c  8.3 (Berkeley) 1/4/94
- */
-
-/* XXXX */
-#define _VA_LIST_ _BSD_VA_LIST_
-#define _PTRDIFF_T_ _BSD_PTRDIFF_T_
-
-#include <sys/param.h>
-#include <sys/buf.h>
-#include <sys/map.h>
-#include <sys/proc.h>
-#include <sys/mbuf.h>
-#include <sys/msgbuf.h>
-#include <sys/syscall.h>
-#include <sys/user.h>
-
-#include <machine/cpu.h>
-#include <machine/trap.h>
-#include <machine/psl.h>
-#include <machine/nvram.h>
-#include <machine/reg.h>
-#include <machine/autoconf.h>
-#include <machine/prom.h>
-#include <machine/pte.h>
-#include <vm/vm.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <stddef.h>
-#include <string.h>
-
-extern int errno;
-
-#if defined(MVME162) || defined(MVME167)
-#ifndef M68040
-#error "MVME162/MVME167 requires M68040 support"
-#endif
-#endif
-
-#if defined(MVME147)
-#ifndef M68030
-#error "MVME147 requires M68030 support"
-#endif
-#endif
-
-#if defined(MVME172) || defined(MVME177)
-#ifndef M68060
-#error "MVME172/MVME177 requires M68060 support"
-#endif
-#endif
-
-void
-def(what, val)
-       char *what;
-       int val;
-{
-
-       if (printf("#define\t%s\t%d\n", what, val) < 0) {
-               (void)fprintf(stderr, "genassym: printf: %s\n",
-                   strerror(errno));
-               exit(1);
-       }
-}
-
-void
-flush()
-{
-
-       if (fflush(stdout) || fsync(fileno(stdout)) < 0) {
-               (void)fprintf(stderr, "genassym: flush stdout: %s\n",
-                   strerror(errno));
-               exit(1);
-       }
-}
-
-#define        off(what, s, m) def(what, (int)offsetof(s, m))
-
-main()
-{
-       /* general constants */
-       def("UPAGES", UPAGES);
-       def("USPACE", USPACE);
-       def("NBPG", NBPG);
-       def("PGSHIFT", PGSHIFT);
-       def("USRSTACK", USRSTACK);
-
-       /* proc fields and values */
-       off("P_FORW", struct proc, p_forw);
-       off("P_BACK", struct proc, p_back);
-       off("P_VMSPACE", struct proc, p_vmspace);
-       off("P_ADDR", struct proc, p_addr);
-       off("P_PRIORITY", struct proc, p_priority);
-       off("P_STAT", struct proc, p_stat);
-       off("P_WCHAN", struct proc, p_wchan);
-       off("P_FLAG", struct proc, p_flag);
-       off("P_MD_FLAGS", struct proc, p_md.md_flags);
-       off("P_MD_REGS", struct proc, p_md.md_regs);
-
-       def("SSLEEP", SSLEEP);
-       def("SRUN", SRUN);
-
-       /* VM structure fields */
-       off("VM_PMAP", struct vmspace, vm_pmap);
-       off("PM_STCHG", struct pmap, pm_stchanged);
-
-       /* interrupt/fault metering */
-       off("V_SWTCH", struct vmmeter, v_swtch);
-       off("V_INTR", struct vmmeter, v_intr);
-
-       /* trap types (should just include trap.h?) */
-       def("T_BUSERR", T_BUSERR);
-       def("T_ADDRERR", T_ADDRERR);
-       def("T_ILLINST", T_ILLINST);
-       def("T_ZERODIV", T_ZERODIV);
-       def("T_CHKINST", T_CHKINST);
-       def("T_TRAPVINST", T_TRAPVINST);
-       def("T_PRIVINST", T_PRIVINST);
-       def("T_TRACE", T_TRACE);
-       def("T_MMUFLT", T_MMUFLT);
-       def("T_SSIR", T_SSIR);
-       def("T_FMTERR", T_FMTERR);
-       def("T_COPERR", T_COPERR);
-       def("T_FPERR", T_FPERR);
-       def("T_ASTFLT", T_ASTFLT);
-       def("T_TRAP15", T_TRAP15);
-       def("T_FPEMULI", T_FPEMULI);
-       def("T_FPEMULD", T_FPEMULD);
-
-       /* PSL values (should just include psl.h?) */
-       def("PSL_S", PSL_S);
-       def("PSL_IPL7", PSL_IPL7);
-       def("PSL_LOWIPL", PSL_LOWIPL);
-       def("PSL_HIGHIPL", PSL_HIGHIPL);
-       def("PSL_USER", PSL_USER);
-       def("SPL1", PSL_S | PSL_IPL1);
-       def("SPL2", PSL_S | PSL_IPL2);
-       def("SPL3", PSL_S | PSL_IPL3);
-       def("SPL4", PSL_S | PSL_IPL4);
-       def("SPL5", PSL_S | PSL_IPL5);
-       def("SPL6", PSL_S | PSL_IPL6);
-
-       /* magic */
-       def("FC_USERD", FC_USERD);
-       def("EIOMAPSIZE", EIOMAPSIZE);
-       def("CACHE_ON", CACHE_ON);
-       def("CACHE_OFF", CACHE_OFF);
-       def("CACHE_CLR", CACHE_CLR);
-       def("IC_CLEAR", IC_CLEAR);
-       def("DC_CLEAR", DC_CLEAR);
-
-       /* pte/ste bits */
-       def("PG_V", PG_V);
-       def("PG_NV", PG_NV);
-       def("PG_RO", PG_RO);
-       def("PG_RW", PG_RW);
-       def("PG_CI", PG_CI);
-       def("PG_PROT", PG_PROT);
-       def("PG_FRAME", PG_FRAME);
-       def("SG_V", SG_V);
-       def("SG_NV", SG_NV);
-       def("SG_RW", SG_RW);
-       def("SG_FRAME", SG_FRAME);
-       def("SG_ISHIFT", SG_ISHIFT);
-
-       /* pcb fields */
-       off("PCB_PS", struct pcb, pcb_ps);
-       off("PCB_USTP", struct pcb, pcb_ustp);
-       off("PCB_USP", struct pcb, pcb_usp);
-       off("PCB_REGS", struct pcb, pcb_regs);
-       off("PCB_ONFAULT", struct pcb, pcb_onfault);
-       off("PCB_FPCTX", struct pcb, pcb_fpregs);
-       def("SIZEOF_PCB", sizeof(struct pcb));
-       def("SIZEOF_TRAPFRAME", sizeof(struct trapframe));
-
-       /* exception frame offset/sizes */
-       off("FR_SP", struct frame, f_regs[15]);
-       off("FR_HW", struct frame, f_sr);
-       off("FR_ADJ", struct frame, f_stackadj);
-
-       /* system calls */
-       def("SYS_exit", SYS_exit);
-       def("SYS_execve", SYS_execve);
-       def("SYS_sigreturn", SYS_sigreturn);
-
-       /* errno */
-       def("EFAULT", EFAULT);
-       def("ENAMETOOLONG", ENAMETOOLONG);
-
-       def("SIZEOF_MVMEPROM_BRDID", sizeof(struct mvmeprom_brdid));
-       off("MVMEPROM_BRDID_MODEL", struct mvmeprom_brdid, model);
-
-       off("NVRAM_147_ETHER", struct nvram_147, ether);
-       off("NVRAM_147_EMEM", struct nvram_147, emem);
-
-       off("NVRAM_16X_ETHER", struct nvram_16x, conf.ether);
-
-       def("INTIOBASE_147", INTIOBASE_147);
-       def("INTIOBASE_162", INTIOBASE_162);
-       def("INTIOSIZE_147", INTIOSIZE_147);
-       def("INTIOSIZE_162", INTIOSIZE_162);
-
-       def("CPU_147", CPU_147);
-       def("CPU_162", CPU_162);
-       def("CPU_166", CPU_166);
-       def("CPU_167", CPU_167);
-       def("CPU_172", CPU_172);
-       def("CPU_177", CPU_177);
-
-       def("MMU_68851", MMU_68851);
-       def("MMU_68030", MMU_68030);
-       def("MMU_68040", MMU_68040);
-
-       def("CPU_68020", CPU_68020);
-       def("CPU_68030", CPU_68030);
-       def("CPU_68040", CPU_68040);
-       def("CPU_68060", CPU_68060);
-
-       off("NETCTRL_DEV", struct prom_netctrl, dev);
-       off("NETCTRL_CTRL", struct prom_netctrl, ctrl);
-       off("NETCTRL_CMD", struct prom_netctrl, cmd);
-       off("NETCTRL_ADDR", struct prom_netctrl, addr);
-       off("NETCTRL_LEN", struct prom_netctrl, len);
-
-       exit(0);
-}
diff --git a/sys/arch/mvme68k/mvme68k/genassym.cf b/sys/arch/mvme68k/mvme68k/genassym.cf
new file mode 100644 (file)
index 0000000..5b7ee64
--- /dev/null
@@ -0,0 +1,254 @@
+#      $OpenBSD: genassym.cf,v 1.1 1997/03/31 00:24:11 downsj Exp $
+
+#
+# Copyright (c) 1995 Theo de Raadt
+# 
+# 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 under OpenBSD by
+#      Theo de Raadt for Willowglen Singapore.
+# 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.
+#
+# Copyright (c) 1982, 1990, 1993
+#      The Regents of the University of California.  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 the University of
+#      California, Berkeley and its contributors.
+# 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+#
+#      @(#)genassym.c  8.3 (Berkeley) 1/4/94
+#
+
+include <sys/param.h>
+include <sys/buf.h>
+include <sys/map.h>
+include <sys/proc.h>
+include <sys/mbuf.h>
+include <sys/msgbuf.h>
+include <sys/syscall.h>
+include <sys/user.h>
+
+include <machine/cpu.h>
+include <machine/trap.h>
+include <machine/psl.h>
+include <machine/nvram.h>
+include <machine/reg.h>
+include <machine/autoconf.h>
+include <machine/prom.h>
+include <machine/pte.h>
+include <vm/vm.h>
+
+define __XXX_BUG_FODDER        0
+
+# CPU options
+ifdef M68020
+define M68020                  1
+endif
+ifdef M68030
+define M68030                  1
+endif
+ifdef M68040
+define M68040                  1
+endif
+ifdef M68060
+define M68060                  1
+endif
+
+# MMU options
+ifdef M68K_MMU_MOTOROLA
+define M68K_MMU_MOTOROLA       1
+endif
+
+# general constants
+define UPAGES                  UPAGES
+define USPACE                  USPACE
+define NBPG                    NBPG
+define PGSHIFT                 PGSHIFT
+define USRSTACK                USRSTACK
+
+# proc fields and values
+define P_FORW                  offsetof(struct proc, p_forw)
+define P_BACK                  offsetof(struct proc, p_back)
+define P_VMSPACE               offsetof(struct proc, p_vmspace)
+define P_ADDR                  offsetof(struct proc, p_addr)
+define P_PRIORITY              offsetof(struct proc, p_priority)
+define P_STAT                  offsetof(struct proc, p_stat)
+define P_WCHAN                 offsetof(struct proc, p_wchan)
+define P_FLAG                  offsetof(struct proc, p_flag)
+define P_MD_FLAGS              offsetof(struct proc, p_md.md_flags)
+define P_MD_REGS               offsetof(struct proc, p_md.md_regs)
+
+define SSLEEP                  SSLEEP
+define SRUN                    SRUN
+
+# VM structure fields
+define VM_PMAP                 offsetof(struct vmspace, vm_pmap)
+define PM_STCHG                offsetof(struct pmap, pm_stchanged)
+
+# interrupt/fault metering
+define V_SWTCH                 offsetof(struct vmmeter, v_swtch)
+define V_INTR                  offsetof(struct vmmeter, v_intr)
+
+# trap types (should just include trap.h?)
+define T_BUSERR                T_BUSERR
+define T_ADDRERR               T_ADDRERR
+define T_ILLINST               T_ILLINST
+define T_ZERODIV               T_ZERODIV
+define T_CHKINST               T_CHKINST
+define T_TRAPVINST             T_TRAPVINST
+define T_PRIVINST              T_PRIVINST
+define T_TRACE                 T_TRACE
+define T_MMUFLT                T_MMUFLT
+define T_SSIR                  T_SSIR
+define T_FMTERR                T_FMTERR
+define T_COPERR                T_COPERR
+define T_FPERR                 T_FPERR
+define T_ASTFLT                T_ASTFLT
+define T_TRAP15                T_TRAP15
+define T_FPEMULI               T_FPEMULI
+define T_FPEMULD               T_FPEMULD
+
+# PSL values (should just include psl.h?)
+define PSL_S                   PSL_S
+define PSL_IPL7                PSL_IPL7
+define PSL_LOWIPL              PSL_LOWIPL
+define PSL_HIGHIPL             PSL_HIGHIPL
+define PSL_USER                PSL_USER
+define SPL1                    PSL_S | PSL_IPL1
+define SPL2                    PSL_S | PSL_IPL2
+define SPL3                    PSL_S | PSL_IPL3
+define SPL4                    PSL_S | PSL_IPL4
+define SPL5                    PSL_S | PSL_IPL5
+define SPL6                    PSL_S | PSL_IPL6
+
+# magic
+define FC_USERD                FC_USERD
+define EIOMAPSIZE              EIOMAPSIZE
+define CACHE_ON                CACHE_ON
+define CACHE_OFF               CACHE_OFF
+define CACHE_CLR               CACHE_CLR
+define IC_CLEAR                IC_CLEAR
+define DC_CLEAR                DC_CLEAR
+
+# pte/ste bits
+define PG_V                    PG_V
+define PG_NV                   PG_NV
+define PG_RO                   PG_RO
+define PG_RW                   PG_RW
+define PG_CI                   PG_CI
+define PG_PROT                 PG_PROT
+define PG_FRAME                PG_FRAME
+define SG_V                    SG_V
+define SG_NV                   SG_NV
+define SG_RW                   SG_RW
+define SG_FRAME                SG_FRAME
+define SG_ISHIFT               SG_ISHIFT
+
+# pcb fields
+define PCB_PS                  offsetof(struct pcb, pcb_ps)
+define PCB_USTP                offsetof(struct pcb, pcb_ustp)
+define PCB_USP                 offsetof(struct pcb, pcb_usp)
+define PCB_REGS                offsetof(struct pcb, pcb_regs)
+define PCB_ONFAULT             offsetof(struct pcb, pcb_onfault)
+define PCB_FPCTX               offsetof(struct pcb, pcb_fpregs)
+define SIZEOF_PCB              sizeof(struct pcb)
+define SIZEOF_TRAPFRAME        sizeof(struct trapframe)
+
+# exception frame offset/sizes
+define FR_SP                   offsetof(struct frame, f_regs[15])
+define FR_HW                   offsetof(struct frame, f_sr)
+define FR_ADJ                  offsetof(struct frame, f_stackadj)
+
+# system calls
+define SYS_exit                SYS_exit
+define SYS_execve              SYS_execve
+define SYS_sigreturn           SYS_sigreturn
+
+# errno
+define EFAULT                  EFAULT
+define ENAMETOOLONG            ENAMETOOLONG
+
+define SIZEOF_MVMEPROM_BRDID   sizeof(struct mvmeprom_brdid)
+define MVMEPROM_BRDID_MODEL    offsetof(struct mvmeprom_brdid, model)
+
+define NVRAM_147_ETHER         offsetof(struct nvram_147, ether)
+define NVRAM_147_EMEM          offsetof(struct nvram_147, emem)
+
+define NVRAM_16X_ETHER         offsetof(struct nvram_16x, conf.ether)
+
+define INTIOBASE_147           INTIOBASE_147
+define INTIOBASE_162           INTIOBASE_162
+define INTIOSIZE_147           INTIOSIZE_147
+define INTIOSIZE_162           INTIOSIZE_162
+
+define CPU_147                 CPU_147
+define CPU_162                 CPU_162
+define CPU_166                 CPU_166
+define CPU_167                 CPU_167
+define CPU_172                 CPU_172
+define CPU_177                 CPU_177
+
+define MMU_68851               MMU_68851
+define MMU_68030               MMU_68030
+define MMU_68040               MMU_68040
+
+define CPU_68020               CPU_68020
+define CPU_68030               CPU_68030
+define CPU_68040               CPU_68040
+define CPU_68060               CPU_68060
+
+define FPU_68881               FPU_68881
+define FPU_68882               FPU_68882
+define FPU_68040               FPU_68040
+define FPU_68060               FPU_68060
+
+define NETCTRL_DEV             offsetof(struct prom_netctrl, dev)
+define NETCTRL_CTRL            offsetof(struct prom_netctrl, ctrl)
+define NETCTRL_CMD             offsetof(struct prom_netctrl, cmd)
+define NETCTRL_ADDR            offsetof(struct prom_netctrl, addr)
+define NETCTRL_LEN             offsetof(struct prom_netctrl, len)
diff --git a/sys/arch/mvme68k/mvme68k/hpux_machdep.c b/sys/arch/mvme68k/mvme68k/hpux_machdep.c
new file mode 100644 (file)
index 0000000..0646fe9
--- /dev/null
@@ -0,0 +1,755 @@
+/*     $OpenBSD: hpux_machdep.c,v 1.1 1997/03/31 00:24:11 downsj Exp $ */
+/*     $NetBSD: hpux_machdep.c,v 1.9 1997/03/16 10:00:45 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1995, 1996, 1997 Jason R. Thorpe.  All rights reserved.
+ * Copyright (c) 1988 University of Utah.
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department.
+ *
+ * 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 University of
+ *     California, Berkeley and its contributors.
+ * 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 REGENTS 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 REGENTS 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.
+ */
+
+/*
+ * Machinde-dependent bits for HP-UX binary compatibility.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/signalvar.h>
+#include <sys/kernel.h>
+#include <sys/filedesc.h>
+#include <sys/proc.h> 
+#include <sys/buf.h>
+#include <sys/wait.h> 
+#include <sys/file.h>
+#include <sys/exec.h>
+#include <sys/namei.h>
+#include <sys/vnode.h>
+#include <sys/ioctl.h>
+#include <sys/ptrace.h>
+#include <sys/stat.h>
+#include <sys/syslog.h>
+#include <sys/malloc.h>
+#include <sys/mount.h>
+#include <sys/ipc.h>
+#include <sys/namei.h>
+#include <sys/user.h>
+#include <sys/mman.h>
+#include <sys/conf.h>
+
+#include <machine/cpu.h>
+#include <machine/reg.h>
+#include <machine/psl.h>
+#include <machine/vmparam.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/vm_map.h> 
+
+#include <machine/cpu.h> 
+#include <machine/reg.h>
+
+#include <sys/syscallargs.h>
+
+#include <compat/hpux/hpux.h>
+#include <compat/hpux/hpux_util.h>
+#include <compat/hpux/hpux_syscall.h>
+#include <compat/hpux/hpux_syscallargs.h>
+
+#include <machine/hpux_machdep.h>
+
+extern short exframesize[];
+
+struct valtostr {
+       int     val;
+       const char *str;
+};
+
+static struct valtostr machine_table[] = {
+       /* We approximate based on cputype. */
+       { CPU_68020,    "350" },        /* 68020 == 350. */
+       { CPU_68030,    "370" },        /* 68030 == 370. */
+       { CPU_68040,    "380" },        /* 68040 == 380. */
+       {     -1,       "3?0" },        /* unknown system (???) */
+};
+
+/*
+ * 6.0 and later context.
+ * XXX what are the HP-UX "localroot" semantics?  Should we handle
+ * XXX diskless systems here?
+ */
+static struct valtostr context_table[] = {
+       { FPU_68040,
+    "standalone HP-MC68040 HP-MC68881 HP-MC68020 HP-MC68010 localroot default"
+       },
+       { FPU_68881,
+    "standalone HP-MC68881 HP-MC68020 HP-MC68010 localroot default"
+       },
+       { FPU_NONE,
+    "standalone HP-MC68020 HP-MC68010 localroot default"
+       },
+       { 0, NULL },
+};
+
+#define UOFF(f)                ((int)&((struct user *)0)->f)
+#define HPUOFF(f)      ((int)&((struct hpux_user *)0)->f)
+
+/* simplified FP structure */
+struct bsdfp {
+       int save[54];
+       int reg[24];
+       int ctrl[3];
+};
+
+/*
+ * m68k-specific setup for HP-UX executables.
+ * XXX m68k/m68k/hpux_machdep.c?
+ */
+int
+hpux_cpu_makecmds(p, epp)
+       struct proc *p;
+       struct exec_package *epp;
+{
+       struct hpux_exec *hpux_ep = epp->ep_hdr;
+
+       /* set up command for exec header */
+       NEW_VMCMD(&epp->ep_vmcmds, hpux_cpu_vmcmd,
+           sizeof(struct hpux_exec), (long)epp->ep_hdr, NULLVP, 0, 0);
+}
+
+/*
+ * We need to stash the exec header in the pcb, so we define
+ * this vmcmd to do it for us, since vmcmds are executed once
+ * we're committed to the exec (i.e. the old program has been unmapped).
+ *
+ * The address of the header is in ev->ev_addr and the length is
+ * in ev->ev_len.
+ */
+int
+hpux_cpu_vmcmd(p, ev)
+       struct proc *p;
+       struct exec_vmcmd *ev;
+{
+       struct hpux_exec *execp = (struct hpux_exec *)ev->ev_addr;
+
+       /* Make sure we have room. */
+       if (ev->ev_len <= sizeof(p->p_addr->u_md.md_exec))
+               bcopy((caddr_t)ev->ev_addr, p->p_addr->u_md.md_exec,
+                   ev->ev_len);
+
+       /* Deal with misc. HP-UX process attributes. */
+       if (execp->ha_trsize & HPUXM_VALID) {
+               if (execp->ha_trsize & HPUXM_DATAWT)
+                       p->p_md.md_flags &= ~MDP_CCBDATA;
+
+               if (execp->ha_trsize & HPUXM_STKWT)
+                       p->p_md.md_flags & ~MDP_CCBSTACK;
+       }
+
+       return (0);
+}
+
+/*
+ * Machine-dependent stat structure conversion.
+ */
+void
+hpux_cpu_bsd_to_hpux_stat(sb, hsb)
+       struct stat *sb;
+       struct hpux_stat *hsb;
+{
+}
+
+/*
+ * Machine-dependent uname information.
+ */
+void
+hpux_cpu_uname(ut)
+       struct hpux_utsname *ut;
+{
+       int i;
+
+       bzero(ut->machine, sizeof(ut->machine));
+
+       /*
+        * Find the current machine-ID in the table and
+        * copy the string into the uname.
+        */
+       for (i = 0; machine_table[i].val != -1; ++i)
+               if (machine_table[i].val == cputype)
+                       break;
+
+       sprintf(ut->machine, "9000/%s", machine_table[i].str);
+}
+
+/*
+ * Return arch-type for hpux_sys_sysconf()
+ */
+int
+hpux_cpu_sysconf_arch()
+{
+
+       switch (cputype) {
+       case CPU_68020:
+               return (HPUX_SYSCONF_CPUM020);
+
+       case CPU_68030:
+               return (HPUX_SYSCONF_CPUM030);
+
+       case CPU_68040:
+               return (HPUX_SYSCONF_CPUM040);
+
+       default:
+               return (HPUX_SYSCONF_CPUM020);  /* ??? */
+       }
+       /* NOTREACHED */
+}
+
+/*
+ * HP-UX advise(2) system call.
+ */
+int
+hpux_sys_advise(p, v, retval)
+       struct proc *p;
+       void *v;
+       register_t *retval;
+{
+       struct hpux_sys_advise_args *uap = v;
+       int error = 0;
+
+       switch (SCARG(uap, arg)) {
+       case 0:
+               p->p_md.md_flags |= MDP_HPUXMMAP; 
+               break;
+
+       case 1:
+               ICIA();
+               break;
+
+       case 2:
+               DCIA();
+               break;
+
+       default:
+               error = EINVAL;
+               break;
+       }
+
+       return (error);
+}
+
+/*
+ * HP-UX getcontext(2) system call.
+ * Man page lies, behaviour here is based on observed behaviour.
+ */
+int
+hpux_sys_getcontext(p, v, retval)
+       struct proc *p; 
+       void *v;
+       register_t *retval; 
+{
+       struct hpux_sys_getcontext_args *uap = v;
+       int l, i, error = 0;
+       register int len; 
+
+       for (i = 0; context_table[i].str != NULL; i++)
+               if (context_table[i].val == fputype)
+                       break;
+       if (context_table[i].str == NULL) {
+               /*
+                * XXX What else?  It's not like this can happen...
+                */
+               return (EINVAL);
+       }
+
+       /* + 1 ... count the terminating \0. */
+       l = strlen(context_table[i].str) + 1;
+       len = min(SCARG(uap, len), l);
+
+       if (len)
+               error = copyout(context_table[i].str, SCARG(uap, buf), len);
+       if (error == 0)
+               *retval = l;
+       return (0);
+}
+
+/*
+ * Brutal hack!  Map HP-UX u-area offsets into BSD k-stack offsets.
+ * XXX This probably doesn't work anymore, BTW.  --thorpej
+ */
+int
+hpux_to_bsd_uoff(off, isps, p)
+       int *off, *isps; 
+       struct proc *p;
+{
+       register int *ar0 = p->p_md.md_regs;
+       struct hpux_fp *hp; 
+       struct bsdfp *bp;
+       register u_int raddr;
+
+       *isps = 0;
+
+       /* u_ar0 field; procxmt puts in U_ar0 */
+       if ((int)off == HPUOFF(hpuxu_ar0))
+               return(UOFF(U_ar0)); 
+
+       if (fputype) {
+               /* FP registers from PCB */
+               hp = (struct hpux_fp *)HPUOFF(hpuxu_fp);
+               bp = (struct bsdfp *)UOFF(u_pcb.pcb_fpregs);
+
+               if (off >= hp->hpfp_ctrl && off < &hp->hpfp_ctrl[3])
+                       return((int)&bp->ctrl[off - hp->hpfp_ctrl]);
+
+               if (off >= hp->hpfp_reg && off < &hp->hpfp_reg[24])
+                       return((int)&bp->reg[off - hp->hpfp_reg]);
+       }
+
+       /*
+        * Everything else we recognize comes from the kernel stack,
+        * so we convert off to an absolute address (if not already)
+        * for simplicity.
+        */
+       if (off < (int *)ctob(UPAGES))
+               off = (int *)((u_int)off + (u_int)p->p_addr);   /* XXX */
+
+       /*
+        * General registers.
+        * We know that the HP-UX registers are in the same order as ours.
+        * The only difference is that their PS is 2 bytes instead of a
+        * padded 4 like ours throwing the alignment off.
+        */
+       if (off >= ar0 && off < &ar0[18]) {
+               /*
+                * PS: return low word and high word of PC as HP-UX would
+                * (e.g. &u.u_ar0[16.5]).
+                *
+                * XXX we don't do this since HP-UX adb doesn't rely on
+                * it and passing such an offset to procxmt will cause
+                * it to fail anyway.  Instead, we just set the offset
+                * to PS and let hpux_ptrace() shift up the value returned.
+                */
+               if (off == &ar0[PS]) {
+#if 0
+                       raddr = (u_int) &((short *)ar0)[PS*2+1];
+#else
+                       raddr = (u_int) &ar0[(int)(off - ar0)];
+#endif
+                       *isps = 1;
+               }
+               /*
+                * PC: off will be &u.u_ar0[16.5] since HP-UX saved PS
+                * is only 16 bits.
+                */
+               else if (off == (int *)&(((short *)ar0)[PS*2+1]))
+                       raddr = (u_int) &ar0[PC];
+               /*
+                * D0-D7, A0-A7: easy
+                */
+               else
+                       raddr = (u_int) &ar0[(int)(off - ar0)];
+               return((int)(raddr - (u_int)p->p_addr));        /* XXX */
+       }
+
+       /* everything else */
+       return (-1);
+}
+
+#define        HSS_RTEFRAME    0x01
+#define        HSS_FPSTATE     0x02
+#define        HSS_USERREGS    0x04
+
+struct hpuxsigstate {
+       int     hss_flags;              /* which of the following are valid */
+       struct  frame hss_frame;        /* original exception frame */
+       struct  fpframe hss_fpstate;    /* 68881/68882 state info */
+};
+
+/*
+ * WARNING: code in locore.s assumes the layout shown here for hsf_signum
+ * thru hsf_handler so... don't screw with them!
+ */
+struct hpuxsigframe {
+       int     hsf_signum;                /* signo for handler */
+       int     hsf_code;                  /* additional info for handler */
+       struct  hpuxsigcontext *hsf_scp;   /* context ptr for handler */
+       sig_t   hsf_handler;               /* handler addr for u_sigc */
+       struct  hpuxsigstate hsf_sigstate; /* state of the hardware */
+       struct  hpuxsigcontext hsf_sc;     /* actual context */
+};
+
+#ifdef DEBUG
+int hpuxsigdebug = 0;
+int hpuxsigpid = 0;
+#define SDB_FOLLOW     0x01
+#define SDB_KSTACK     0x02
+#define SDB_FPSTATE    0x04
+#endif
+
+/*
+ * Send an interrupt to process.
+ */
+/* ARGSUSED */
+void
+hpux_sendsig(catcher, sig, mask, code, type, val)
+       sig_t catcher;
+       int sig, mask;
+       u_long code;
+       int type;
+       union sigval val;
+{
+       register struct proc *p = curproc;
+       register struct hpuxsigframe *kfp, *fp;
+       register struct frame *frame;
+       register struct sigacts *psp = p->p_sigacts;
+       register short ft;
+       int oonstack, fsize;
+       extern char sigcode[], esigcode[];
+
+       frame = (struct frame *)p->p_md.md_regs;
+       ft = frame->f_format;
+       oonstack = psp->ps_sigstk.ss_flags & SS_ONSTACK;
+
+       /*
+        * Allocate and validate space for the signal handler
+        * context. Note that if the stack is in P0 space, the
+        * call to grow() is a nop, and the useracc() check
+        * will fail if the process has not already allocated
+        * the space with a `brk'.
+        */
+       fsize = sizeof(struct hpuxsigframe);
+       if ((psp->ps_flags & SAS_ALTSTACK) && !oonstack &&
+           (psp->ps_sigonstack & sigmask(sig))) {
+               fp = (struct hpuxsigframe *)(psp->ps_sigstk.ss_sp +
+                   psp->ps_sigstk.ss_size - fsize);
+               psp->ps_sigstk.ss_flags |= SS_ONSTACK;
+       } else
+               fp = (struct hpuxsigframe *)(frame->f_regs[SP] - fsize);
+       if ((unsigned)fp <= USRSTACK - ctob(p->p_vmspace->vm_ssize)) 
+               (void)grow(p, (unsigned)fp);
+
+#ifdef DEBUG
+       if ((hpuxsigdebug & SDB_KSTACK) && p->p_pid == hpuxsigpid)
+               printf("hpux_sendsig(%d): sig %d ssp %x usp %x scp %x ft %d\n",
+                      p->p_pid, sig, &oonstack, fp, &fp->sf_sc, ft);
+#endif
+
+       if (useracc((caddr_t)fp, fsize, B_WRITE) == 0) {
+#ifdef DEBUG
+               if ((hpuxsigdebug & SDB_KSTACK) && p->p_pid == hpuxsigpid)
+                       printf("hpux_sendsig(%d): useracc failed on sig %d\n",
+                              p->p_pid, sig);
+#endif
+               /*
+                * Process has trashed its stack; give it an illegal
+                * instruction to halt it in its tracks.
+                */
+               SIGACTION(p, SIGILL) = SIG_DFL;
+               sig = sigmask(SIGILL);
+               p->p_sigignore &= ~sig;
+               p->p_sigcatch &= ~sig;
+               p->p_sigmask &= ~sig;
+               psignal(p, SIGILL);
+               return;
+       }
+       kfp = (struct hpuxsigframe *)malloc((u_long)fsize, M_TEMP, M_WAITOK);
+
+       /* 
+        * Build the argument list for the signal handler.
+        */
+       kfp->hsf_signum = bsdtohpuxsig(sig);
+       kfp->hsf_code = code;
+       kfp->hsf_scp = &fp->hsf_sc;
+       kfp->hsf_handler = catcher;
+
+       /*
+        * Save necessary hardware state.  Currently this includes:
+        *      - general registers
+        *      - original exception frame (if not a "normal" frame)
+        *      - FP coprocessor state
+        */
+       kfp->hsf_sigstate.hss_flags = HSS_USERREGS;
+       bcopy((caddr_t)frame->f_regs,
+           (caddr_t)kfp->hsf_sigstate.hss_frame.f_regs, sizeof frame->f_regs);
+       if (ft >= FMT7) {
+#ifdef DEBUG
+               if (ft > 15 || exframesize[ft] < 0)
+                       panic("hpux_sendsig: bogus frame type");
+#endif
+               kfp->hsf_sigstate.hss_flags |= HSS_RTEFRAME;
+               kfp->hsf_sigstate.hss_frame.f_format = frame->f_format;
+               kfp->hsf_sigstate.hss_frame.f_vector = frame->f_vector;
+               bcopy((caddr_t)&frame->F_u,
+                   (caddr_t)&kfp->hsf_sigstate.hss_frame.F_u, exframesize[ft]);
+
+               /*
+                * Leave an indicator that we need to clean up the kernel
+                * stack.  We do this by setting the "pad word" above the
+                * hardware stack frame to the amount the stack must be
+                * adjusted by.
+                *
+                * N.B. we increment rather than just set f_stackadj in
+                * case we are called from syscall when processing a
+                * sigreturn.  In that case, f_stackadj may be non-zero.
+                */
+               frame->f_stackadj += exframesize[ft];
+               frame->f_format = frame->f_vector = 0;
+#ifdef DEBUG
+               if (hpuxsigdebug & SDB_FOLLOW)
+                       printf("hpux_sendsig(%d): copy out %d of frame %d\n",
+                              p->p_pid, exframesize[ft], ft);
+#endif
+       }
+       if (fputype) {
+               kfp->hsf_sigstate.hss_flags |= HSS_FPSTATE;
+               m68881_save(&kfp->hsf_sigstate.hss_fpstate);
+       }
+
+#ifdef DEBUG
+       if ((hpuxsigdebug & SDB_FPSTATE) && *(char *)&kfp->sf_state.ss_fpstate)
+               printf("hpux_sendsig(%d): copy out FP state (%x) to %x\n",
+                      p->p_pid, *(u_int *)&kfp->sf_state.ss_fpstate,
+                      &kfp->sf_state.ss_fpstate);
+#endif
+
+       /*
+        * Build the signal context to be used by hpux_sigreturn.
+        */
+       kfp->hsf_sc.hsc_syscall = 0;            /* XXX */
+       kfp->hsf_sc.hsc_action  = 0;            /* XXX */
+       kfp->hsf_sc.hsc_pad1    = kfp->hsf_sc.hsc_pad2 = 0;
+       kfp->hsf_sc.hsc_onstack = oonstack;
+       kfp->hsf_sc.hsc_mask    = mask;
+       kfp->hsf_sc.hsc_sp      = frame->f_regs[SP];
+       kfp->hsf_sc.hsc_ps      = frame->f_sr;
+       kfp->hsf_sc.hsc_pc      = frame->f_pc;
+
+       /* How amazingly convenient! */
+       kfp->hsf_sc._hsc_pad    = 0;
+       kfp->hsf_sc._hsc_ap     = (int)&fp->hsf_sigstate;
+
+       (void) copyout((caddr_t)kfp, (caddr_t)fp, fsize);
+       frame->f_regs[SP] = (int)fp;
+
+#ifdef DEBUG
+       if (hpuxsigdebug & SDB_FOLLOW) {
+               printf(
+                 "hpux_sendsig(%d): sig %d scp %x fp %x sc_sp %x sc_ap %x\n",
+                  p->p_pid, sig, kfp->sf_scp, fp,
+                  kfp->sf_sc.sc_sp, kfp->sf_sc.sc_ap);
+       }
+#endif
+
+       /*
+        * Signal trampoline code is at base of user stack.
+        */
+       frame->f_pc = (int)PS_STRINGS - (esigcode - sigcode);
+#ifdef DEBUG
+       if ((hpuxsigdebug & SDB_KSTACK) && p->p_pid == hpuxsigpid)
+               printf("hpux_sendsig(%d): sig %d returns\n",
+                      p->p_pid, sig);
+#endif
+       free((caddr_t)kfp, M_TEMP);
+}
+
+/*
+ * System call to cleanup state after a signal
+ * has been taken.  Reset signal mask and
+ * stack state from context left by sendsig (above).
+ * Return to previous pc and psl as specified by
+ * context left by sendsig. Check carefully to
+ * make sure that the user has not modified the
+ * psl to gain improper priviledges or to cause
+ * a machine fault.
+ */
+/* ARGSUSED */
+int
+hpux_sys_sigreturn(p, v, retval)
+       struct proc *p;
+       void *v;
+       register_t *retval;
+{
+       struct hpux_sys_sigreturn_args /* {
+               syscallarg(struct hpuxsigcontext *) sigcntxp;
+       } */ *uap = v;
+       register struct hpuxsigcontext *scp;
+       register struct frame *frame;
+       register int rf;
+       struct hpuxsigcontext tsigc;
+       struct hpuxsigstate tstate;
+       int flags;
+
+       scp = SCARG(uap, sigcntxp);
+#ifdef DEBUG
+       if (hpuxsigdebug & SDB_FOLLOW)
+               printf("sigreturn: pid %d, scp %x\n", p->p_pid, scp);
+#endif
+       if ((int)scp & 1)
+               return (EINVAL);
+
+       /*
+        * Fetch and test the HP-UX context structure.
+        * We grab it all at once for speed.
+        */
+       if (useracc((caddr_t)scp, sizeof (*scp), B_WRITE) == 0 ||
+           copyin((caddr_t)scp, (caddr_t)&tsigc, sizeof tsigc))
+               return (EINVAL);
+       scp = &tsigc;
+       if ((scp->hsc_ps & (PSL_MBZ|PSL_IPL|PSL_S)) != 0)
+               return (EINVAL);
+
+       /*
+        * Restore the user supplied information
+        */
+       if (scp->hsc_onstack & 01)
+               p->p_sigacts->ps_sigstk.ss_flags |= SS_ONSTACK;
+       else
+               p->p_sigacts->ps_sigstk.ss_flags &= ~SS_ONSTACK;
+       p->p_sigmask = scp->hsc_mask &~ sigcantmask;
+       frame = (struct frame *) p->p_md.md_regs;
+       frame->f_regs[SP] = scp->hsc_sp;
+       frame->f_pc = scp->hsc_pc;
+       frame->f_sr = scp->hsc_ps;
+
+       /*
+        * Grab a pointer to the hpuxsigstate.
+        * If zero, the user is probably doing a longjmp.
+        * (This will never happen, really, since HP-UX doesn't
+        * know/care about the state pointer.)
+        */
+       if ((rf = scp->_hsc_ap) == 0)
+               return (EJUSTRETURN);
+
+       /*
+        * See if there is anything to do before we go to the
+        * expense of copying in close to 1/2K of data
+        */
+       flags = fuword((caddr_t)rf);
+#ifdef DEBUG
+       if (hpuxsigdebug & SDB_FOLLOW)
+               printf("sigreturn(%d): sc_ap %x flags %x\n",
+                      p->p_pid, rf, flags);
+#endif
+       /*
+        * fuword failed (bogus _hsc_ap value).
+        */
+       if (flags == -1)
+               return (EINVAL);
+       if (flags == 0 || copyin((caddr_t)rf, (caddr_t)&tstate, sizeof tstate))
+               return (EJUSTRETURN);
+#ifdef DEBUG
+       if ((hpuxsigdebug & SDB_KSTACK) && p->p_pid == hpuxsigpid)
+               printf("sigreturn(%d): ssp %x usp %x scp %x ft %d\n",
+                      p->p_pid, &flags, scp->sc_sp, SCARG(uap, sigcntxp),
+                      (flags & HSS_RTEFRAME) ? tstate.ss_frame.f_format : -1);
+#endif
+       /*
+        * Restore most of the users registers except for A6 and SP
+        * which were handled above.
+        */
+       if (flags & HSS_USERREGS)
+               bcopy((caddr_t)tstate.hss_frame.f_regs,
+                   (caddr_t)frame->f_regs, sizeof(frame->f_regs)-2*NBPW);
+
+       /*
+        * Restore long stack frames.  Note that we do not copy
+        * back the saved SR or PC, they were picked up above from
+        * the sigcontext structure.
+        */
+       if (flags & HSS_RTEFRAME) {
+               register int sz;
+               
+               /* grab frame type and validate */
+               sz = tstate.hss_frame.f_format;
+               if (sz > 15 || (sz = exframesize[sz]) < 0)
+                       return (EINVAL);
+               frame->f_stackadj -= sz;
+               frame->f_format = tstate.hss_frame.f_format;
+               frame->f_vector = tstate.hss_frame.f_vector;
+               bcopy((caddr_t)&tstate.hss_frame.F_u,
+                   (caddr_t)&frame->F_u, sz);
+#ifdef DEBUG
+               if (hpuxsigdebug & SDB_FOLLOW)
+                       printf("sigreturn(%d): copy in %d of frame type %d\n",
+                              p->p_pid, sz, tstate.ss_frame.f_format);
+#endif
+       }
+
+       /*
+        * Finally we restore the original FP context
+        */
+       if (flags & HSS_FPSTATE)
+               m68881_restore(&tstate.hss_fpstate);
+
+#ifdef DEBUG
+       if ((hpuxsigdebug & SDB_FPSTATE) && *(char *)&tstate.ss_fpstate)
+               printf("sigreturn(%d): copied in FP state (%x) at %x\n",
+                      p->p_pid, *(u_int *)&tstate.ss_fpstate,
+                      &tstate.ss_fpstate);
+
+       if ((hpuxsigdebug & SDB_FOLLOW) ||
+           ((hpuxsigdebug & SDB_KSTACK) && p->p_pid == hpuxsigpid))
+               printf("sigreturn(%d): returns\n", p->p_pid);
+#endif
+       return (EJUSTRETURN);
+}
+
+/*
+ * Set registers on exec.
+ * XXX Should clear registers except sp, pc.
+ */
+void
+hpux_setregs(p, pack, stack, retval)
+       register struct proc *p;
+       struct exec_package *pack;
+       u_long stack;
+       register_t *retval;
+{
+       struct frame *frame = (struct frame *)p->p_md.md_regs;
+
+       frame->f_pc = pack->ep_entry & ~1;
+       frame->f_regs[SP] = stack;
+       frame->f_regs[A2] = (int)PS_STRINGS;
+
+       /* restore a null state frame */
+       p->p_addr->u_pcb.pcb_fpregs.fpf_null = 0;
+       if (fputype)
+               m68881_restore(&p->p_addr->u_pcb.pcb_fpregs);
+
+       p->p_md.md_flags &= ~MDP_HPUXMMAP;
+       frame->f_regs[A0] = 0;  /* not 68010 (bit 31), no FPA (30) */
+       retval[0] = 0;          /* no float card */
+       if (fputype)
+               retval[1] = 1;  /* yes 68881 */
+       else
+               retval[1] = 0;  /* no 68881 */
+}
index b3d8ffc..3c9a6c6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: locore.s,v 1.15 1997/02/10 17:49:12 deraadt Exp $ */
+/*     $OpenBSD: locore.s,v 1.16 1997/03/31 00:24:13 downsj Exp $ */
 
 /*
  * Copyright (c) 1995 Theo de Raadt
@@ -246,6 +246,9 @@ is162:
        RELOC(_cputype, a0)             | no, we have 68040
        movl    #CPU_68040,a0@          | set to reflect 68040 CPU
 
+       RELOC(_fputype, a0)
+       movl    #FPU_68040,a0@          | and a 68040 FPU
+
        bra     is16x
 #endif
 
@@ -264,6 +267,9 @@ is167:
        RELOC(_cputype, a0)             | no, we have 68040
        movl    #CPU_68040,a0@          | set to reflect 68040 CPU
 
+       RELOC(_fputype, a0)
+       movl    #FPU_68040,a0@          | and a 68040 FPU
+
        bra     is16x
 #endif
 
@@ -479,12 +485,14 @@ Lenab1:
        movl    #USRSTACK-4,a2
        movl    a2,usp                  | init user SP
        movl    a1,_curpcb              | proc0 is running
-#ifdef FPCOPROC
+
+       tstl    _fputype                | Have an FPU?
+       jeq     Lenab2                  | No, skip.
        clrl    a1@(PCB_FPCTX)          | ensure null FP context
        movl    a1,sp@-
        jbsr    _m68881_restore         | restore it (does not kill a1)
        addql   #4,sp
-#endif
+Lenab2:
 /* flush TLB and turn on caches */
        jbsr    _TBIA                   | invalidate TLB
        cmpl    #MMU_68040,_mmutype     | 68040?
@@ -732,34 +740,41 @@ Lstkadj:
  */
 _fpfline:
 #if defined(M68040)
+       cmpl    #FPU_68040,_fputype     | 68040 FPU?
+       jne     Lfp_unimp               | no, skip FPSP
        cmpw    #0x202c,sp@(6)          | format type 2?
        jne     _illinst                | no, not an FP emulation
+Ldofp_unimp:
 #ifdef FPSP
        .globl  fpsp_unimp
        jmp     fpsp_unimp              | yes, go handle it
-#else
+#endif
+Lfp_unimp:
+#endif/* M68040 */
+#ifdef FPU_EMULATE
        clrl    sp@-                    | stack adjust count
        moveml  #0xFFFF,sp@-            | save registers
        moveq   #T_FPEMULI,d0           | denote as FP emulation trap
        jra     fault                   | do it
-#endif
 #else
        jra     _illinst
 #endif
 
 _fpunsupp:
 #if defined(M68040)
-       cmpl    #MMU_68040,_mmutype     | 68040?
+       cmpl    #FPU_68040,_fputype     | 68040 FPU?
        jne     _illinst                | no, treat as illinst
 #ifdef FPSP
        .globl  fpsp_unsupp
        jmp     fpsp_unsupp             | yes, go handle it
-#else
+#endif
+Lfp_unsupp:
+#endif /* M68040 */
+#ifdef FPU_EMULATE
        clrl    sp@-                    | stack adjust count
        moveml  #0xFFFF,sp@-            | save registers
        moveq   #T_FPEMULD,d0           | denote as FP emulation trap
        jra     fault                   | do it
-#endif
 #else
        jra     _illinst
 #endif
@@ -772,7 +787,6 @@ _fpunsupp:
  */
        .globl  _fpfault
 _fpfault:
-#ifdef FPCOPROC
        clrl    sp@-            | stack adjust count
        moveml  #0xFFFF,sp@-    | save user registers
        movl    usp,a0          | and save
@@ -781,6 +795,11 @@ _fpfault:
        movl    _curpcb,a0      | current pcb
        lea     a0@(PCB_FPCTX),a0 | address of FP savearea
        fsave   a0@             | save state
+#if defined(M68040) || defined(M68060)
+       /* always null state frame on 68040, 68060 */
+       cmpl    #CPU_68040,_cputype
+       jle     Lfptnull
+#endif
        tstb    a0@             | null state frame?
        jeq     Lfptnull        | yes, safe
        clrw    d0              | no, need to tweak BIU
@@ -791,9 +810,6 @@ Lfptnull:
        frestore a0@            | restore state
        movl    #T_FPERR,sp@-   | push type arg
        jra     Ltrapnstkadj    | call trap and deal with stack cleanup
-#else
-       jra     _badtrap        | treat as an unexpected trap
-#endif
 
 /*
  * Coprocessor and format errors can generate mid-instruction stack
@@ -917,29 +933,16 @@ Ltrap1:
        rte
 
 /*
- * Routines for traps 1 and 2.  The meaning of the two traps depends
- * on whether we are an HPUX compatible process or a native 4.3 process.
- * Our native 4.3 implementation uses trap 1 as sigreturn() and trap 2
- * as a breakpoint trap.  HPUX uses trap 1 for a breakpoint, so we have
- * to make adjustments so that trap 2 is used for sigreturn.
+ * Trap 1 - sigreturn
  */
 _trap1:
-#ifdef COMPAT_HPUX
-       btst    #MDP_TRCB,mdpflag       | being traced by an HPUX process?
-       jeq     sigreturn               | no, trap1 is sigreturn
-       jra     _trace                  | yes, trap1 is breakpoint
-#else
-       jra     sigreturn               | no, trap1 is sigreturn
-#endif
+       jra     sigreturn
 
+/*
+ * Trap 2 - trace trap
+ */
 _trap2:
-#ifdef COMPAT_HPUX
-       btst    #MDP_TRCB,mdpflag       | being traced by an HPUX process?
-       jeq     _trace                  | no, trap2 is breakpoint
-       jra     sigreturn               | yes, trap2 is sigreturn
-#else
-       jra     _trace                  | no, trap2 is breakpoint
-#endif
+       jra     _trace
 
 /*
  * Trap 12 is the entry point for the cachectl "syscall" (both HPUX & BSD)
@@ -1132,22 +1135,8 @@ Ldorte:
 #define ALTENTRY(name, rname)  ENTRY(name)
 #endif
 
-/*
- * non-local gotos
- */
-ENTRY(setjmp)
-       movl    sp@(4),a0       | savearea pointer
-       moveml  #0xFCFC,a0@     | save d2-d7/a2-a7
-       movl    sp@,a0@(48)     | and return address
-       moveq   #0,d0           | return 0
-       rts
-
-ENTRY(longjmp)
-       movl    sp@(4),a0
-       moveml  a0@+,#0xFCFC
-       movl    a0@,sp@
-       moveq   #1,d0
-       rts
+/* Use standard m68k support. */
+#include <m68k/m68k/support.s>
 
 /*
  * The following primitives manipulate the run queues.  _whichqs tells which
@@ -1292,7 +1281,7 @@ Lbadsw:
 /*
  * cpu_switch()
  *
- * NOTE: On the mc68851 (318/319/330) we attempt to avoid flushing the
+ * NOTE: On the mc68851 we attempt to avoid flushing the
  * entire ATC.  The effort involved in selective flushing may not be
  * worth it, maybe we should just flush the whole thing?
  *
@@ -1352,7 +1341,9 @@ Lsw2:
        moveml  #0xFCFC,a1@(PCB_REGS)   | save non-scratch registers
        movl    usp,a2                  | grab USP (a2 has been saved)
        movl    a2,a1@(PCB_USP)         | and save it
-#ifdef FPCOPROC
+
+       tstl    _fputype                | If we don't have an FPU,
+       jeq     Lswnofpsave             |  don't try to save it.
        lea     a1@(PCB_FPCTX),a2       | pointer to FP save area
        fsave   a2@                     | save FP state
        tstb    a2@                     | null state frame?
@@ -1360,7 +1351,6 @@ Lsw2:
        fmovem  fp0-fp7,a2@(216)        | save FP general registers
        fmovem  fpcr/fpsr/fpi,a2@(312)  | save FP control registers
 Lswnofpsave:
-#endif
 
 #ifdef DIAGNOSTIC
        tstl    a0@(P_WCHAN)
@@ -1414,7 +1404,9 @@ Lcxswdone:
        moveml  a1@(PCB_REGS),#0xFCFC   | and registers
        movl    a1@(PCB_USP),a0
        movl    a0,usp                  | and USP
-#ifdef FPCOPROC
+
+       tstl    _fputype                | If we don't have an FPU,
+       jeq     Lnofprest               |  don't try to restore it.
        lea     a1@(PCB_FPCTX),a0       | pointer to FP save area
        tstb    a0@                     | null state frame?
        jeq     Lresfprest              | yes, easy
@@ -1429,7 +1421,7 @@ Lresnot040:
        fmovem  a0@(216),fp0-fp7        | restore FP general registers
 Lresfprest:
        frestore a0@                    | restore state
-#endif
+Lnofprest:
        movw    a1@(PCB_PS),sr          | no, restore PS
        moveq   #1,d0                   | return 1 (for alternate returns)
        rts
@@ -1444,7 +1436,9 @@ ENTRY(savectx)
        movl    usp,a0                  | grab USP
        movl    a0,a1@(PCB_USP)         | and save it
        moveml  #0xFCFC,a1@(PCB_REGS)   | save non-scratch registers
-#ifdef FPCOPROC
+
+       tstl    _fputype                | If we don't have an FPU,
+       jeq     Lsvnofpsave             |  don't try to save it.
        lea     a1@(PCB_FPCTX),a0       | pointer to FP save area
        fsave   a0@                     | save FP state
        tstb    a0@                     | null state frame?
@@ -1452,7 +1446,6 @@ ENTRY(savectx)
        fmovem  fp0-fp7,a0@(216)        | save FP general registers
        fmovem  fpcr/fpsr/fpi,a0@(312)  | save FP control registers
 Lsvnofpsave:
-#endif
        moveq   #0,d0                   | return 0
        rts
 
@@ -1760,31 +1753,6 @@ ENTRY(spl0)
 Lspldone:
        rts
 
-ENTRY(_insque)
-       movw    sr,d0
-       movw    #PSL_HIGHIPL,sr         | atomic
-       movl    sp@(8),a0               | where to insert (after)
-       movl    sp@(4),a1               | element to insert (e)
-       movl    a0@,a1@                 | e->next = after->next
-       movl    a0,a1@(4)               | e->prev = after
-       movl    a1,a0@                  | after->next = e
-       movl    a1@,a0
-       movl    a1,a0@(4)               | e->next->prev = e
-       movw    d0,sr
-       rts
-
-ENTRY(_remque)
-       movw    sr,d0
-       movw    #PSL_HIGHIPL,sr         | atomic
-       movl    sp@(4),a0               | element to remove (e)
-       movl    a0@,a1
-       movl    a0@(4),a0
-       movl    a0,a1@(4)               | e->next->prev = e->prev
-       movl    a1,a0@                  | e->prev->next = e->next
-       movw    d0,sr
-       rts
-
-#ifdef FPCOPROC
 /*
  * Save and restore 68881 state.
  */
@@ -1807,7 +1775,6 @@ ENTRY(m68881_restore)
 Lm68881rdone:
        frestore a0@                    | restore state
        rts
-#endif
 
 /*
  * Handle the nitty-gritty of rebooting the machine.
@@ -1881,11 +1848,13 @@ not147:
        /*NOTREACHED*/
 
        .data
-       .globl  _mmutype,_protorp, _cputype
+       .globl  _mmutype,_protorp,_cputype,_fputype
 _mmutype:
        .long   MMU_68030       | default to MMU_68030
 _cputype:
        .long   CPU_68030       | default to CPU_68030
+_fputype:
+       .long   FPU_68881       | default to 68881 FPU
 _protorp:
        .long   0,0             | prototype root pointer
        .globl  _cold
index 3391f9a..7139591 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.20 1997/02/14 05:10:17 rahnds Exp $ */
+/*     $OpenBSD: machdep.c,v 1.21 1997/03/31 00:24:14 downsj Exp $ */
 
 /*
  * Copyright (c) 1995 Theo de Raadt
@@ -419,11 +419,12 @@ setregs(p, pack, stack, retval)
        frame->f_pc = pack->ep_entry & ~1;
        frame->f_regs[SP] = stack;
        frame->f_regs[A2] = (int)PS_STRINGS;
-#ifdef FPCOPROC
+
        /* restore a null state frame */
        p->p_addr->u_pcb.pcb_fpregs.fpf_null = 0;
-       m68881_restore(&p->p_addr->u_pcb.pcb_fpregs);
-#endif
+       if (fputype)
+               m68881_restore(&p->p_addr->u_pcb.pcb_fpregs);
+
 #ifdef COMPAT_SUNOS
        /*
         * SunOS' ld.so does self-modifying code without knowing
@@ -435,53 +436,6 @@ setregs(p, pack, stack, retval)
        else
                p->p_md.md_flags &= ~MDP_UNCACHE_WX;
 #endif
-#ifdef COMPAT_HPUX
-       p->p_md.md_flags &= ~MDP_HPUXMMAP;
-       if (p->p_emul == &emul_hpux) {
-               frame->f_regs[A0] = 0; /* not 68010 (bit 31), no FPA (30) */
-               retval[0] = 0;          /* no float card */
-#ifdef FPCOPROC
-               retval[1] = 1;          /* yes 68881 */
-#else
-               retval[1] = 0;          /* no 68881 */
-#endif
-       }
-       /*
-        * XXX This doesn't have much to do with setting registers but
-        * I didn't want to muck up kern_exec.c with this code, so I
-        * stuck it here.
-        *
-        * Ensure we perform the right action on traps type 1 and 2:
-        * If our parent is an HPUX process and we are being traced, turn
-        * on HPUX style interpretation.  Else if we were using the HPUX
-        * style interpretation, revert to the BSD interpretation.
-        *
-        * Note that we do this by changing the trap instruction in the
-        * global "sigcode" array which then gets copied out to the user's
-        * sigcode in the stack.  Since we are changing it in the global
-        * array we must always reset it, even for non-HPUX processes.
-        *
-        * Note also that implementing it in this way creates a potential
-        * race where we could have tweaked it for process A which then
-        * blocks in the copyout to the stack and process B comes along
-        * and untweaks it causing A to wind up with the wrong setting
-        * when the copyout continues.  However, since we have already
-        * copied something out to this user stack page (thereby faulting
-        * it in), this scenerio is extremely unlikely.
-        */
-       {
-               extern short sigcodetrap[];
-
-               if ((p->p_pptr->p_emul == &emul_hpux) &&
-                   (p->p_flag & P_TRACED)) {
-                       p->p_md.md_flags |= MDP_HPUXTRACE;
-                       *sigcodetrap = 0x4E42;
-               } else {
-                       p->p_md.md_flags &= ~MDP_HPUXTRACE;
-                       *sigcodetrap = 0x4E41;
-               }
-       }
-#endif
 }
 
 /*
@@ -617,438 +571,6 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
        /* NOTREACHED */
 }
 
-#define SS_RTEFRAME    1
-#define SS_FPSTATE     2
-#define SS_USERREGS    4
-
-struct sigstate {
-       int     ss_flags;               /* which of the following are valid */
-       struct  frame ss_frame;         /* original exception frame */
-       struct  fpframe ss_fpstate;     /* 68881/68882 state info */
-};
-
-/*
- * WARNING: code in locore.s assumes the layout shown for sf_signum
- * thru sf_handler so... don't screw with them!
- */
-struct sigframe {
-       int     sf_signum;              /* signo for handler */
-       siginfo_t *sf_sip;
-       struct  sigcontext *sf_scp;     /* context ptr for handler */
-       sig_t   sf_handler;             /* handler addr for u_sigc */
-       struct  sigstate sf_state;      /* state of the hardware */
-       struct  sigcontext sf_sc;       /* actual context */
-       siginfo_t sf_si;
-};
-
-#ifdef COMPAT_HPUX
-struct hpuxsigcontext {
-       int     hsc_syscall;
-       char    hsc_action;
-       char    hsc_pad1;
-       char    hsc_pad2;
-       char    hsc_onstack;
-       int     hsc_mask;
-       int     hsc_sp;
-       short   hsc_ps;
-       int     hsc_pc;
-/* the rest aren't part of the context but are included for our convenience */
-       short   hsc_pad;
-       u_int   hsc_magic;              /* XXX sigreturn: cookie */
-       struct  sigcontext *hsc_realsc; /* XXX sigreturn: ptr to BSD context */
-};
-
-/*
- * For an HP-UX process, a partial hpuxsigframe follows the normal sigframe.
- * Tremendous waste of space, but some HP-UX applications (e.g. LCL) need it.
- */
-struct hpuxsigframe {
-       int     hsf_signum;
-       int     hsf_code;
-       struct  sigcontext *hsf_scp;
-       int     hsf_nothing;
-       struct  hpuxsigcontext hsf_sc;
-       int     hsf_regs[15];
-};
-#endif
-
-#ifdef DEBUG
-int sigdebug = 0;
-int sigpid = 0;
-#define SDB_FOLLOW     0x01
-#define SDB_KSTACK     0x02
-#define SDB_FPSTATE    0x04
-#endif
-
-/*
- * Send an interrupt to process.
- */
-void
-sendsig(catcher, sig, mask, code, type, val)
-       sig_t catcher;
-       int sig, mask;
-       u_long code;
-       int type;
-       union sigval val;
-{
-       register struct proc *p = curproc;
-       register struct sigframe *fp, *kfp;
-       register struct frame *frame;
-       register struct sigacts *psp = p->p_sigacts;
-       register short ft;
-       int oonstack, fsize;
-       extern char sigcode[], esigcode[];
-
-       frame = (struct frame *)p->p_md.md_regs;
-       ft = frame->f_format;
-       oonstack = psp->ps_sigstk.ss_flags & SA_ONSTACK;
-       /*
-        * Allocate and validate space for the signal handler
-        * context. Note that if the stack is in P0 space, the
-        * call to grow() is a nop, and the useracc() check
-        * will fail if the process has not already allocated
-        * the space with a `brk'.
-        */
-#ifdef COMPAT_HPUX
-       if (p->p_emul == &emul_hpux)
-               fsize = sizeof(struct sigframe) + sizeof(struct hpuxsigframe);
-       else
-#endif
-       fsize = sizeof(struct sigframe);
-       if ((psp->ps_flags & SAS_ALTSTACK) && !oonstack &&
-           (psp->ps_sigonstack & sigmask(sig))) {
-               fp = (struct sigframe *)(psp->ps_sigstk.ss_sp +
-                                        psp->ps_sigstk.ss_size - fsize);
-               psp->ps_sigstk.ss_flags |= SA_ONSTACK;
-       } else
-               fp = (struct sigframe *)(frame->f_regs[SP] - fsize);
-       if ((unsigned)fp <= USRSTACK - ctob(p->p_vmspace->vm_ssize)) 
-               (void)grow(p, (unsigned)fp);
-#ifdef DEBUG
-       if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
-               printf("sendsig(%d): sig %d ssp %x usp %x scp %x ft %d\n",
-                      p->p_pid, sig, &oonstack, fp, &fp->sf_sc, ft);
-#endif
-       if (useracc((caddr_t)fp, fsize, B_WRITE) == 0) {
-#ifdef DEBUG
-               if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
-                       printf("sendsig(%d): useracc failed on sig %d\n",
-                              p->p_pid, sig);
-#endif
-               /*
-                * Process has trashed its stack; give it an illegal
-                * instruction to halt it in its tracks.
-                */
-               SIGACTION(p, SIGILL) = SIG_DFL;
-               sig = sigmask(SIGILL);
-               p->p_sigignore &= ~sig;
-               p->p_sigcatch &= ~sig;
-               p->p_sigmask &= ~sig;
-               psignal(p, SIGILL);
-               return;
-       }
-       kfp = (struct sigframe *)malloc((u_long)fsize, M_TEMP, M_WAITOK);
-       /* 
-        * Build the argument list for the signal handler.
-        */
-       kfp->sf_signum = sig;
-       kfp->sf_sip = NULL;
-       kfp->sf_scp = &fp->sf_sc;
-       kfp->sf_handler = catcher;
-
-       /*
-        * Save necessary hardware state.  Currently this includes:
-        *      - general registers
-        *      - original exception frame (if not a "normal" frame)
-        *      - FP coprocessor state
-        */
-       kfp->sf_state.ss_flags = SS_USERREGS;
-       bcopy((caddr_t)frame->f_regs,
-             (caddr_t)kfp->sf_state.ss_frame.f_regs, sizeof frame->f_regs);
-       if (ft >= FMT7) {
-#ifdef DEBUG
-               if (ft > 15 || exframesize[ft] < 0)
-                       panic("sendsig: bogus frame type");
-#endif
-               kfp->sf_state.ss_flags |= SS_RTEFRAME;
-               kfp->sf_state.ss_frame.f_format = frame->f_format;
-               kfp->sf_state.ss_frame.f_vector = frame->f_vector;
-               bcopy((caddr_t)&frame->F_u,
-                     (caddr_t)&kfp->sf_state.ss_frame.F_u, exframesize[ft]);
-               /*
-                * Leave an indicator that we need to clean up the kernel
-                * stack.  We do this by setting the "pad word" above the
-                * hardware stack frame to the amount the stack must be
-                * adjusted by.
-                *
-                * N.B. we increment rather than just set f_stackadj in
-                * case we are called from syscall when processing a
-                * sigreturn.  In that case, f_stackadj may be non-zero.
-                */
-               frame->f_stackadj += exframesize[ft];
-               frame->f_format = frame->f_vector = 0;
-#ifdef DEBUG
-               if (sigdebug & SDB_FOLLOW)
-                       printf("sendsig(%d): copy out %d of frame %d\n",
-                              p->p_pid, exframesize[ft], ft);
-#endif
-       }
-#ifdef FPCOPROC
-       kfp->sf_state.ss_flags |= SS_FPSTATE;
-       m68881_save(&kfp->sf_state.ss_fpstate);
-#ifdef DEBUG
-       if ((sigdebug & SDB_FPSTATE) && *(char *)&kfp->sf_state.ss_fpstate)
-               printf("sendsig(%d): copy out FP state (%x) to %x\n",
-                      p->p_pid, *(u_int *)&kfp->sf_state.ss_fpstate,
-                      &kfp->sf_state.ss_fpstate);
-#endif
-#endif
-       /*
-        * Build the signal context to be used by sigreturn.
-        */
-       kfp->sf_sc.sc_onstack = oonstack;
-       kfp->sf_sc.sc_mask = mask;
-       kfp->sf_sc.sc_sp = frame->f_regs[SP];
-       kfp->sf_sc.sc_fp = frame->f_regs[A6];
-       kfp->sf_sc.sc_ap = (int)&fp->sf_state;
-       kfp->sf_sc.sc_pc = frame->f_pc;
-       kfp->sf_sc.sc_ps = frame->f_sr;
-
-       if (psp->ps_siginfo & sigmask(sig)) {
-               kfp->sf_sip = &fp->sf_si;
-               initsiginfo(&kfp->sf_si, sig, code, type, val);
-       }
-
-#ifdef COMPAT_HPUX
-       /*
-        * Create an HP-UX style sigcontext structure and associated goo
-        */
-       if (p->p_emul == &emul_hpux) {
-               register struct hpuxsigframe *hkfp;
-
-               hkfp = (struct hpuxsigframe *)&kfp[1];
-               hkfp->hsf_signum = bsdtohpuxsig(kfp->sf_signum);
-               hkfp->hsf_code = kfp->sf_code;
-               hkfp->hsf_scp = (struct sigcontext *)
-                       &((struct hpuxsigframe *)(&fp[1]))->hsf_sc;
-               hkfp->hsf_sc.hsc_syscall = 0;           /* XXX */
-               hkfp->hsf_sc.hsc_action = 0;            /* XXX */
-               hkfp->hsf_sc.hsc_pad1 = hkfp->hsf_sc.hsc_pad2 = 0;
-               hkfp->hsf_sc.hsc_onstack = kfp->sf_sc.sc_onstack;
-               hkfp->hsf_sc.hsc_mask = kfp->sf_sc.sc_mask;
-               hkfp->hsf_sc.hsc_sp = kfp->sf_sc.sc_sp;
-               hkfp->hsf_sc.hsc_ps = kfp->sf_sc.sc_ps;
-               hkfp->hsf_sc.hsc_pc = kfp->sf_sc.sc_pc;
-               hkfp->hsf_sc.hsc_pad = 0;
-               hkfp->hsf_sc.hsc_magic = 0xdeadbeef;
-               hkfp->hsf_sc.hsc_realsc = kfp->sf_scp;
-               bcopy((caddr_t)frame->f_regs, (caddr_t)hkfp->hsf_regs,
-                     sizeof (hkfp->hsf_regs));
-
-               kfp->sf_signum = hkfp->hsf_signum;
-               kfp->sf_scp = hkfp->hsf_scp;
-       }
-#endif
-       /* XXX do not copy out siginfo if not needed */
-       (void) copyout((caddr_t)kfp, (caddr_t)fp, fsize);
-       frame->f_regs[SP] = (int)fp;
-#ifdef DEBUG
-       if (sigdebug & SDB_FOLLOW)
-               printf("sendsig(%d): sig %d scp %x fp %x sc_sp %x sc_ap %x\n",
-                      p->p_pid, sig, kfp->sf_scp, fp,
-                      kfp->sf_sc.sc_sp, kfp->sf_sc.sc_ap);
-#endif
-       /*
-        * Signal trampoline code is at base of user stack.
-        */
-       frame->f_pc = (int)PS_STRINGS - (esigcode - sigcode);
-#ifdef DEBUG
-       if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
-               printf("sendsig(%d): sig %d returns\n",
-                      p->p_pid, sig);
-#endif
-       free((caddr_t)kfp, M_TEMP);
-}
-
-/*
- * System call to cleanup state after a signal
- * has been taken.  Reset signal mask and
- * stack state from context left by sendsig (above).
- * Return to previous pc and psl as specified by
- * context left by sendsig. Check carefully to
- * make sure that the user has not modified the
- * psl to gain improper priviledges or to cause
- * a machine fault.
- */
-/* ARGSUSED */
-sys_sigreturn(p, v, retval)
-       struct proc *p;
-       void *v;
-       register_t *retval;
-{
-       struct sys_sigreturn_args /* {
-               syscallarg(struct sigcontext *) sigcntxp;
-       } */ *uap = v;
-       register struct sigcontext *scp;
-       register struct frame *frame;
-       register int rf;
-       struct sigcontext tsigc;
-       struct sigstate tstate;
-       int flags;
-
-       scp = SCARG(uap, sigcntxp);
-#ifdef DEBUG
-       if (sigdebug & SDB_FOLLOW)
-               printf("sigreturn: pid %d, scp %x\n", p->p_pid, scp);
-#endif
-       if ((int)scp & 1)
-               return (EINVAL);
-#ifdef COMPAT_HPUX
-       /*
-        * Grab context as an HP-UX style context and determine if it
-        * was one that we contructed in sendsig.
-        */
-       if (p->p_emul == &emul_hpux) {
-               struct hpuxsigcontext *hscp = (struct hpuxsigcontext *)scp;
-               struct hpuxsigcontext htsigc;
-
-               if (useracc((caddr_t)hscp, sizeof (*hscp), B_WRITE) == 0 ||
-                   copyin((caddr_t)hscp, (caddr_t)&htsigc, sizeof htsigc))
-                       return (EINVAL);
-               /*
-                * If not generated by sendsig or we cannot restore the
-                * BSD-style sigcontext, just restore what we can -- state
-                * will be lost, but them's the breaks.
-                */
-               hscp = &htsigc;
-               if (hscp->hsc_magic != 0xdeadbeef ||
-                   (scp = hscp->hsc_realsc) == 0 ||
-                   useracc((caddr_t)scp, sizeof (*scp), B_WRITE) == 0 ||
-                   copyin((caddr_t)scp, (caddr_t)&tsigc, sizeof tsigc)) {
-                       if (hscp->hsc_onstack & 01)
-                               p->p_sigacts->ps_sigstk.ss_flags |= SA_ONSTACK;
-                       else
-                               p->p_sigacts->ps_sigstk.ss_flags &= ~SA_ONSTACK;
-                       p->p_sigmask = hscp->hsc_mask &~ sigcantmask;
-                       frame = (struct frame *) p->p_md.md_regs;
-                       frame->f_regs[SP] = hscp->hsc_sp;
-                       frame->f_pc = hscp->hsc_pc;
-                       frame->f_sr = hscp->hsc_ps &~ PSL_USERCLR;
-                       return (EJUSTRETURN);
-               }
-               /*
-                * Otherwise, overlay BSD context with possibly modified
-                * HP-UX values.
-                */
-               tsigc.sc_onstack = hscp->hsc_onstack;
-               tsigc.sc_mask = hscp->hsc_mask;
-               tsigc.sc_sp = hscp->hsc_sp;
-               tsigc.sc_ps = hscp->hsc_ps;
-               tsigc.sc_pc = hscp->hsc_pc;
-       } else
-#endif
-       /*
-        * Test and fetch the context structure.
-        * We grab it all at once for speed.
-        */
-       if (useracc((caddr_t)scp, sizeof (*scp), B_WRITE) == 0 ||
-           copyin((caddr_t)scp, (caddr_t)&tsigc, sizeof tsigc))
-               return (EINVAL);
-       scp = &tsigc;
-       if ((scp->sc_ps & (PSL_MBZ|PSL_IPL|PSL_S)) != 0)
-               return (EINVAL);
-       /*
-        * Restore the user supplied information
-        */
-       if (scp->sc_onstack & 01)
-               p->p_sigacts->ps_sigstk.ss_flags |= SA_ONSTACK;
-       else
-               p->p_sigacts->ps_sigstk.ss_flags &= ~SA_ONSTACK;
-       p->p_sigmask = scp->sc_mask &~ sigcantmask;
-       frame = (struct frame *) p->p_md.md_regs;
-       frame->f_regs[SP] = scp->sc_sp;
-       frame->f_regs[A6] = scp->sc_fp;
-       frame->f_pc = scp->sc_pc;
-       frame->f_sr = scp->sc_ps;
-       /*
-        * Grab pointer to hardware state information.
-        * If zero, the user is probably doing a longjmp.
-        */
-       if ((rf = scp->sc_ap) == 0)
-               return (EJUSTRETURN);
-       /*
-        * See if there is anything to do before we go to the
-        * expense of copying in close to 1/2K of data
-        */
-       flags = fuword((caddr_t)rf);
-#ifdef DEBUG
-       if (sigdebug & SDB_FOLLOW)
-               printf("sigreturn(%d): sc_ap %x flags %x\n",
-                   p->p_pid, rf, flags);
-#endif
-       /*
-        * fuword failed (bogus sc_ap value).
-        */
-       if (flags == -1)
-               return (EINVAL);
-       if (flags == 0 || copyin((caddr_t)rf, (caddr_t)&tstate, sizeof tstate))
-               return (EJUSTRETURN);
-#ifdef DEBUG
-       if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
-               printf("sigreturn(%d): ssp %x usp %x scp %x ft %d\n",
-                   p->p_pid, &flags, scp->sc_sp, SCARG(uap, sigcntxp),
-                   (flags&SS_RTEFRAME) ? tstate.ss_frame.f_format : -1);
-#endif
-       /*
-        * Restore most of the users registers except for A6 and SP
-        * which were handled above.
-        */
-       if (flags & SS_USERREGS)
-               bcopy((caddr_t)tstate.ss_frame.f_regs,
-                   (caddr_t)frame->f_regs, sizeof(frame->f_regs)-2*NBPW);
-       /*
-        * Restore long stack frames.  Note that we do not copy
-        * back the saved SR or PC, they were picked up above from
-        * the sigcontext structure.
-        */
-       if (flags & SS_RTEFRAME) {
-               register int sz;
-               
-               /* grab frame type and validate */
-               sz = tstate.ss_frame.f_format;
-               if (sz > 15 || (sz = exframesize[sz]) < 0)
-                       return (EINVAL);
-               frame->f_stackadj -= sz;
-               frame->f_format = tstate.ss_frame.f_format;
-               frame->f_vector = tstate.ss_frame.f_vector;
-               bcopy((caddr_t)&tstate.ss_frame.F_u, (caddr_t)&frame->F_u, sz);
-#ifdef DEBUG
-               if (sigdebug & SDB_FOLLOW)
-                       printf("sigreturn(%d): copy in %d of frame type %d\n",
-                           p->p_pid, sz, tstate.ss_frame.f_format);
-#endif
-       }
-#ifdef FPCOPROC
-       /*
-        * Finally we restore the original FP context
-        */
-       if (flags & SS_FPSTATE)
-               m68881_restore(&tstate.ss_fpstate);
-#ifdef DEBUG
-       if ((sigdebug & SDB_FPSTATE) && *(char *)&tstate.ss_fpstate)
-               printf("sigreturn(%d): copied in FP state (%x) at %x\n",
-                   p->p_pid, *(u_int *)&tstate.ss_fpstate,
-                   &tstate.ss_fpstate);
-#endif
-#endif
-#ifdef DEBUG
-       if ((sigdebug & SDB_FOLLOW) ||
-           ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid))
-               printf("sigreturn(%d): returns\n", p->p_pid);
-#endif
-       return (EJUSTRETURN);
-}
-
 int    waittime = -1;
 
 static struct haltvec *halts;
index f46ac56..9a4ed40 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.15 1997/02/24 13:00:54 deraadt Exp $ */
+/*     $OpenBSD: trap.c,v 1.16 1997/03/31 00:24:16 downsj Exp $ */
 
 /*
  * Copyright (c) 1995 Theo de Raadt
@@ -320,9 +320,7 @@ copyfault:
                i = SIGBUS;
                break;
 
-#ifdef FPCOPROC
        case T_COPERR:          /* kernel coprocessor violation */
-#endif
        case T_FMTERR|T_USER:   /* do all RTE errors come in as T_USER? */
        case T_FMTERR:          /* ...just in case... */
        /*
@@ -343,7 +341,6 @@ copyfault:
                v = frame.f_pc;
                break;
 
-#ifdef FPCOPROC
        case T_COPERR|T_USER:   /* user coprocessor violation */
        /* What is a proper response here? */
                typ = FPE_FLTINV;
@@ -366,7 +363,6 @@ copyfault:
                i = SIGFPE;
                v = frame.f_pc;
                break;
-#endif
 
 #ifdef M68040
        case T_FPEMULI|T_USER:  /* unimplemented FP instuction */
index ac04b72..e51c2c5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vm_machdep.c,v 1.7 1996/06/11 10:15:58 deraadt Exp $ */
+/*     $OpenBSD: vm_machdep.c,v 1.8 1997/03/31 00:24:17 downsj Exp $ */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -76,8 +76,6 @@ cpu_fork(p1, p2)
        extern struct pcb *curpcb;
        extern void proc_trampoline(), child_return();
 
-       p2->p_md.md_flags = p1->p_md.md_flags & ~MDP_HPUXTRACE;
-
        /* Sync curpcb (which is presumably p1's PCB) and copy it to p2. */
        savectx(curpcb);
        *pcb = p1->p_addr->u_pcb;
@@ -145,18 +143,6 @@ cpu_coredump(p, vp, cred, chdr)
        struct ucred *cred;
        struct core *chdr;
 {
-
-#ifdef COMPAT_HPUX
-       extern struct emul emul_hpux;
-
-       /*
-        * If we loaded from an HP-UX format binary file we dump enough
-        * of an HP-UX style user struct so that the HP-UX debuggers can
-        * grok it.
-        */
-       if (p->p_emul == &emul_hpux)
-               return (hpux_dumpu(vp, cred));
-#endif
        return (vn_rdwr(UIO_WRITE, vp, (caddr_t) p->p_addr, USPACE,
            (off_t)0, UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, cred, (int *) NULL,
            p));