Module Name:    src
Committed By:   pgoyette
Date:           Tue Oct  2 01:43:53 UTC 2018

Modified Files:
        src/sys/arch/aarch64/aarch64 [pgoyette-compat]: netbsd32_machdep.c
        src/sys/arch/aarch64/conf [pgoyette-compat]: files.aarch64
        src/sys/arch/sparc/fpu [pgoyette-compat]: fpu.c
        src/sys/compat/sunos [pgoyette-compat]: sunos_mod.c
        src/sys/compat/sunos32 [pgoyette-compat]: sunos32_mod.c
        src/sys/kern [pgoyette-compat]: compat_stub.c
        src/sys/sys [pgoyette-compat]: compat_stub.h

Log Message:
Use a hook callback to allow sparc fpu code to determine if a process
is running under sunos emulation (in which case, fpu cleanup uses a
different set of fpu_codes[]).


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.3 -r1.1.2.4 \
    src/sys/arch/aarch64/aarch64/netbsd32_machdep.c
cvs rdiff -u -r1.2.2.2 -r1.2.2.3 src/sys/arch/aarch64/conf/files.aarch64
cvs rdiff -u -r1.27 -r1.27.46.1 src/sys/arch/sparc/fpu/fpu.c
cvs rdiff -u -r1.3 -r1.3.28.1 src/sys/compat/sunos/sunos_mod.c
cvs rdiff -u -r1.3 -r1.3.28.1 src/sys/compat/sunos32/sunos32_mod.c
cvs rdiff -u -r1.1.2.25 -r1.1.2.26 src/sys/kern/compat_stub.c
cvs rdiff -u -r1.1.2.37 -r1.1.2.38 src/sys/sys/compat_stub.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/aarch64/netbsd32_machdep.c
diff -u src/sys/arch/aarch64/aarch64/netbsd32_machdep.c:1.1.2.3 src/sys/arch/aarch64/aarch64/netbsd32_machdep.c:1.1.2.4
--- src/sys/arch/aarch64/aarch64/netbsd32_machdep.c:1.1.2.3	Mon Oct  1 21:19:16 2018
+++ src/sys/arch/aarch64/aarch64/netbsd32_machdep.c	Tue Oct  2 01:43:53 2018
@@ -29,9 +29,9 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: netbsd32_machdep.c,v 1.1.2.3 2018/10/01 21:19:16 pgoyette Exp $");
+__KERNEL_RCSID(1, "$NetBSD: netbsd32_machdep.c,v 1.1.2.4 2018/10/02 01:43:53 pgoyette Exp $");
 
-#if defined(_KERNEL_OPT
+#if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
 #endif
 

Index: src/sys/arch/aarch64/conf/files.aarch64
diff -u src/sys/arch/aarch64/conf/files.aarch64:1.2.2.2 src/sys/arch/aarch64/conf/files.aarch64:1.2.2.3
--- src/sys/arch/aarch64/conf/files.aarch64:1.2.2.2	Sun Sep 30 01:45:35 2018
+++ src/sys/arch/aarch64/conf/files.aarch64	Tue Oct  2 01:43:53 2018
@@ -1,4 +1,4 @@
-#	$NetBSD: files.aarch64,v 1.2.2.2 2018/09/30 01:45:35 pgoyette Exp $
+#	$NetBSD: files.aarch64,v 1.2.2.3 2018/10/02 01:43:53 pgoyette Exp $
 
 defflag opt_cpuoptions.h	AARCH64_ALIGNMENT_CHECK
 defflag opt_cpuoptions.h	AARCH64_EL0_STACK_ALIGNMENT_CHECK
@@ -118,8 +118,8 @@ include "compat/netbsd32/files.netbsd32"
 file	arch/aarch64/aarch64/netbsd32_machdep.c		compat_netbsd32
 #file	arch/aarch64/aarch32/aarch32_oabi_machdep.c	compat_aarch32_oabi
 #file	arch/aarch64/aarch32/aarch32_eabi_machdep.c	compat_aarch32_eabi
-#file	arch/aarch64/aarch32/compat_13_machdep.c	compat_13 & compat_netbsd32
-#file	arch/aarch64/aarch32/compat_16_machdep.c	compat_16 & compat_netbsd32
+file	arch/aarch64/aarch32/netbsd32_machdep_13.c	compat_13 & compat_netbsd32
+file	arch/aarch64/aarch32/netbsd32_machdep_16.c	compat_16 & compat_netbsd32
 
 # Linux binary compatibility (COMPAT_LINUX)
 #include "compat/ossaudio/files.ossaudio"

Index: src/sys/arch/sparc/fpu/fpu.c
diff -u src/sys/arch/sparc/fpu/fpu.c:1.27 src/sys/arch/sparc/fpu/fpu.c:1.27.46.1
--- src/sys/arch/sparc/fpu/fpu.c:1.27	Sun Feb 12 16:34:10 2012
+++ src/sys/arch/sparc/fpu/fpu.c	Tue Oct  2 01:43:53 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu.c,v 1.27 2012/02/12 16:34:10 matt Exp $ */
+/*	$NetBSD: fpu.c,v 1.27.46.1 2018/10/02 01:43:53 pgoyette Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.27 2012/02/12 16:34:10 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.27.46.1 2018/10/02 01:43:53 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -49,6 +49,7 @@ __KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.27
 #include <sys/systm.h>
 #include <sys/syslog.h>
 #include <sys/signalvar.h>
+#include <sys/compat_stub.h>
 
 #include <machine/instr.h>
 #include <machine/reg.h>
@@ -108,7 +109,6 @@ static u_char fpu_codes_native[] = {
 	X8(FPE_FLTOVF),
 	X16(FPE_FLTINV)
 };
-#if defined(COMPAT_SUNOS)
 static u_char fpu_codes_sunos[] = {
 	X1(FPE_FLTINEX_TRAP),
 	X2(FPE_FLTDIV_TRAP),
@@ -116,11 +116,17 @@ static u_char fpu_codes_sunos[] = {
 	X8(FPE_FLTOVF_TRAP),
 	X16(FPE_FLTOPERR_TRAP)
 };
-extern struct emul emul_sunos;
-#endif /* SUNOS_COMPAT */
+
 /* Note: SVR4(Solaris) FPE_* codes happen to be compatible with ours */
 
 /*
+ * HOOK for checking if the lwp's emul matches sunos
+ */
+MODULE_CALL_HOOK_DECL(get_emul_sunos_hook, f, (const struct emul **emul));
+MODULE_CALL_HOOK(get_emul_sunos_hook, f, (const struct emul ** emul), (emul),
+    enosys());
+
+/*
  * The FPU gave us an exception.  Clean up the mess.  Note that the
  * fp queue can only have FPops in it, never load/store FP registers
  * nor FBfcc instructions.  Experiments with `crashme' prove that
@@ -142,12 +148,13 @@ fpu_cleanup(
 	struct fpemu fe;
 	u_char *fpu_codes;
 	int code = 0;
+	const struct emul *sunos_emul;
 
-	fpu_codes =
-#ifdef COMPAT_SUNOS
-		(p->p_emul == &emul_sunos) ? fpu_codes_sunos :
-#endif
-		fpu_codes_native;
+	if (get_emul_sunos_hook_f_call(&sunos_emul) == 0 &&
+	    p->p_emul == sunos_emul)
+		fpu_codes = fpu_codes_sunos;
+	else
+		fpu_codes = fpu_codes_native;
 
 	switch ((fsr >> FSR_FTT_SHIFT) & FSR_FTT_MASK) {
 

Index: src/sys/compat/sunos/sunos_mod.c
diff -u src/sys/compat/sunos/sunos_mod.c:1.3 src/sys/compat/sunos/sunos_mod.c:1.3.28.1
--- src/sys/compat/sunos/sunos_mod.c:1.3	Fri Mar  7 01:33:44 2014
+++ src/sys/compat/sunos/sunos_mod.c	Tue Oct  2 01:43:53 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos_mod.c,v 1.3 2014/03/07 01:33:44 christos Exp $	*/
+/*	$NetBSD: sunos_mod.c,v 1.3.28.1 2018/10/02 01:43:53 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -30,13 +30,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos_mod.c,v 1.3 2014/03/07 01:33:44 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos_mod.c,v 1.3.28.1 2018/10/02 01:43:53 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/module.h>
 #include <sys/exec.h>
 #include <sys/exec_aout.h>
 #include <sys/signalvar.h>
+#include <sys/compat_stub.h>
 
 #include <machine/sunos_machdep.h>
 
@@ -60,14 +61,27 @@ static struct execsw sunos_execsw = {
 };
 
 static int
+get_sunos_emul(const struct emul **e)
+{
+
+	*e = &emul_sunos;
+	return 0;
+}
+
+MODULE_SET_HOOK(get_emul_sunos_hook, "sun_emul", get_sunos_emul);
+MODULE_UNSET_HOOK(get_emul_sunos_hook);
+
+static int
 compat_sunos_modcmd(modcmd_t cmd, void *arg)
 {
 
 	switch (cmd) {
 	case MODULE_CMD_INIT:
+		get_emul_sunos_hook_set();
 		return exec_add(&sunos_execsw, 1);
 
 	case MODULE_CMD_FINI:
+		get_emul_sunos_hook_unset();
 		return exec_remove(&sunos_execsw, 1);
 
 	default:

Index: src/sys/compat/sunos32/sunos32_mod.c
diff -u src/sys/compat/sunos32/sunos32_mod.c:1.3 src/sys/compat/sunos32/sunos32_mod.c:1.3.28.1
--- src/sys/compat/sunos32/sunos32_mod.c:1.3	Fri Mar  7 01:33:44 2014
+++ src/sys/compat/sunos32/sunos32_mod.c	Tue Oct  2 01:43:53 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos32_mod.c,v 1.3 2014/03/07 01:33:44 christos Exp $	*/
+/*	$NetBSD: sunos32_mod.c,v 1.3.28.1 2018/10/02 01:43:53 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -30,13 +30,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos32_mod.c,v 1.3 2014/03/07 01:33:44 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos32_mod.c,v 1.3.28.1 2018/10/02 01:43:53 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/module.h>
 #include <sys/exec.h>
 #include <sys/exec_aout.h>
 #include <sys/signalvar.h>
+#include <sys/compat_stub.h>
 
 #include <machine/sunos_machdep.h>
 
@@ -62,14 +63,27 @@ static struct execsw sunos_execsw = {
 };
 
 static int
+get_sunos_emul(const struct emul **e)
+{
+ 
+	*e = &emul_sunos;
+	return 0;
+}
+ 
+MODULE_SET_HOOK(get_emul_sunos_hook, "sun_emul", get_sunos_emul);
+MODULE_UNSET_HOOK(get_emul_sunos_hook);
+  
+static int
 compat_sunos_modcmd(modcmd_t cmd, void *arg)
 {
-
+ 
 	switch (cmd) {
 	case MODULE_CMD_INIT:
+		get_emul_sunos_hook_set();
 		return exec_add(&sunos_execsw, 1);
-
+ 
 	case MODULE_CMD_FINI:
+		get_emul_sunos_hook_unset();
 		return exec_remove(&sunos_execsw, 1);
 
 	default:

Index: src/sys/kern/compat_stub.c
diff -u src/sys/kern/compat_stub.c:1.1.2.25 src/sys/kern/compat_stub.c:1.1.2.26
--- src/sys/kern/compat_stub.c:1.1.2.25	Tue Sep 25 21:41:30 2018
+++ src/sys/kern/compat_stub.c	Tue Oct  2 01:43:53 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_stub.c,v 1.1.2.25 2018/09/25 21:41:30 pgoyette Exp $	*/
+/* $NetBSD: compat_stub.c,v 1.1.2.26 2018/10/02 01:43:53 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -170,3 +170,9 @@ int kern_sig_43_pgid_mask = ~0;
  * hook for kern_proc_32
  */
 struct kern_proc_32_hook_t kern_proc_32_hook;
+
+/*
+ * Hook for sparc fpu code to check if a process is running 
+ * under sunos emulation
+ */
+struct get_emul_sunos_hook_t get_emul_sunos_hook;

Index: src/sys/sys/compat_stub.h
diff -u src/sys/sys/compat_stub.h:1.1.2.37 src/sys/sys/compat_stub.h:1.1.2.38
--- src/sys/sys/compat_stub.h:1.1.2.37	Tue Sep 25 21:41:30 2018
+++ src/sys/sys/compat_stub.h	Tue Oct  2 01:43:53 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_stub.h,v 1.1.2.37 2018/09/25 21:41:30 pgoyette Exp $	*/
+/* $NetBSD: compat_stub.h,v 1.1.2.38 2018/10/02 01:43:53 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -218,4 +218,11 @@ struct ps_strings;
 MODULE_HOOK2(kern_proc_32_hook, (struct proc *, struct ps_strings *),
     (char **, size_t, vaddr_t *));
 
+/*
+ * Hook to allow sparc fpu code to see if a process is using sunos
+ * emulation, and select proper fup codes
+ */
+struct emul;
+MODULE_HOOK(get_emul_sunos_hook, (const struct emul **));
+
 #endif	/* _SYS_COMPAT_STUB_H */

Reply via email to