Module Name: src Committed By: tsutsui Date: Tue Nov 15 12:23:23 UTC 2011
Modified Files: src/sys/arch/atari/conf: files.atari src/sys/arch/atari/include: cpu.h src/sys/arch/m68k/include: m68k.h src/sys/arch/mac68k/conf: files.mac68k src/sys/arch/sun3/conf: files.sun3 src/sys/arch/x68k/conf: files.x68k src/sys/arch/x68k/include: cpu.h Added Files: src/sys/arch/atari/atari: fpu_machdep.c src/sys/arch/m68k/m68k: fpu.c src/sys/arch/mac68k/mac68k: fpu_machdep.c src/sys/arch/sun3/sun3: fpu_machdep.c Removed Files: src/sys/arch/atari/atari: fpu.c src/sys/arch/mac68k/mac68k: fpu.c src/sys/arch/sun3/sun3: fpu.c src/sys/arch/x68k/x68k: fpu.c Log Message: Merge copy-and-pasted fpu_probe() function (to share it among more m68k ports). Tested on TT030, Sun3/80, and X68030. To generate a diff of this commit: cvs rdiff -u -r1.15 -r0 src/sys/arch/atari/atari/fpu.c cvs rdiff -u -r0 -r1.1 src/sys/arch/atari/atari/fpu_machdep.c cvs rdiff -u -r1.119 -r1.120 src/sys/arch/atari/conf/files.atari cvs rdiff -u -r1.67 -r1.68 src/sys/arch/atari/include/cpu.h cvs rdiff -u -r1.19 -r1.20 src/sys/arch/m68k/include/m68k.h cvs rdiff -u -r0 -r1.1 src/sys/arch/m68k/m68k/fpu.c cvs rdiff -u -r1.124 -r1.125 src/sys/arch/mac68k/conf/files.mac68k cvs rdiff -u -r1.38 -r0 src/sys/arch/mac68k/mac68k/fpu.c cvs rdiff -u -r0 -r1.1 src/sys/arch/mac68k/mac68k/fpu_machdep.c cvs rdiff -u -r1.79 -r1.80 src/sys/arch/sun3/conf/files.sun3 cvs rdiff -u -r1.25 -r0 src/sys/arch/sun3/sun3/fpu.c cvs rdiff -u -r0 -r1.1 src/sys/arch/sun3/sun3/fpu_machdep.c cvs rdiff -u -r1.74 -r1.75 src/sys/arch/x68k/conf/files.x68k cvs rdiff -u -r1.54 -r1.55 src/sys/arch/x68k/include/cpu.h cvs rdiff -u -r1.14 -r0 src/sys/arch/x68k/x68k/fpu.c 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/atari/conf/files.atari diff -u src/sys/arch/atari/conf/files.atari:1.119 src/sys/arch/atari/conf/files.atari:1.120 --- src/sys/arch/atari/conf/files.atari:1.119 Sun Jun 12 03:35:39 2011 +++ src/sys/arch/atari/conf/files.atari Tue Nov 15 12:23:21 2011 @@ -1,5 +1,5 @@ # -# $NetBSD: files.atari,v 1.119 2011/06/12 03:35:39 rmind Exp $ +# $NetBSD: files.atari,v 1.120 2011/11/15 12:23:21 tsutsui Exp $ maxpartitions 16 @@ -212,11 +212,12 @@ file arch/atari/atari/mainbus.c file arch/atari/atari/pmap_bootstrap.c file arch/atari/atari/trap.c file arch/atari/atari/stalloc.c -file arch/atari/atari/fpu.c +file arch/atari/atari/fpu_machdep.c file arch/atari/dev/ym2149.c _atarihw_ file arch/atari/atari/intr.c file arch/m68k/m68k/cacheops.c file arch/m68k/m68k/db_memrw.c ddb +file arch/m68k/m68k/fpu.c file arch/m68k/m68k/pmap_motorola.c file arch/m68k/m68k/procfs_machdep.c procfs file arch/m68k/m68k/sys_machdep.c Index: src/sys/arch/atari/include/cpu.h diff -u src/sys/arch/atari/include/cpu.h:1.67 src/sys/arch/atari/include/cpu.h:1.68 --- src/sys/arch/atari/include/cpu.h:1.67 Mon May 16 13:22:52 2011 +++ src/sys/arch/atari/include/cpu.h Tue Nov 15 12:23:22 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.67 2011/05/16 13:22:52 tsutsui Exp $ */ +/* $NetBSD: cpu.h,v 1.68 2011/11/15 12:23:22 tsutsui Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -160,7 +160,6 @@ void config_console(void); * Prototypes from fpu.c */ const char *fpu_describe(int); -int fpu_probe(void); /* * Prototypes from locore.s Index: src/sys/arch/m68k/include/m68k.h diff -u src/sys/arch/m68k/include/m68k.h:1.19 src/sys/arch/m68k/include/m68k.h:1.20 --- src/sys/arch/m68k/include/m68k.h:1.19 Mon May 16 13:22:53 2011 +++ src/sys/arch/m68k/include/m68k.h Tue Nov 15 12:23:22 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: m68k.h,v 1.19 2011/05/16 13:22:53 tsutsui Exp $ */ +/* $NetBSD: m68k.h,v 1.20 2011/11/15 12:23:22 tsutsui Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -118,6 +118,9 @@ void setfunc_trampoline(void); void w16zero(void *, u_int); void w16copy(const void *, void *, u_int); +/* fpu.c */ +int fpu_probe(void); + #ifdef MAPPEDCOPY /* mappedcopy.c */ int mappedcopyin(void *fromp, void *top, size_t count); Index: src/sys/arch/mac68k/conf/files.mac68k diff -u src/sys/arch/mac68k/conf/files.mac68k:1.124 src/sys/arch/mac68k/conf/files.mac68k:1.125 --- src/sys/arch/mac68k/conf/files.mac68k:1.124 Sun Jun 12 03:35:43 2011 +++ src/sys/arch/mac68k/conf/files.mac68k Tue Nov 15 12:23:22 2011 @@ -1,4 +1,4 @@ -# $NetBSD: files.mac68k,v 1.124 2011/06/12 03:35:43 rmind Exp $ +# $NetBSD: files.mac68k,v 1.125 2011/11/15 12:23:22 tsutsui Exp $ # mac68k-specific configuration info @@ -158,7 +158,7 @@ file arch/mac68k/mac68k/bus_space.c file arch/mac68k/mac68k/clock.c file arch/mac68k/mac68k/conf.c file arch/mac68k/mac68k/disksubr.c disk -file arch/mac68k/mac68k/fpu.c +file arch/mac68k/mac68k/fpu_machdep.c file arch/mac68k/mac68k/intr.c file arch/mac68k/mac68k/iop.c file arch/mac68k/mac68k/machdep.c @@ -174,6 +174,7 @@ file arch/mac68k/mac68k/via.c file arch/m68k/m68k/bus_dma.c file arch/m68k/m68k/cacheops.c file arch/m68k/m68k/db_memrw.c ddb | kgdb +file arch/m68k/m68k/fpu.c file arch/m68k/m68k/kgdb_machdep.c kgdb file arch/m68k/m68k/pmap_motorola.c file arch/m68k/m68k/procfs_machdep.c procfs Index: src/sys/arch/sun3/conf/files.sun3 diff -u src/sys/arch/sun3/conf/files.sun3:1.79 src/sys/arch/sun3/conf/files.sun3:1.80 --- src/sys/arch/sun3/conf/files.sun3:1.79 Sun Jun 12 03:35:48 2011 +++ src/sys/arch/sun3/conf/files.sun3 Tue Nov 15 12:23:22 2011 @@ -1,4 +1,4 @@ -# $NetBSD: files.sun3,v 1.79 2011/06/12 03:35:48 rmind Exp $ +# $NetBSD: files.sun3,v 1.80 2011/11/15 12:23:22 tsutsui Exp $ # # sun3-specific configuration info @@ -33,12 +33,13 @@ file arch/sun3/sun3x/pmap.c _sun3x_ file arch/sun3/sun3/autoconf.c file arch/sun3/sun3/db_machdep.c ddb file arch/sun3/sun3/db_memrw.c ddb | kgdb -file arch/sun3/sun3/fpu.c +file arch/sun3/sun3/fpu_machdep.c file arch/sun3/sun3/leds.c file arch/sun3/sun3/sunmon.c file arch/sun3/sun3/sys_machdep.c file arch/sun3/sun3/trap.c file arch/m68k/m68k/cacheops.c _sun3x_ +file arch/m68k/m68k/fpu.c include "arch/m68k/fpe/files.fpe" Index: src/sys/arch/x68k/conf/files.x68k diff -u src/sys/arch/x68k/conf/files.x68k:1.74 src/sys/arch/x68k/conf/files.x68k:1.75 --- src/sys/arch/x68k/conf/files.x68k:1.74 Sun Jun 12 03:35:49 2011 +++ src/sys/arch/x68k/conf/files.x68k Tue Nov 15 12:23:22 2011 @@ -1,4 +1,4 @@ -# $NetBSD: files.x68k,v 1.74 2011/06/12 03:35:49 rmind Exp $ +# $NetBSD: files.x68k,v 1.75 2011/11/15 12:23:22 tsutsui Exp $ # # new style config file for x68k architecture # @@ -30,10 +30,10 @@ file arch/x68k/x68k/disksubr.c disk file arch/x68k/x68k/machdep.c file arch/x68k/x68k/pmap_bootstrap.c compile-with "${NOPROF_C}" file arch/x68k/x68k/trap.c -file arch/x68k/x68k/fpu.c file arch/x68k/x68k/bus.c file arch/m68k/m68k/cacheops.c file arch/m68k/m68k/db_memrw.c ddb +file arch/m68k/m68k/fpu.c file arch/m68k/m68k/pmap_motorola.c file arch/m68k/m68k/procfs_machdep.c procfs file arch/m68k/m68k/sys_machdep.c Index: src/sys/arch/x68k/include/cpu.h diff -u src/sys/arch/x68k/include/cpu.h:1.54 src/sys/arch/x68k/include/cpu.h:1.55 --- src/sys/arch/x68k/include/cpu.h:1.54 Mon May 16 13:22:55 2011 +++ src/sys/arch/x68k/include/cpu.h Tue Nov 15 12:23:23 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.54 2011/05/16 13:22:55 tsutsui Exp $ */ +/* $NetBSD: cpu.h,v 1.55 2011/11/15 12:23:23 tsutsui Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -127,9 +127,6 @@ extern int machineid; extern uint8_t *intiobase; extern uint8_t *intiolimit; -/* fpu.c functions */ -int fpu_probe(void); - /* machdep.c functions */ void dumpsys(void); Added files: Index: src/sys/arch/atari/atari/fpu_machdep.c diff -u /dev/null src/sys/arch/atari/atari/fpu_machdep.c:1.1 --- /dev/null Tue Nov 15 12:23:23 2011 +++ src/sys/arch/atari/atari/fpu_machdep.c Tue Nov 15 12:23:21 2011 @@ -0,0 +1,75 @@ +/* $NetBSD: fpu_machdep.c,v 1.1 2011/11/15 12:23:21 tsutsui Exp $ */ + +/*- + * Copyright (c) 1996 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Gordon W. Ross. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Floating Point Unit (MC68881/882/040) initialization. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: fpu_machdep.c,v 1.1 2011/11/15 12:23:21 tsutsui Exp $"); + +#include "opt_fpu_emulate.h" + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/time.h> +#include <sys/kernel.h> +#include <sys/device.h> + +#include <machine/psl.h> +#include <machine/cpu.h> +#include <machine/frame.h> + +extern int fpu_type; +extern int *nofault; + +static const char *fpu_descr[] = { +#ifdef FPU_EMULATE + [FPU_NONE] = " emulated ", +#else + [FPU_NONE] = " no ", +#endif + [FPU_68881] = " mc68881 ", + [FPU_68882] = " mc68882 ", + [FPU_68040] = "/", + [FPU_68060] = "/", + [FPU_UNKNOWN] = "??? " +}; + +const char * +fpu_describe(int type) +{ + int maxtype = sizeof(fpu_descr)/sizeof(fpu_descr[0]) - 1; + + if ((type < 0) || (type > maxtype)) + type = 0; + return fpu_descr[type]; +} Index: src/sys/arch/m68k/m68k/fpu.c diff -u /dev/null src/sys/arch/m68k/m68k/fpu.c:1.1 --- /dev/null Tue Nov 15 12:23:23 2011 +++ src/sys/arch/m68k/m68k/fpu.c Tue Nov 15 12:23:22 2011 @@ -0,0 +1,117 @@ +/* $NetBSD: fpu.c,v 1.1 2011/11/15 12:23:22 tsutsui Exp $ */ + +/*- + * Copyright (c) 1996 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Gordon W. Ross. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Floating Point Unit (MC68881/882/040/060) + * Probe for the FPU at early bootstrap. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.1 2011/11/15 12:23:22 tsutsui Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/time.h> +#include <sys/kernel.h> +#include <sys/device.h> + +#include <machine/psl.h> +#include <machine/cpu.h> +#include <machine/frame.h> + +extern int *nofault; + +int +fpu_probe(void) +{ + /* + * A 68881 idle frame is 28 bytes and a 68882's is 60 bytes. + * We, of course, need to have enough room for either. + */ + struct fpframe fpframe; + label_t faultbuf; + uint8_t b; + + nofault = (int *)&faultbuf; + if (setjmp(&faultbuf)) { + nofault = (int *)0; + return FPU_NONE; + } + + /* + * Synchronize FPU or cause a fault. + * This should leave the 881/882 in the IDLE state, + * state, so we can determine which we have by + * examining the size of the FP state frame + */ + __asm("fnop"); + + nofault = NULL; + + /* + * Presumably, if we're an 040/060 and did not take exception + * above, we have an FPU. Don't bother probing. + */ + if (cputype == CPU_68060) + return FPU_68060; + if (cputype == CPU_68040) + return FPU_68040; + + /* + * Presumably, this will not cause a fault--the fnop should + * have if this will. We save the state in order to get the + * size of the frame. + */ + __asm("fsave %0@" : : "a" (&fpframe) : "memory"); + + b = fpframe.fpf_fsize; + + /* + * Now, restore a NULL state to reset the FPU. + */ + fpframe.fpf_null = 0; + fpframe.fpf_idle.fpf_ccr = 0; + m68881_restore(&fpframe); + + /* + * The size of a 68881 IDLE frame is 0x18 + * and a 68882 frame is 0x38 + */ + if (b == 0x18) + return FPU_68881; + if (b == 0x38) + return FPU_68882; + + /* + * If it's not one of the above, we have no clue what it is. + */ + return FPU_UNKNOWN; +} Index: src/sys/arch/mac68k/mac68k/fpu_machdep.c diff -u /dev/null src/sys/arch/mac68k/mac68k/fpu_machdep.c:1.1 --- /dev/null Tue Nov 15 12:23:23 2011 +++ src/sys/arch/mac68k/mac68k/fpu_machdep.c Tue Nov 15 12:23:22 2011 @@ -0,0 +1,82 @@ +/* $NetBSD: fpu_machdep.c,v 1.1 2011/11/15 12:23:22 tsutsui Exp $ */ + +/*- + * Copyright (c) 1996 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Gordon W. Ross. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: fpu_machdep.c,v 1.1 2011/11/15 12:23:22 tsutsui Exp $"); + +#include "opt_fpu_emulate.h" + +/* + * Floating Point Unit (MC68881/882/040) initialization. + */ + +#include <sys/param.h> + +#include <machine/cpu.h> +#include <machine/frame.h> + +/* + * FPU type; emulator uses FPU_NONE + */ + +extern label_t *nofault; + +static const char *fpu_descr[] = { +#ifdef FPU_EMULATE + [FPU_NONE] = "emulator", +#else + [FPU_NONE] = "no math support", +#endif + [FPU_68881] = "mc68881", + [FPU_68882] = "mc68882", + [FPU_68040] = "mc68040", + [FPU_68060] = "mc68060", + [FPU_UNKNOWN] = "unknown" +}; + +void +initfpu(void) +{ + const char *descr; + + fputype = fpu_probe(); + + /* Generate a reference FPU idle frame. */ + if (fputype != FPU_NONE) + m68k_make_fpu_idle_frame(); + + if ((0 <= fputype) && (fputype <= 3)) + descr = fpu_descr[fputype]; + else + descr = "unknown type"; + + printf("fpu: %s\n", descr); +} Index: src/sys/arch/sun3/sun3/fpu_machdep.c diff -u /dev/null src/sys/arch/sun3/sun3/fpu_machdep.c:1.1 --- /dev/null Tue Nov 15 12:23:23 2011 +++ src/sys/arch/sun3/sun3/fpu_machdep.c Tue Nov 15 12:23:22 2011 @@ -0,0 +1,83 @@ +/* $NetBSD: fpu_machdep.c,v 1.1 2011/11/15 12:23:22 tsutsui Exp $ */ + +/*- + * Copyright (c) 1996 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Gordon W. Ross. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Floating Point Unit (MC68881/882) initialization. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD"); + +#include "opt_fpu_emulate.h" + +#include <sys/param.h> +#include <sys/systm.h> + +#include <machine/cpu.h> +#include <machine/frame.h> + +#include <sun3/sun3/machdep.h> + +static const char *fpu_descr[] = { +#ifdef FPU_EMULATE + "emulator", /* 0 */ +#else + "no math support", /* 0 */ +#endif + "mc68881", /* 1 */ + "mc68882", /* 2 */ + "mc68040 internal", /* 3 */ + "mc68060 internal", /* 4 */ + "unknown type" }; /* 5 */ + +void +initfpu(void) +{ + const char *descr; + int maxtype = sizeof(fpu_descr) / sizeof(fpu_descr[0]) - 1; + + /* Set the FPU bit in the "system enable register" */ + enable_fpu(1); + + fputype = fpu_probe(); + if (fputype < 0 || fputype > maxtype) + fputype = FPU_UNKNOWN; + + descr = fpu_descr[fputype]; + + printf("fpu: %s\n", descr); + + if (fputype == FPU_NONE) { + /* Might as well turn the enable bit back off. */ + enable_fpu(0); + } else + m68k_make_fpu_idle_frame(); +}