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

Reply via email to