diff options
author | Thorsten Lockert <tholo@cvs.openbsd.org> | 2001-04-09 07:14:24 +0000 |
---|---|---|
committer | Thorsten Lockert <tholo@cvs.openbsd.org> | 2001-04-09 07:14:24 +0000 |
commit | 9b1fe5fc1ac937b51295538f4b165a1d9fc9ac95 (patch) | |
tree | c6461a4d96f7af1694080600ef5db641bf8ac344 /sys/arch/i386 | |
parent | 6f2fdb9ba0804df4f105421d41cd208c8b2f1807 (diff) |
Add emulation of Linux features to procfs; mostly from NetBSD. ok deraadt@
Diffstat (limited to 'sys/arch/i386')
-rw-r--r-- | sys/arch/i386/conf/files.i386 | 3 | ||||
-rw-r--r-- | sys/arch/i386/i386/machdep.c | 5 | ||||
-rw-r--r-- | sys/arch/i386/i386/procfs_machdep.c | 147 | ||||
-rw-r--r-- | sys/arch/i386/isa/npx.c | 12 |
4 files changed, 163 insertions, 4 deletions
diff --git a/sys/arch/i386/conf/files.i386 b/sys/arch/i386/conf/files.i386 index 47e9204fac3..bae1525b30b 100644 --- a/sys/arch/i386/conf/files.i386 +++ b/sys/arch/i386/conf/files.i386 @@ -1,4 +1,4 @@ -# $OpenBSD: files.i386,v 1.81 2001/04/07 17:17:27 niklas Exp $ +# $OpenBSD: files.i386,v 1.82 2001/04/09 07:14:14 tholo Exp $ # $NetBSD: files.i386,v 1.73 1996/05/07 00:58:36 thorpej Exp $ # # new style config file for i386 architecture @@ -33,6 +33,7 @@ file arch/i386/i386/ns_cksum.c ns file arch/i386/i386/pmap.c !pmap_old & uvm file arch/i386/i386/pmap.old.c pmap_old | !uvm file arch/i386/i386/process_machdep.c +file arch/i386/i386/procfs_machdep.c procfs file arch/i386/i386/random.s file arch/i386/i386/sys_machdep.c file arch/i386/i386/trap.c diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c index 5548dadbe13..500f07d7805 100644 --- a/sys/arch/i386/i386/machdep.c +++ b/sys/arch/i386/i386/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.154 2001/03/30 22:18:29 mickey Exp $ */ +/* $OpenBSD: machdep.c,v 1.155 2001/04/09 07:14:15 tholo Exp $ */ /* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */ /*- @@ -248,6 +248,9 @@ int dumpsize = 0; /* pages */ long dumplo = 0; /* blocks */ int cpu_class; +int i386_fpu_present; +int i386_fpu_exception; +int i386_fpu_fdivbug; bootarg_t *bootargp; vm_offset_t avail_end; diff --git a/sys/arch/i386/i386/procfs_machdep.c b/sys/arch/i386/i386/procfs_machdep.c new file mode 100644 index 00000000000..111b6e082c8 --- /dev/null +++ b/sys/arch/i386/i386/procfs_machdep.c @@ -0,0 +1,147 @@ +/* $OpenBSD: procfs_machdep.c,v 1.1 2001/04/09 07:14:16 tholo Exp $ */ +/* $NetBSD: procfs_machdep.c,v 1.6 2001/02/21 21:39:59 jdolecek Exp $ */ + +/* + * Copyright (c) 2001 Wasabi Systems, Inc. + * All rights reserved. + * + * Written by Frank van der Linden for Wasabi Systems, Inc. + * + * 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 for the NetBSD Project by + * Wasabi Systems, Inc. + * 4. The name of Wasabi Systems, Inc. may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mount.h> +#include <sys/vnode.h> +#include <miscfs/procfs/procfs.h> +#include <machine/cpu.h> +#include <machine/cpufunc.h> +#include <machine/specialreg.h> + +extern int i386_fpu_present, i386_fpu_exception, i386_fpu_fdivbug; +extern int cpu_feature; +extern char cpu_model[]; +extern char cpu_vendor[]; +extern int cpu_id, cpu_class; + +static const char * const i386_features[] = { + "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce", + "cx8", "apic", "10", "sep", "mtrr", "pge", "mca", "cmov", + "fgpat", "pse36", "psn", "19", "20", "21", "22", "mmx", + "fxsr", "xmm", "26", "27", "28", "29", "30", "31" +}; + + +/* + * Linux-style /proc/cpuinfo. + * Only used when procfs is mounted with -o linux. + * + * In the multiprocessor case, this should be a loop over all CPUs. + */ +int +procfs_getcpuinfstr(char *buf, int *len) +{ + int left, l, i; + char featurebuf[256], *p; + + p = featurebuf; + left = sizeof featurebuf; + for (i = 0; i < 32; i++) { + if (cpu_feature & (1 << i)) { + l = snprintf(p, left, "%s ", i386_features[i]); + left -= l; + p += l; + if (left <= 0) + break; + } + } + + p = buf; + left = *len; + l = snprintf(p, left, + "processor\t: %d\n" + "vendor_id\t: %s\n" + "cpu family\t: %d\n" + "model\t\t: %d\n" + "model name\t: %s\n" + "stepping\t: ", + 0, + cpu_vendor, + cpuid_level >= 0 ? ((cpu_id >> 8) & 15) : cpu_class + 3, + cpuid_level >= 0 ? ((cpu_id >> 4) & 15) : 0, + cpu_model + ); + + left -= l; + p += l; + if (left <= 0) + return 0; + + if (cpuid_level >= 0) + l = snprintf(p, left, "%d\n", cpu_id & 15); + else + l = snprintf(p, left, "unknown\n"); + + left -= l; + p += l; + if (left <= 0) + return 0; + + + if (pentium_mhz != 0) + l = snprintf(p, left, "cpu MHz\t\t: %d\n", + pentium_mhz); + else + l = snprintf(p, left, "cpu MHz\t\t: unknown\n"); + + left -= l; + p += l; + if (left <= 0) + return 0; + + l = snprintf(p, left, + "fdiv_bug\t: %s\n" + "fpu\t\t: %s\n" + "fpu_exception:\t: %s\n" + "cpuid level\t: %d\n" + "wp\t\t: %s\n" + "flags\t\t: %s\n", + i386_fpu_fdivbug ? "yes" : "no", + i386_fpu_present ? "yes" : "no", + i386_fpu_exception ? "yes" : "no", + cpuid_level, + (rcr0() & CR0_WP) ? "yes" : "no", + featurebuf); + + *len = (p + l) - buf; + + return 0; +} diff --git a/sys/arch/i386/isa/npx.c b/sys/arch/i386/isa/npx.c index 2fc02ddc9c9..2a267fa63c2 100644 --- a/sys/arch/i386/isa/npx.c +++ b/sys/arch/i386/isa/npx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: npx.c,v 1.17 2000/06/08 22:25:19 niklas Exp $ */ +/* $OpenBSD: npx.c,v 1.18 2001/04/09 07:14:16 tholo Exp $ */ /* $NetBSD: npx.c,v 1.57 1996/05/12 23:12:24 mycroft Exp $ */ #if 0 @@ -144,6 +144,10 @@ static int npx_nointr; static volatile u_int npx_intrs_while_probing; static volatile u_int npx_traps_while_probing; +extern int i386_fpu_present; +extern int i386_fpu_exception; +extern int i386_fpu_fdivbug; + /* * Special interrupt handlers. Someday intr0-intr15 will be used to count * interrupts. We'll still need a special exception 16 handler. The busy @@ -221,6 +225,7 @@ npxprobe1(ia) */ npx_type = NPX_EXCEPTION; ia->ia_irq = IRQUNK; /* zap the interrupt */ + i386_fpu_exception = 1; } else if (npx_intrs_while_probing != 0) { /* * Bad, we are stuck with IRQ13. @@ -354,9 +359,12 @@ npxattach(parent, self, aux) lcr0(rcr0() & ~(CR0_EM|CR0_TS)); fninit(); - if (npx586bug1(4195835, 3145727) != 0) + if (npx586bug1(4195835, 3145727) != 0) { + i386_fpu_fdivbug = 1; printf("WARNING: Pentium FDIV bug detected!\n"); + } lcr0(rcr0() | (CR0_TS)); + i386_fpu_present = 1; } /* |