Module Name: src Committed By: rmind Date: Thu Jul 8 11:25:00 UTC 2010
Modified Files: src/sys/arch/amd64/conf: files.amd64 src/sys/arch/i386/conf: files.i386 src/sys/arch/x86/conf: files.x86 src/sys/arch/xen/conf: files.xen Added Files: src/sys/arch/x86/x86: procfs_machdep.c Removed Files: src/sys/arch/amd64/amd64: procfs_machdep.c src/sys/arch/i386/i386: procfs_machdep.c Log Message: Unify i386 and amd64 procfs MD code into x86. To generate a diff of this commit: cvs rdiff -u -r1.15 -r0 src/sys/arch/amd64/amd64/procfs_machdep.c cvs rdiff -u -r1.68 -r1.69 src/sys/arch/amd64/conf/files.amd64 cvs rdiff -u -r1.354 -r1.355 src/sys/arch/i386/conf/files.i386 cvs rdiff -u -r1.34 -r0 src/sys/arch/i386/i386/procfs_machdep.c cvs rdiff -u -r1.54 -r1.55 src/sys/arch/x86/conf/files.x86 cvs rdiff -u -r0 -r1.1 src/sys/arch/x86/x86/procfs_machdep.c cvs rdiff -u -r1.108 -r1.109 src/sys/arch/xen/conf/files.xen 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/amd64/conf/files.amd64 diff -u src/sys/arch/amd64/conf/files.amd64:1.68 src/sys/arch/amd64/conf/files.amd64:1.69 --- src/sys/arch/amd64/conf/files.amd64:1.68 Tue Jun 16 21:05:33 2009 +++ src/sys/arch/amd64/conf/files.amd64 Thu Jul 8 11:24:59 2010 @@ -1,4 +1,4 @@ -# $NetBSD: files.amd64,v 1.68 2009/06/16 21:05:33 bouyer Exp $ +# $NetBSD: files.amd64,v 1.69 2010/07/08 11:24:59 rmind Exp $ # # new style config file for amd64 architecture # @@ -44,7 +44,6 @@ file arch/amd64/amd64/machdep.c file arch/amd64/amd64/mem.c file arch/amd64/amd64/process_machdep.c -file arch/amd64/amd64/procfs_machdep.c procfs file arch/amd64/amd64/trap.c file arch/amd64/amd64/fpu.c file arch/amd64/amd64/lock_stubs.S Index: src/sys/arch/i386/conf/files.i386 diff -u src/sys/arch/i386/conf/files.i386:1.354 src/sys/arch/i386/conf/files.i386:1.355 --- src/sys/arch/i386/conf/files.i386:1.354 Sat Apr 10 17:55:25 2010 +++ src/sys/arch/i386/conf/files.i386 Thu Jul 8 11:24:59 2010 @@ -1,4 +1,4 @@ -# $NetBSD: files.i386,v 1.354 2010/04/10 17:55:25 jruoho Exp $ +# $NetBSD: files.i386,v 1.355 2010/07/08 11:24:59 rmind Exp $ # # new style config file for i386 architecture # @@ -85,7 +85,6 @@ file arch/i386/i386/mem.c file arch/i386/i386/mtrr_k6.c mtrr file arch/i386/i386/process_machdep.c -file arch/i386/i386/procfs_machdep.c procfs file arch/i386/i386/trap.c file dev/cons.c Index: src/sys/arch/x86/conf/files.x86 diff -u src/sys/arch/x86/conf/files.x86:1.54 src/sys/arch/x86/conf/files.x86:1.55 --- src/sys/arch/x86/conf/files.x86:1.54 Mon Oct 5 23:59:31 2009 +++ src/sys/arch/x86/conf/files.x86 Thu Jul 8 11:24:59 2010 @@ -1,4 +1,4 @@ -# $NetBSD: files.x86,v 1.54 2009/10/05 23:59:31 rmind Exp $ +# $NetBSD: files.x86,v 1.55 2010/07/08 11:24:59 rmind Exp $ # options for MP configuration through the MP spec defflag opt_mpbios.h MPBIOS MPVERBOSE MPDEBUG MPBIOS_SCANPCI @@ -65,6 +65,7 @@ file arch/x86/x86/patch.c file arch/x86/x86/platform.c file arch/x86/x86/pmap.c +file arch/x86/x86/procfs_machdep.c procfs file arch/x86/x86/sys_machdep.c file arch/x86/x86/syscall.c file arch/x86/x86/vm_machdep.c Index: src/sys/arch/xen/conf/files.xen diff -u src/sys/arch/xen/conf/files.xen:1.108 src/sys/arch/xen/conf/files.xen:1.109 --- src/sys/arch/xen/conf/files.xen:1.108 Tue Jul 6 15:00:09 2010 +++ src/sys/arch/xen/conf/files.xen Thu Jul 8 11:25:00 2010 @@ -1,4 +1,4 @@ -# $NetBSD: files.xen,v 1.108 2010/07/06 15:00:09 cherry Exp $ +# $NetBSD: files.xen,v 1.109 2010/07/08 11:25:00 rmind Exp $ # NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp # NetBSD: files.i386,v 1.254 2004/03/25 23:32:10 jmc Exp @@ -62,7 +62,6 @@ file arch/i386/i386/mem.c file arch/i386/i386/mtrr_k6.c mtrr file arch/i386/i386/process_machdep.c -file arch/i386/i386/procfs_machdep.c procfs file arch/i386/i386/trap.c file arch/i386/i386/lock_stubs.S @@ -94,7 +93,6 @@ file arch/amd64/amd64/machdep.c file arch/amd64/amd64/mem.c file arch/amd64/amd64/process_machdep.c -file arch/amd64/amd64/procfs_machdep.c procfs file arch/amd64/amd64/trap.c file arch/amd64/amd64/fpu.c file arch/amd64/amd64/lock_stubs.S @@ -146,6 +144,7 @@ file arch/xen/x86/intr.c file arch/x86/x86/ipi.c file arch/x86/x86/pmap.c +file arch/x86/x86/procfs_machdep.c procfs file arch/x86/x86/sys_machdep.c file arch/x86/x86/tsc.c file arch/x86/x86/vm_machdep.c Added files: Index: src/sys/arch/x86/x86/procfs_machdep.c diff -u /dev/null src/sys/arch/x86/x86/procfs_machdep.c:1.1 --- /dev/null Thu Jul 8 11:25:00 2010 +++ src/sys/arch/x86/x86/procfs_machdep.c Thu Jul 8 11:25:00 2010 @@ -0,0 +1,300 @@ +/* $NetBSD: procfs_machdep.c,v 1.1 2010/07/08 11:25:00 rmind Exp $ */ + +/* + * Copyright (c) 2001 Wasabi Systems, Inc. + * All rights reserved. + * + * Written by Frank van der Linden and Jason R. Thorpe 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. + */ + +/* + * NOTE: We simply use the primary CPU's cpuid_level and tsc_freq + * here. Might want to change this later. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: procfs_machdep.c,v 1.1 2010/07/08 11:25:00 rmind Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mount.h> +#include <sys/stat.h> +#include <sys/vnode.h> + +#include <miscfs/procfs/procfs.h> + +#include <machine/cpu.h> +#include <machine/reg.h> +#include <machine/specialreg.h> + +extern int i386_fpu_present, i386_fpu_exception, i386_fpu_fdivbug; +extern char cpu_model[]; + +static const char * const x86_features[] = { + /* Intel-defined */ + "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce", + "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov", + "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx", + "fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", NULL, +#ifdef __x86_64__ + /* AMD-defined */ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL, + NULL, "fxsr_opt", "rdtscp", NULL, NULL, "lm", "3dnowext", "3dnow", + + /* Transmeta-defined */ + "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + /* Linux-defined */ + "cxmmx", NULL, "cyrix_arr", "centaur_mcr", NULL, + "constant_tsc", NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + /* Intel-defined */ + "pni", NULL, NULL, "monitor", "ds_cpi", "vmx", NULL, "est", + "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + /* VIA/Cyrix/Centaur-defined */ + NULL, NULL, "rng", "rng_en", NULL, NULL, "ace", "ace_en", + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + /* AMD defined */ + "lahf_lm", "cmp_legacy", "svm", NULL, "cr8_legacy", NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +#endif +}; + +static int procfs_getonecpu(int, struct cpu_info *, char *, int *); + +/* + * 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 *bf, int *len) +{ + struct cpu_info *ci; + CPU_INFO_ITERATOR cii; + int i = 0, used = *len, total = *len; + + *len = 0; + for (CPU_INFO_FOREACH(cii, ci)) { + if (procfs_getonecpu(i++, ci, bf, &used) == 0) { + *len += used; + total = 0; + break; + } + total -= used; + if (total > 0) { + bf += used; + *bf++ = '\n'; + *len += used + 1; + used = --total; + if (used == 0) + break; + } else { + *len += used; + break; + } + } + return total == 0 ? -1 : 0; +} + +static int +procfs_getonecpu(int xcpu, struct cpu_info *ci, char *bf, int *len) +{ + int left, l, i; + char featurebuf[256], *p; + + p = featurebuf; + left = sizeof(featurebuf); + for (i = 0; i < 32; i++) { + if ((ci->ci_feat_val[0] & (1 << i)) && x86_features[i]) { + l = snprintf(p, left, "%s ", x86_features[i]); + left -= l; + p += l; + if (left <= 0) + break; + } + } + + p = bf; + 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: ", + xcpu, + (char *)ci->ci_vendor, + cpuid_level >= 0 ? ((ci->ci_signature >> 8) & 15) : cpu_class + 3, + cpuid_level >= 0 ? ((ci->ci_signature >> 4) & 15) : 0, + cpu_brand_string + ); + + left -= l; + p += l; + if (left <= 0) + return 0; + + if (cpuid_level >= 0) + l = snprintf(p, left, "%d\n", ci->ci_signature & 15); + else + l = snprintf(p, left, "unknown\n"); + + left -= l; + p += l; + if (left <= 0) + return 0; + + if (ci->ci_data.cpu_cc_freq != 0) { + uint64_t freq, fraq; + + freq = (ci->ci_data.cpu_cc_freq + 4999) / 1000000; + fraq = ((ci->ci_data.cpu_cc_freq + 4999) / 10000) % 100; + l = snprintf(p, left, "cpu MHz\t\t: %" PRIu64 ".%" PRIu64 "\n", + freq, fraq); + } 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", +#ifdef __x86_64__ + "no", /* XXX */ + "yes", /* XXX */ + "yes", /* XXX */ +#else + i386_fpu_fdivbug ? "yes" : "no", + i386_fpu_present ? "yes" : "no", + i386_fpu_exception ? "yes" : "no", +#endif + cpuid_level, + (rcr0() & CR0_WP) ? "yes" : "no", + featurebuf + ); + + if (l > left) + return 0; + *len = (p + l) - bf; + + return 1; +} + +#if defined(__HAVE_PROCFS_MACHDEP) && !defined(__x86_64__) + +void +procfs_machdep_allocvp(struct vnode *vp) +{ + struct pfsnode *pfs = vp->v_data; + + switch (pfs->pfs_type) { + case Pmachdep_xmmregs: + /* /proc/N/xmmregs = -rw------- */ + pfs->pfs_mode = S_IRUSR|S_IWUSR; + vp->v_type = VREG; + break; + default: + KASSERT(false); + } +} + +int +procfs_machdep_rw(struct lwp *curl, struct lwp *l, struct pfsnode *pfs, + struct uio *uio) +{ + + switch (pfs->pfs_type) { + case Pmachdep_xmmregs: + return (procfs_machdep_doxmmregs(curl, l, pfs, uio)); + default: + KASSERT(false); + } + return EINVAL; +} + +int +procfs_machdep_getattr(struct vnode *vp, struct vattr *vap, struct proc *procp) +{ + struct pfsnode *pfs = VTOPFS(vp); + + switch (pfs->pfs_type) { + case Pmachdep_xmmregs: + vap->va_bytes = vap->va_size = sizeof(struct xmmregs); + break; + default: + KASSERT(false); + } + return 0; +} + +int +procfs_machdep_doxmmregs(struct lwp *curl, struct lwp *l, + struct pfsnode *pfs, struct uio *uio) +{ + + return process_machdep_doxmmregs(curl, l, uio); +} + +int +procfs_machdep_validxmmregs(struct lwp *l, struct mount *mp) +{ + + return process_machdep_validxmmregs(l->l_proc); +} + +#endif