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 */