Merge branch 'master' into kq_devices
authorSamuel J. Greear <sjg@thesjg.com>
Wed, 7 Jul 2010 15:57:10 +0000 (15:57 +0000)
committerSamuel J. Greear <sjg@thesjg.com>
Wed, 7 Jul 2010 15:57:10 +0000 (15:57 +0000)
69 files changed:
etc/Makefile
etc/Makefile.usr
etc/mtree/BSD.usr.dist
include/math.h
lib/libnetgraph/netgraph.h
lib/libstand/stand.h
lib/libypclnt/ypclnt.h
sbin/Makefile
sbin/mkinitrd/Makefile [new file with mode: 0644]
sbin/mkinitrd/mini_init/Makefile [new file with mode: 0644]
sbin/mkinitrd/mini_init/oinit.c [new file with mode: 0644]
sbin/mkinitrd/mini_init/pathnames.h [copied from sys/boot/pc32/libi386/i386_module.c with 50% similarity]
sbin/mkinitrd/mkinitrd.8 [new file with mode: 0644]
sbin/mkinitrd/mkinitrd.sh [new file with mode: 0644]
share/Makefile
share/initrd/Makefile [new file with mode: 0644]
share/initrd/rc [new file with mode: 0644]
share/man/man4/acpi_hp.4
share/man/man4/acpi_sony.4
share/man/man4/acpi_thinkpad.4
share/man/man4/ehci.4
share/man/man4/ral.4
share/man/man7/standards.7
share/misc/pci_vendors
sys/boot/common/help.common
sys/boot/common/loader.8
sys/boot/forth/beastie.4th
sys/boot/pc32/libi386/i386_module.c
sys/boot/pc32/loader/help.i386
sys/boot/pc32/loader/main.c
sys/conf/kmod.mk
sys/config/LINT
sys/dev/acpica5/acpi_sony/Makefile
sys/dev/acpica5/acpi_sony/acpi_sony.c
sys/dev/netif/sk/if_sk.c
sys/dev/raid/vinum/vinumio.c
sys/emulation/linux/Makefile
sys/emulation/linux/i386/linux_machdep.c
sys/emulation/linux/linux_emuldata.c
sys/emulation/linux/linux_emuldata.h
sys/emulation/linux/linux_futex.c
sys/emulation/linux/linux_misc.c
sys/emulation/linux/linux_signal.c
sys/emulation/linux/linux_util.h
sys/kern/kern_exec.c
sys/kern/kern_xio.c
sys/kern/vfs_bio.c
sys/kern/vfs_syscalls.c
sys/kern/vfs_vm.c
sys/net/altq/altq_subr.c
sys/net/if.c
sys/platform/pc32/i386/pmap.c
sys/platform/pc64/x86_64/pmap.c
sys/platform/vkernel/platform/copyio.c
sys/platform/vkernel/platform/pmap.c
sys/platform/vkernel64/platform/copyio.c
sys/platform/vkernel64/platform/pmap.c
sys/sys/systm.h
sys/vfs/devfs/devfs_core.c
sys/vfs/procfs/procfs_mem.c
sys/vm/device_pager.c
sys/vm/phys_pager.c
sys/vm/vm_fault.c
sys/vm/vm_page.c
sys/vm/vm_page.h
sys/vm/vm_zeroidle.c
sys/vm/vnode_pager.c
test/test/README
usr.bin/top/m_dragonfly.c

index 9fb8f33..c51e3c9 100644 (file)
@@ -135,7 +135,7 @@ preupgrade:
 
 upgrade_etc:   preupgrade remove-obsolete-files
        # files that should be dirs (not possible with Makefile_upgrade.inc)
-.for f in usr/include/dev/misc/ppi
+.for f in usr/include/dev/misc/ppi usr/share/initrd/sbin
        [ -d ${DESTDIR}/${f} ] || rm -f ${DESTDIR}/${f}
 .endfor
 .if !defined(BINARY_UPGRADE) # binary upgrade just copies these files
index 6bb6f7c..6d285b2 100644 (file)
@@ -1,8 +1,6 @@
-# Makefile.pkgsrc - installed as /usr/pkgsrc/Makefile
+# Makefile.usr - installed as /usr/Makefile
 #
-# Provides simple targets to download and maintain /usr/pkgsrc.
-#
-# $DragonFly: src/etc/Makefile.usr,v 1.8 2008/09/03 10:38:55 hasso Exp $
+# Provides simple targets to download and maintain /usr/src, /usr/pkgsrc etc.
 
 help all:
        @echo "HELP:"
@@ -55,12 +53,12 @@ pkgsrc-create:
        cd ${.CURDIR}/pkgsrc && \
                git remote add origin git://git.dragonflybsd.org/pkgsrc.git
        cd ${.CURDIR}/pkgsrc && git fetch origin
-       cd ${.CURDIR}/pkgsrc && git branch vendor origin/vendor
-       cd ${.CURDIR}/pkgsrc && git checkout vendor
+       cd ${.CURDIR}/pkgsrc && git branch master origin/master
+       cd ${.CURDIR}/pkgsrc && git checkout master
        cd ${.CURDIR}/pkgsrc && git pull
 
 pkgsrc-checkout:
-       cd ${.CURDIR}/pkgsrc && git checkout vendor
+       cd ${.CURDIR}/pkgsrc && git checkout master
 
 pkgsrc-update:
        cd ${.CURDIR}/pkgsrc && git pull
index 6d3d08e..b128b2f 100644 (file)
         ..
         info
         ..
+        initrd
+            bin
+            ..
+            etc
+            ..
+            sbin
+            ..
+        ..
         installer
         ..
         isdn
index ea30b72..41f7e60 100644 (file)
@@ -86,7 +86,11 @@ extern const union __float_u __infinityf;
 #endif
 
 extern const union __long_double_u __infinityl;
+#ifdef __MATH_BUILTIN_CONSTANTS
+#define        HUGE_VALL       __builtin_huge_vall()
+#else
 #define        HUGE_VALL       __infinityl.__val
+#endif
 
 /* 7.12#4 INFINITY */
 #ifdef __MATH_BUILTIN_CONSTANTS
index d8666ba..5b4a1bf 100644 (file)
@@ -49,9 +49,9 @@
 
 __BEGIN_DECLS
 int    NgMkSockNode(const char *, int *, int *);
-int    NgNameNode(int, const char *, const char *, ...);
+int    NgNameNode(int, const char *, const char *, ...) __printflike(3, 4);
 int    NgSendMsg(int, const char *, int, int, const void *, size_t);
-int    NgSendAsciiMsg(int, const char *, const char *, ...);
+int    NgSendAsciiMsg(int, const char *, const char *, ...) __printflike(3, 4);
 int    NgSendReplyMsg(int, const char *,
                const struct ng_mesg *, const void *, size_t);
 int    NgRecvMsg(int, struct ng_mesg *, size_t, char *);
index 60b6783..6b74ff8 100644 (file)
@@ -251,12 +251,13 @@ extern void       mallocstats(void);
 struct         disklabel32;
 extern char    *getdisklabel32(const char *, struct disklabel32 *);
 
-extern int     printf(const char *, ...);
-extern void    vprintf(const char *, __va_list);
-extern int     sprintf(char *, const char *, ...);
-extern void    vsprintf(char *, const char *, __va_list);
-int            snprintf(char *, size_t, const char *, ...);
-int            vsnprintf(char *, size_t, const char *, __va_list);
+extern int     printf(const char *, ...) __printflike(1, 2);
+extern void    vprintf(const char *, __va_list) __printflike(1, 0);
+extern int     sprintf(char *, const char *, ...) __printflike(2, 3);
+extern void    vsprintf(char *, const char *, __va_list) __printflike(2, 0);
+int            snprintf(char *, size_t, const char *, ...) __printflike(3, 4);
+int            vsnprintf(char *, size_t, const char *, __va_list)
+                   __printflike(3, 0);
 
 extern void    twiddle(void);
 
@@ -379,7 +380,7 @@ extern int          ischar(void);
 extern void            putchar(int);
 extern int             devopen(struct open_file *, const char *, const char **);
 extern int             devclose(struct open_file *);
-extern void            panic(const char *, ...) __dead2;
+extern void            panic(const char *, ...) __dead2 __printflike(1, 2);
 extern struct fs_ops   *file_system[];
 extern struct devsw    *devsw[];
 
index f380bb0..223efb7 100644 (file)
@@ -48,7 +48,8 @@ struct passwd;
 
 ypclnt_t       *ypclnt_new(const char *, const char *, const char *);
 void            ypclnt_free(ypclnt_t *);
-void            ypclnt_error(ypclnt_t *, const char *, const char *, ...);
+void            ypclnt_error(ypclnt_t *, const char *, const char *, ...)
+                   __printf0like(3, 4);
 int             ypclnt_connect(ypclnt_t *);
 int             ypclnt_havepasswdd(ypclnt_t *);
 int             ypclnt_passwd(ypclnt_t *, const struct passwd *, const char *);
index 4da27c9..36bb84b 100644 (file)
@@ -43,6 +43,7 @@ SUBDIR=       adjkerntz \
        kldunload \
        ldconfig \
        md5 \
+       mkinitrd \
        mknod \
        mountctl \
        mount \
diff --git a/sbin/mkinitrd/Makefile b/sbin/mkinitrd/Makefile
new file mode 100644 (file)
index 0000000..63a3e51
--- /dev/null
@@ -0,0 +1,6 @@
+SUBDIR=mini_init
+
+SCRIPTS=mkinitrd.sh
+MAN=mkinitrd.8
+
+.include <bsd.prog.mk>
diff --git a/sbin/mkinitrd/mini_init/Makefile b/sbin/mkinitrd/mini_init/Makefile
new file mode 100644 (file)
index 0000000..7244fdc
--- /dev/null
@@ -0,0 +1,13 @@
+#      @(#)Makefile    8.1 (Berkeley) 7/19/93
+# $FreeBSD: src/sbin/init/Makefile,v 1.20.2.4 2001/08/01 06:37:01 obrien Exp $
+# $DragonFly: src/sbin/init/Makefile,v 1.5 2006/10/17 00:55:41 pavalos Exp $
+
+PROG=  oinit
+NOSHARED=yes
+NOMAN=
+BINMODE=500
+BINDIR=${SHAREDIR}/initrd/sbin
+DPADD= ${LIBUTIL}
+LDADD= -lutil
+
+.include <bsd.prog.mk>
diff --git a/sbin/mkinitrd/mini_init/oinit.c b/sbin/mkinitrd/mini_init/oinit.c
new file mode 100644 (file)
index 0000000..3c99220
--- /dev/null
@@ -0,0 +1,153 @@
+/*-
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Donn Seeley at Berkeley Software Design, 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 by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ *
+ * @(#) Copyright (c) 1991, 1993 The Regents of the University of California.  All rights reserved.
+ * @(#)init.c  8.1 (Berkeley) 7/15/93
+ * $FreeBSD: src/sbin/init/init.c,v 1.38.2.8 2001/10/22 11:27:32 des Exp $
+ * $DragonFly: src/sbin/init/init.c,v 1.10 2007/11/25 18:10:07 swildner Exp $
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <sys/sysctl.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+
+#include <db.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <libutil.h>
+#include <paths.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <time.h>
+#include <ttyent.h>
+#include <unistd.h>
+#include <sys/reboot.h>
+#include <err.h>
+
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#include "pathnames.h"
+
+static int     setctty(const char *);
+static void    runcom(char **);
+
+/*
+ * The mother of all processes.
+ */
+int
+main(int argc __unused, char **argv)
+{
+       /* Dispose of random users. */
+       if (getuid() != 0)
+               errx(1, "%s", strerror(EPERM));
+
+       runcom(argv);
+       return 1;
+}
+
+static int
+setctty(const char *name)
+{
+       int fd;
+
+       revoke(name);
+       if ((fd = open(name, O_RDWR)) == -1) {
+               exit(1);
+       }
+
+       if (login_tty(fd) == -1) {
+               exit(1);
+       }
+
+       return fd;
+}
+
+
+static void
+runcom(char **argv_orig)
+{
+       pid_t pid, wpid;
+       int status, fd, error;
+       const char *argv[4];
+       struct sigaction sa;
+
+       fd = -1;
+
+       if ((pid = fork()) == 0) {
+               sigemptyset(&sa.sa_mask);
+               sa.sa_flags = 0;
+               sa.sa_handler = SIG_IGN;
+               sigaction(SIGTSTP, &sa, NULL);
+               sigaction(SIGHUP, &sa, NULL);
+
+               setctty(_PATH_CONSOLE);
+
+               printf("Child talking, about to call /etc/rc\n");
+               argv[0] = "sh";
+               argv[1] = _PATH_RUNCOM;
+               argv[2] = "autoboot" ;
+               argv[3] = 0;
+
+               sigprocmask(SIG_SETMASK, &sa.sa_mask, NULL);
+
+               execv(_PATH_BSHELL, __DECONST(char **, argv));
+               exit(1);        /* force single user mode */
+       }
+
+       do {
+               wpid = waitpid(-1, &status, WUNTRACED);
+       } while (wpid != pid);
+
+       error = chroot_kernel("/new_root");
+       if (error)
+               exit(1);
+
+       error = chroot("/new_root");
+       if (error)
+               exit(1);
+
+       execv("/sbin/init", __DECONST(char **, argv_orig));
+}
+
similarity index 50%
copy from sys/boot/pc32/libi386/i386_module.c
copy to sbin/mkinitrd/mini_init/pathnames.h
index 237d690..27837f6 100644 (file)
@@ -1,6 +1,9 @@
 /*-
- * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
- * All rights reserved.
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Donn Seeley at Berkeley Software Design, Inc.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * 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 by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 AUTHOR OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS 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)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/boot/i386/libi386/i386_module.c,v 1.12 2003/08/25 23:28:31 obrien Exp $
- * $DragonFly: src/sys/boot/pc32/libi386/i386_module.c,v 1.3 2003/11/10 06:08:36 dillon Exp $
- */
-
-/*
- * i386-specific module functionality.
- *
- */
-
-#include <stand.h>
-#include <string.h>
-
-#include "bootstrap.h"
-#include "libi386.h"
-
-/*
- * Use voodoo to load modules required by current hardware.
+ *     @(#)pathnames.h 8.1 (Berkeley) 6/5/93
  */
-int
-i386_autoload(void)
-{
-    int                error;
-    int                disabled;
-    char       *rv;
-
-    /* XXX use PnP to locate stuff here */
-
-    /* autoload ACPI support */
-    /* XXX should be in 4th keyed off acpi_load */
-    disabled = 0;
-    rv = getenv("hint.acpi.0.disabled");
-    if (rv != NULL && strncmp(rv, "0", 1) != 0) {
-       disabled = 1;
-    }
 
-    if (getenv("acpi_load") && (!disabled)) {
-       error = mod_load("acpi", NULL, 0, NULL);
-       if (error != 0)
-           printf("ACPI autoload failed - %s\n", strerror(error));
-    }
+#include <paths.h>
 
-    return(0);
-}
+#define        _PATH_SLOGGER   "/sbin/session_logger"
+#define        _PATH_RUNCOM    "/etc/rc"
+#define _PATH_RUNDOWN   "/etc/rc.shutdown"
diff --git a/sbin/mkinitrd/mkinitrd.8 b/sbin/mkinitrd/mkinitrd.8
new file mode 100644 (file)
index 0000000..986fe5e
--- /dev/null
@@ -0,0 +1,87 @@
+.\"
+.\" Copyright (c) 2010 The DragonFly Project.  All rights reserved.
+.\" 
+.\" 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. Neither the name of The DragonFly Project nor the names of its
+.\"    contributors may be used to endorse or promote products derived
+.\"    from this software without specific, prior written permission.
+.\" 
+.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+.\" COPYRIGHT HOLDERS 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.
+.\"
+.Dd July 1, 2010
+.Os
+.Dt MKINITRD 8
+.Sh NAME
+.Nm mkinitrd
+.Nd build an initial ramdisk image for use as early userland
+.Sh SYNOPSIS
+.Nm
+.\".Op Ar options ...
+.\".Ar target ...
+.Sh DESCRIPTION
+The
+.Nm
+script builds a ramdisk (md) image based on the UFS filesystem containing
+only the most basic tools, such as a minimal
+.Xr init 8 ,
+.Xr sh 1
+as well as many
+.Xr mount 8
+utilities.
+.Pp
+It will also copy the contents of
+.Pa /usr/share/initrd
+onto the ramdisk, maintaining the same hierarchy.
+.Pp
+On completion, the final image will be copied to
+.Pa /boot/initrd.img ,
+ready to be used as an early userland.
+.Pp
+The
+.Nm
+script will check for
+.Pa /etc/defaults/mkinitrd.conf
+and
+.Pa /etc/mkinitrd.conf
+and include the configuration from these files in the given order, allowing
+the user to override or add to the following variables:
+.Bd -literal -offset indent
+BUILD_DIR
+INITRD_SIZE
+BIN_TOOLS
+SBIN_TOOLS
+INITRD_DIRS
+CONTENT_DIRS
+.Ed
+.Pp
+Adding the following lines to
+.Pa /boot/loader.conf
+will enable the use of the created initrd image:
+.Bd -literal -offset indent
+initrd.img_load="YES"
+initrd.img_type="md_image"
+vfs.root.mountfrom="ufs:md0s0"
+.Ed
+.Sh SEE ALSO
+.Xr md 4 ,
+.Xr loader.conf 5
diff --git a/sbin/mkinitrd/mkinitrd.sh b/sbin/mkinitrd/mkinitrd.sh
new file mode 100644 (file)
index 0000000..2a461c3
--- /dev/null
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+BUILD_DIR="/tmp/initrd"
+INITRD_SIZE="15m"
+BIN_TOOLS="echo ln ls mv rm rmdir sh"
+SBIN_TOOLS="mount mount_devfs mount_hammer mount_nfs mount_null mount_procfs mount_tmpfs umount iscontrol"
+INITRD_DIRS="bin boot dev etc mnt proc sbin tmp var new_root"
+CONTENT_DIRS="/usr/share/initrd"
+
+if [ -e /etc/defaults/mkinitrd.conf ]; then
+       . /etc/defaults/mkinitrd.conf
+       echo "Loaded configuration from /etc/defaults/mkinitrd.conf"
+fi
+
+
+if [ -e /etc/mkinitrd.conf ]; then
+       . /etc/mkinitrd.conf
+       echo "Loaded configuration from /etc/mkinitrd.conf"
+fi
+
+VN_DEV=""
+
+create_vn() {
+       if [ ! -d  $BUILD_DIR ]; then
+               mkdir -p $BUILD_DIR
+               echo "Created build directory $BUILD_DIR"
+       fi
+       VN_DEV=`vnconfig -c -S ${INITRD_SIZE} -Z -T vn initrd.img | cut -f 2 -d ' '`
+       echo "Configured $VN_DEV"
+       newfs /dev/${VN_DEV}s0
+       echo "Formatted initrd image with UFS"
+       mount /dev/${VN_DEV}s0 $BUILD_DIR
+       echo "Mounted initrd image on ${BUILD_DIR}"
+}
+
+destroy_vn() {
+       umount /dev/${VN_DEV}s0
+       echo "Unmounted initrd image"
+       vnconfig -u $VN_DEV
+       echo "Unconfigured $VN_DEV"
+}
+
+make_hier() {
+       for dir in ${INITRD_DIRS}; do
+               mkdir -p ${BUILD_DIR}/${dir}
+       done
+
+       echo "Created directory structure"
+}
+
+copy_tools() {
+       for tool in ${BIN_TOOLS}; do
+               objcopy -S /bin/${tool} ${BUILD_DIR}/bin/${tool}
+       done
+
+       for tool in ${SBIN_TOOLS}; do
+               objcopy -S /sbin/${tool} ${BUILD_DIR}/sbin/${tool}
+       done
+
+       echo "Copied essential tools"
+}
+
+copy_content() {
+       for dir in ${CONTENT_DIRS}; do
+               cp -R ${dir}/* ${BUILD_DIR}/
+       done
+}
+
+print_info() {
+#      tree ${BUILD_DIR}
+       df -h | head -n 1
+       df -h | grep $VN_DEV
+}
+
+create_vn
+make_hier
+copy_tools
+copy_content
+print_info
+destroy_vn
+mv initrd.img /boot/initrd.img
index bcb3b12..e0ae871 100644 (file)
@@ -4,7 +4,7 @@
 
 # Do not include `info' in the SUBDIR list, it is handled separately.
 
-SUBDIR= colldef dict doc examples i18n locale man me misc mk monetdef \
+SUBDIR= colldef dict doc examples i18n initrd locale man me misc mk monetdef \
        msgdef numericdef skel syscons tabset termcap timedef zoneinfo
 
 .if !defined(NO_I4B)
diff --git a/share/initrd/Makefile b/share/initrd/Makefile
new file mode 100644 (file)
index 0000000..3137e06
--- /dev/null
@@ -0,0 +1,17 @@
+
+#If you want to add files to other subdirectories, please use a similar
+#approach as below, for example for var:
+#
+#add VAR_FILES=        foo
+#add ${VAR_FILES} to FILES=
+#add a for loop for ${VAR_FILES}
+
+ETC_FILES=     rc
+FILES=         ${ETC_FILES}
+
+.for file in ${ETC_FILES}
+FILESDIR_${file}=${SHAREDIR}/initrd/etc
+FILESMODE_${file}=555
+.endfor
+
+.include <bsd.prog.mk>
diff --git a/share/initrd/rc b/share/initrd/rc
new file mode 100644 (file)
index 0000000..24e185a
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# echo "Starting shell from md boot"
+# exec sh
+
+echo "Mounting new root"
+/sbin/mount -t hammer /dev/da0s1d /new_root
+
+echo "Mounting devfs on new root"
+#/sbin/mount_devfs /new_root/dev
+/sbin/mount_null /dev /new_root/dev
index 1546918..68c906f 100644 (file)
@@ -100,63 +100,63 @@ as described below.
 The following sysctls are currently implemented:
 .Ss WLAN:
 .Bl -tag -width indent
-.It Va dev.acpi_hp.0.wlan_enabled
+.It Va hw.acpi.hp.wlan_enabled
 Toggle WLAN chip activity.
-.It Va dev.acpi_hp.0.wlan_radio
+.It Va hw.acpi.hp.wlan_radio
 (read-only)
 WLAN radio status (controlled by hardware switch)
-.It Va dev.acpi_hp.0.wlan_on_air
+.It Va hw.acpi.hp.wlan_on_air
 (read-only)
 WLAN on air (chip enabled, hardware switch enabled + enabled in BIOS)
-.It Va dev.acpi_hp.0.wlan_enabled_if_radio_on
+.It Va hw.acpi.hp.wlan_enabled_if_radio_on
 If set to 1, the WLAN chip will be enabled if the radio is turned on
-.It Va dev.acpi_hp.0.wlan_disable_if_radio_off
+.It Va hw.acpi.hp.wlan_disable_if_radio_off
 If set to 1, the WLAN chip will be disabled if the radio is turned off
 .El
 .Ss Bluetooth:
 .Bl -tag -width indent
-.It Va dev.acpi_hp.0.bt_enabled
+.It Va hw.acpi.hp.bt_enabled
 Toggle Bluetooth chip activity.
-.It Va dev.acpi_hp.0.bt_radio
+.It Va hw.acpi.hp.bt_radio
 (read-only)
 Bluetooth radio status (controlled by hardware switch)
-.It Va dev.acpi_hp.0.bt_on_air
+.It Va hw.acpi.hp.bt_on_air
 (read-only)
 Bluetooth on air (chip enabled, hardware switch enabled + enabled in BIOS)
-.It Va dev.acpi_hp.0.bt_enabled_if_radio_on
+.It Va hw.acpi.hp.bt_enabled_if_radio_on
 If set to 1, the Bluetooth chip will be enabled if the radio is turned on
-.It Va dev.acpi_hp.0.bt_disable_if_radio_off
+.It Va hw.acpi.hp.bt_disable_if_radio_off
 If set to 1, the Bluetooth chip will be disabled if the radio is turned off
 .El
 .Ss WWAN:
 .Bl -tag -width indent
-.It Va dev.acpi_hp.0.wwan_enabled
+.It Va hw.acpi.hp.wwan_enabled
 Toggle WWAN chip activity.
-.It Va dev.acpi_hp.0.wwan_radio
+.It Va hw.acpi.hp.wwan_radio
 (read-only)
 WWAN radio status (controlled by hardware switch)
-.It Va dev.acpi_hp.0.wwan_on_air
+.It Va hw.acpi.hp.wwan_on_air
 (read-only)
 WWAN on air (chip enabled, hardware switch enabled + enabled in BIOS)
-.It Va dev.acpi_hp.0.wwan_enabled_if_radio_on
+.It Va hw.acpi.hp.wwan_enabled_if_radio_on
 If set to 1, the WWAN chip will be enabled if the radio is turned on
-.It Va dev.acpi_hp.0.wwan_disable_if_radio_off
+.It Va hw.acpi.hp.wwan_disable_if_radio_off
 If set to 1, the WWAN chip will be disabled if the radio is turned off
 .El
 .Ss Misc:
 .Bl -tag -width indent
-.It Va dev.acpi_hp.0.als_enabled
+.It Va hw.acpi.hp.als_enabled
 Toggle ambient light sensor (ALS)
-.It Va dev.acpi_hp.0.display
+.It Va hw.acpi.hp.display
 (read-only)
 Display status (bitmask)
-.It Va dev.acpi_hp.0.hdd_temperature
+.It Va hw.acpi.hp.hdd_temperature
 (read-only)
 HDD temperature
-.It Va dev.acpi_hp.0.is_docked
+.It Va hw.acpi.hp.is_docked
 (read-only)
 Docking station status (1 if docked)
-.It Va dev.acpi_hp.0.cmi_detail
+.It Va hw.acpi.hp.cmi_detail
 Bitmask to control detail level in /dev/hpcmi output (values can be ORed).
 .Bl -tag -width "0x01" -offset indent -compact
 .It Li 0x01
@@ -169,7 +169,7 @@ Show additional flags of BIOS setting (ReadOnly etc.)
 Query highest BIOS entry instance.
 This is broken on many HP models and therefore disabled by default.
 .El
-.It Va dev.acpi_hp.0.verbose
+.It Va hw.acpi.hp.verbose
 (read-only)
 Set verbosity level
 .El
@@ -217,12 +217,12 @@ notify 0 {
 .Pp
 Enable the ambient light sensor:
 .Bd -literal -offset indent
-sysctl dev.acpi_hp.0.als_enabled=1
+sysctl hw.acpi.hp.als_enabled=1
 .Ed
 .Pp
 Enable Bluetooth:
 .Bd -literal -offset indent
-sysctl dev.acpi_hp.0.bt_enabled=1
+sysctl hw.acpi.hp.bt_enabled=1
 .Ed
 .Pp
 Get BIOS settings:
@@ -242,7 +242,7 @@ Express Card Slot                          Disable
 .Pp
 Set maximum detail level for /dev/hpcmi output:
 .Bd -literal -offset indent
-sysctl dev.acpi_hp.0.cmi_detail=7
+sysctl hw.acpi.hp.cmi_detail=7
 .Ed
 .Sh SEE ALSO
 .Xr acpi 4 ,
index 1d9ca42..b5b210a 100644 (file)
@@ -22,9 +22,9 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\" $FreeBSD: src/share/man/man4/acpi_sony.4,v 1.1 2008/08/21 00:40:55 rpaulo Exp $
+.\" $FreeBSD: src/share/man/man4/acpi_sony.4,v 1.3 2010/02/08 21:01:41 gavin Exp $
 .\"
-.Dd November 11, 2009
+.Dd July 4, 2010
 .Dt ACPI_SONY 4
 .Os
 .Sh NAME
@@ -48,15 +48,24 @@ acpi_sony_load="YES"
 The
 .Nm
 driver provides support for the notebook controller in Sony laptops.
+Note that not all features will work on all laptop models.
 .Sh SYSCTLS
-The following sysctl is currently implemented:
+The following sysctl nodes are currently implemented:
 .Bl -tag -width indent
-.It Va dev.acpi_sony.0.brightness
+.It Va hw.acpi.sony.brightness
 Current brightness level of the display.
-.It Va dev.acpi_sony.0.cdp
+.It Va hw.acpi.sony.brightness_default
+Default brightness level of the display (survives reboot).
+.It Va hw.acpi.sony.contrast
+Current contrast level of the display.
+.It Va hw.acpi.sony.bass_gain
+Enable or disable the Bass Gain feature.
+.It Va hw.acpi.sony.cdp
 Turns the CD power on or off.
-.It Va dev.acpi_sony.0.azp
+.It Va hw.acpi.sony.azp
 Turns the audio power on or off.
+.It Va hw.acpi.sony.lnp
+Turns the wired network interface power on or off.
 .El
 .Sh SEE ALSO
 .Xr acpi 4 ,
index 086fae6..0da83cc 100644 (file)
@@ -159,15 +159,15 @@ Access IBM Button
 .Sh SYSCTL VARIABLES
 The following sysctls are currently implemented:
 .Bl -tag -width indent
-.It Va dev.acpi_thinkpad.0.initialmask
+.It Va hw.acpi.thinkpad.initialmask
 (read-only)
 Bitmask of ACPI events before the
 .Nm
 driver was loaded.
-.It Va dev.acpi_thinkpad.0.availmask
+.It Va hw.acpi.thinkpad.availmask
 (read-only)
 Bitmask of all supported ACPI events.
-.It Va dev.acpi_thinkpad.0.events
+.It Va hw.acpi.thinkpad.events
 Enable ACPI events and set the
 .Va eventmask
 to
@@ -175,7 +175,7 @@ to
 Without the
 .Nm
 driver being loaded, only the Fn+F4 button generates an ACPI event.
-.It Va dev.acpi_thinkpad.0.eventmask
+.It Va hw.acpi.thinkpad.eventmask
 Sets the ACPI events which are reported to
 .Xr devd 8 .
 Fn+F3, Fn+F4 and Fn+F12 always generate ACPI events, regardless which value
@@ -236,7 +236,7 @@ Mute
 .It Li 8388608
 Access IBM Button
 .El
-.It Va dev.acpi_thinkpad.0.hotkey
+.It Va hw.acpi.thinkpad.hotkey
 (read-only)
 Status of several buttons.
 Every time a button is pressed, the respecting bit is toggled.
@@ -268,27 +268,27 @@ Brightness Up/Down Button
 .It Li 2048
 Volume Up/Down/Mute Button
 .El
-.It Va dev.acpi_thinkpad.0.lcd_brightness
+.It Va hw.acpi.thinkpad.lcd_brightness
 Current brightness level of the display.
-.It Va dev.acpi_thinkpad.0.volume
+.It Va hw.acpi.thinkpad.volume
 Speaker volume.
-.It Va dev.acpi_thinkpad.0.mute
+.It Va hw.acpi.thinkpad.mute
 Indicates, whether the speakers are muted or not.
-.It Va dev.acpi_thinkpad.0.thinklight
+.It Va hw.acpi.thinkpad.thinklight
 Indicates, whether the ThinkLight keyboard light is activated or not.
-.It Va dev.acpi_thinkpad.0.bluetooth
+.It Va hw.acpi.thinkpad.bluetooth
 Toggle Bluetooth chip activity.
-.It Va dev.acpi_thinkpad.0.wlan
+.It Va hw.acpi.thinkpad.wlan
 (read-only)
 Indicates whether the WLAN chip is active or not.
-.It Va dev.acpi_thinkpad.0.fan
+.It Va hw.acpi.thinkpad.fan
 Indicates whether the fan is in automatic (1) or manual (0) mode.
 Default is automatic mode.
 This sysctl should be used with extreme precaution, since disabling automatic
 fan control might overheat the ThinkPad and lead to permanent damage if the
 .Va fan_level
 is not set accordingly.
-.It Va dev.acpi_thinkpad.0.fan_level
+.It Va hw.acpi.thinkpad.fan_level
 Indicates at what speed the fan should run when being in manual mode.
 Values are ranging from 0 (off) to 7 (max).
 The resulting speed differs from model to model.
@@ -304,12 +304,12 @@ off
 .It Li 6, 7
 ~4300 RPM
 .El
-.It Va dev.acpi_ibm.0.fan_speed
+.It Va hw.acpi.thinkpad.fan_speed
 (read-only)
 Fan speed in rounds per minute.
 A few older ThinkPads report the fan speed in levels ranging from 0 (off)
 to 7 (max).
-.It Va dev.acpi_ibm.0.thermal
+.It Va hw.acpi.thinkpad.thermal
 (read-only)
 Shows the readings of up to eight different temperature sensors.
 Most ThinkPads include six or more temperature sensors but
@@ -393,25 +393,25 @@ DISPLAY_PIPE=/tmp/acpi_${OEM}_display
 
 case ${NOTIFY} in
         0x05)
-                LEVEL=`sysctl -n dev.acpi_${OEM}.0.bluetooth`
+                LEVEL=`sysctl -n hw.acpi.${OEM}.bluetooth`
                 if [ "$LEVEL" = "1" ]
                 then
-                        sysctl dev.acpi_${OEM}.0.bluetooth=0
+                        sysctl hw.acpi.${OEM}.bluetooth=0
                         MESSAGE="bluetooth disabled"
                 else
-                        sysctl dev.acpi_${OEM}.0.bluetooth=1
+                        sysctl hw.acpi.${OEM}.bluetooth=1
                         MESSAGE="bluetooth enabled"
                 fi
                 ;;
         0x10|0x11)
-                LEVEL=`sysctl -n dev.acpi_${OEM}.0.lcd_brightness`
+                LEVEL=`sysctl -n hw.acpi.${OEM}.lcd_brightness`
                 PERCENT=`${ECHO} "${BC_PRECOMMANDS} ; \\
                          ${LEVEL} / ${MAX_LCD_BRIGHTNESS} * 100" |\\
                          ${CALC} | ${CUT} -d . -f 1`
                 MESSAGE="brightness level ${PERCENT}%"
                 ;;
         0x12)
-                LEVEL=`sysctl -n dev.acpi_${OEM}.0.thinklight`
+                LEVEL=`sysctl -n hw.acpi.${OEM}.thinklight`
                 if [ "$LEVEL" = "1" ]
                 then
                         MESSAGE="thinklight enabled"
@@ -420,14 +420,14 @@ case ${NOTIFY} in
                 fi
                 ;;
         0x15|0x16)
-                LEVEL=`sysctl -n dev.acpi_${OEM}.0.volume`
+                LEVEL=`sysctl -n hw.acpi.${OEM}.volume`
                 PERCENT=`${ECHO} "${BC_PRECOMMANDS} ; \\
                         ${LEVEL} / ${MAX_VOLUME} * 100" | \\
                          ${CALC} | ${CUT} -d . -f 1`
                 MESSAGE="volume level ${PERCENT}%"
                 ;;
         0x17)
-                LEVEL=`sysctl -n dev.acpi_${OEM}.0.mute`
+                LEVEL=`sysctl -n hw.acpi.${OEM}.mute`
                 if [ "$LEVEL" = "1" ]
                 then
                         MESSAGE="volume muted"
index 2ac6ccc..d88a1c7 100644 (file)
@@ -34,9 +34,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $DragonFly: src/share/man/man4/ehci.4,v 1.3 2006/12/10 02:16:26 sephe Exp $
-.\"
-.Dd November 26, 2006
+.Dd July 4, 2010
 .Dt EHCI 4
 .Os
 .Sh NAME
@@ -63,6 +61,18 @@ USB controllers.
 The handling of this is totally automatic, but can be noticed since
 USB 1.x and USB 2.0 devices plugged in to the same connector appear
 to connect to different USB busses.
+.Pp
+The
+.Nm
+driver is automatically loaded upon boot.
+To disable this behavior temporarily, the
+.Va ehci_load
+variable can be unset at the loader prompt (see
+.Xr loader 8 ) .
+To disable it permanently, the
+.Va hint.ehci.0.disabled
+tunable can be set to 1 in
+.Pa /boot/loader.conf .
 .Sh SEE ALSO
 .Xr cardbus 4 ,
 .Xr ohci 4 ,
index e18bf36..83a416f 100644 (file)
@@ -243,7 +243,7 @@ This should not happen.
 .Xr firmware 9
 .Rs
 .%T "Ralink Technology"
-.%U http://www.ralinktech.com/
+.%O http://www.ralinktech.com/
 .Re
 .Sh HISTORY
 The
index c131115..6ea8d5e 100644 (file)
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd June 7, 2010
+.Dd July 4, 2010
 .Dt STANDARDS 7
 .Os
 .Sh NAME
 .Nm standards
 .Nd standards supported by DragonFly
 .Sh SYNOPSIS
+.Fd "#define _XOPEN_SOURCE 600"
+.Pp
 .In sys/cdefs.h
 .Sh DESCRIPTION
-.Ss POSIX Standards
+A number of
+.Dq feature test macros ,
+namely
+.Dv _POSIX_C_SOURCE
+and
+.Dv _XOPEN_SOURCE ,
+can be used by applications to indicate desired sets of features (beyond
+those specified by the C standard) in the programming environment supplied by
+.Dx .
+These macros determine which prototypes are exposed by header files and so on.
+.Pp
+If neither
+.Dv _POSIX_C_SOURCE
+and
+.Dv _XOPEN_SOURCE
+are set, the programming environment defaults to
+.St -susv3 .
+In addition, a number of
+.Bx
+specific prototypes, definitions etc.\& are made visible.
+.Ss POSIX Standards (_POSIX_C_SOURCE)
 The value of the
 .Dv _POSIX_C_SOURCE
 macro determines which
@@ -101,7 +123,7 @@ is equivalent to defining
 .Dv _POSIX_C_SOURCE
 to
 .Li 198808 .
-.Ss X/Open CAE Specifications
+.Ss X/Open CAE Specifications (_XOPEN_SOURCE)
 The value of the
 .Dv _XOPEN_SOURCE
 macro determines which X/Open CAE specification the programming
index e2f272d..560e886 100644 (file)
@@ -67,6 +67,9 @@
        006E    MN-510 802.11b wireless USB paddle
        00C2    MN-710 wireless USB paddle
 0482   Kyocera
+04B3   IBM
+       4001    Remote System Administration device [RSA2]
+       4010    0x4010 IBM USB Remote NDIS Network Device
 04CF   Myson Century Inc
        8818    CS8818 USB2.0-to-ATAPI Bridge Controller with Embedded PHY
 050D   Belkin
        700F    F5D7001 - Wireless G Plus Desktop Card
        7050    F5D7050 802.11g Wireless USB Adapter
        705C    F5D7050 v4
-058F   USB-flash Drive Transcend Jetflash TS4GJFV30 4Gb
+051D   APC
+       0002    1 1
+058F   Alcor Micro Corp.
+       0001    6387 JetFlash Transcend 16GB USB Device
+       6366    Unknown Multi Flash Reader USB Device
+       9254    AU9254A21-HAS http://www.alldatasheet.com/datasheet-pdf/pdf/91600/ETC/AU9254A21.html
 05A9   OmniVision
        8519    OV519 series
+05AC   Apple, Inc.
+       021E    Keyboard IT USB Alluminium Keyboard IT USB
 05E3   CyberDoor
        0701    CBD516
 064E   SUYIN Corporation
        1702    IS64PH ISDN Adapter
        1703    ISDN Adapter (PCI Bus, DV, W)
        1704    ISDN Adapter (PCI Bus, D, C)
-067B   Prolific Technology Inc
+067B   Prolific Technology Inc.
        2303    PL-2303 USB-to-Serial Converter
        2305    PL-2305 USB-to-Printer Bridge Controller
        2393    prolific prolific
+       2506    PL-2506 Hi-Speed USB to IDE Bridge Controller
        3507    PL-3507 Hi-Speed USB & IEEE 1394 Combo to IDE Bridge Controller
 069D   Hughes Network Systems (HNS)
 0700   Stream Machine
        0704    CM 200E Cable Modem
 0A5C   Broadcom Corporation
        0201    Broadcom NetXtreme BCM5782 Gigabie Ethernet Contro Broadcom USB iLine10(tm) Network Adapter
+       10DE    0264 Controlador sm
        2000      Broadcom Bluetooth Firmware Upgrade Device
        2009      Broadcom Bluetooth Controller
        200A      Broadcom Bluetooth Controller
        2143      2046 Flash non UHE Class 1
        2144      2046 Flash non UHE module Class 2
        2145      Broadcom BCM9204MD LENO Module
-       2146      Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
+       2146      Broadcom 2045 Bluetooth 2.1 USB UHE Dongle
        2147      Broadcom 2046 Bluetooth 2.1 USB Dongle
        2148      Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
        2149      Broadcom 2046 Bluetooth 2.1 USB Dongle
        4502    BCM2046B1 Broadcom 2046 Bluetooth 2.1 USB Dongle
        4503     BCM2046B1 Broadcom 2046 Bluetooth 2.1 USB Dongle
        5800      Unified Security Hub
+       5801    0x5801 Unified Security Hub
        6300     965 Pirelli ISB Remote NDIS Device
 0A89   BREA Technologies Inc.
 0ACE   ZyDAS
 0B49   ASCII Corporation
        064F    Trance Vibrator
 0C45   Microdia Ltd.
-       602D    7&2BE7B8E3&0&4 USB Webcam
-       6130    5&8B16BAF&0&1 USB CAMERA
+       602D    usb\vid_oc45&pid_613b\5&263791cd&0&1 USB Webcam
+       6130    usb\vid_oc45&pid_613b\5&263791cd&0&1 USB CAMERA
 0CCD   TerraTec Electronic GmbH
        0038    Cinergy T^2 DVB-T Receiver
 0E11   Compaq Computer Corp (Now owned by Hewlett-Packard)
        1000    63C815 Fast SCSI Controller
        1001    53C895 Symbios Ultra2 SCSI controller
        1010    LSI 53C102000 Single channel SCSI controller
+       1020    LSI53C1020 LSI Logic MegaRAID 320-1 Dell PowerEdge PERC 4/SC
        1960    MegaRAID
+       6001    DX1 Multiformat Broadcast HD/SD Encoder/Decoder
+       9876    7DB82C.YF.F.3.25 5946504E44383243
 1001   Kolter Electronic - Germany
        0010    PCI1616 Measurement Card with 32 digital I/O lines
        0011    ispLSI1032E OPTO-PCI, 16 IN / 16 OUT 24 VDC
        0020    ispLSI1032E Universal digital I/O PCI-Interface
        9100    INI-9100/9100W SCSI Host
 1002   ATI Technologies Inc. / Advanced Micro Devices, Inc.
+       0002    EMU10K1 Audio Cipset (SB) Livel
        0B12    R580 ATI Radeon X1900
        1002    0F2A1787 0F2A1787
        3150    M24 ATI MOBILITY /ATI RADEON X600
        436E    IXP SB300 Serial ATA Controller
        4370    IXP SB400 AC'97 Audio Controller
        4371    IXP SB400 PCI-PCI Bridge
-       4372    IXP SB400 SMBus
+       4372    IXP SB400 SMBus Controller
        4373    IXP SB400 EHCI USB 2.0 Controller
        4374    IXP SB400 OHCI USB Controller
        4375    IXP SB400 OHCI USB Controller
        4C5A    Radeon Mobility M6 LZ
        4C64    Radeon Mobility M9-GL
        4C65    Radeon Mobility 9000 (R250 Le)
-       4C66    R250 MOBILITY RADEON 9000 (M9)
+       4C66    RV250 MOBILITY FireGL 9000
        4C67    Radeon Mobility 9000 (R250 Lg)
        4C6E    Radeon Mobility 9000 - Secondary (R250 Ln)
        4D46    ATI mobility128 Rage Mobility 128 AGP 4x
        4E52    Mobility Radeon 9500/9600 (M10) (RV350)
        4E53    Radeon Mobility 9600 (M10 NS)
        4E54    M10GL ATI MOBILITY FIRE GL T2/T2e
-       4E56    M12 ATI MOBILITY /ATI RADEON 9550
+       4E56    M12 ATI MOBILITY /ATI RADEON 9400
        4E64    Radeon 9700/Pro, 9500 (R300) Series - Secondary
        4E65    Radeon 9700/9500 Series (R300) - Secondary
        4E66    R300 ATI RADEON 9600 TX Secondary
        5155    Radeon 9100 R200 QU
        5157    Radeon 7500 Series (RV200)
        5158    radeon 9700 or 9200 Radeon 7500 QX
-       5159    RV100 Radeon 7000 / Radeon VE
+       5159    RV100 Radeon 7000 series AGP (0x5159)
        515A    Radeon VE QZ
        515E    Radeon ES1000 Radeon ES1000
        515F    ES1000
        516B    Radeon R200 Qk
        516C    E7505 Radeon 8500 / 8500LE
        516D    Radeon 9100 Series (R200) - Secondary
-       5245    215R46ASA22 Rage 128 GL PCI
+       5245    215R2QZUA21 Rage 128 GL PCI
        5246    Rage 128 PRO Rage 32MB
        5247    Rage 32MB Rage 128 RG
        524B    g01080-108 Rage 128 VR RK PCI
        5B60    RV370 ATI RADEON X300/X550/X1050 Series
        5B61    RV371
        5B62    RV380x ATI RADEON X600 Series
-       5B63    RV370 ATI RADEON X300/X550/X1050 Series
+       5B63    REV00 ATI RADEON X300/X550/X1050 Series
        5B64    FireGL V3100 (RV370 5B64)
        5B65    FireGL D1100 (RV370 5B65)
        5B66    RV370X
        68B0    EG BROADWAY XT ATI Mobility Radeon HD 5800 Series
        68B8    EG JUNIPER XT ATI Radeon HD 5700 Series
        68BE    EG JUNIPER LE ATI Radeon HD 5700 Series
+       68C0    Madison [Mobility Radeon HD 5000 Series]
        68C1    Redwood [Radeon HD 5600 Series]
+       68D8    Redwood [Radeon HD 5670]
+       68D9    RV830/Redwood HD 5570
+       68DA    Redwood PRO [Radeon HD 5500 Series]
        68E0    Manhattan [Mobility Radeon HD 5000 Series]
+       68F9    Cedar PRO [Radeon HD 5450]
        700F    A3/U1 PCI to AGP Bridge
        7010    RS200 PCI to AGP Bridge
        7100    R520 ATI RADEON X1800 Series
        94B1    RV740 ATI Radeon Graphics Processor
        94B3    RV740 ATI Radeon HD 4770
        94B4    RV740 ATI Radeon HD 4700 Series
-       94B5    RV740 ATI Radeon HD 4770
+       94B5    AA38 ATI Radeon HD 4350
        94C1    RV610-DT (Pro) ATI Radeon HD 2400 XT
        94C3    RV610-DT (LE) ATI Radeon HD 2400 PRO
        94C4    RV610LE ATI Radeon HD 2400 PRO AGP
        9711    RS880 ATI Radeon 4100
        9712    RS880 ATI Mobility Radeon HD 4200
        9713    RS880 ATI Mobility Radeon 4100
+       9714    RS880 [Radeon HD 4290]
+       9715    RS880 [Radeon HD 4250]
        9723    Radeon HD 5450
        9876    ATI GTC (GT-C2U2) ATI 3D Rage Pro AGP 2X
        AA00    R600 Audio Device [Radeon HD 2900 Series]
-       AA01    Ati Function driver for high definition audio - AT Ati Mobility Radeon HD 2600
+       AA01    Ati Function driver for high definition audio - AT Ati Mobility Radeon HD 4650
        AA08    All with HDMI support High Definition Audio Device
        AA10    677 HDMI Audio Support
        AA18    Radeon HD 3870 Audio device
        9033    I960 SCSI Controller
        9040    amd sempron(tm)2200+ Multimedia card
        9060    MegaRAID 434 Ultra GT RAID Controller
-       9063    MegaRAC Controller
+       9063    MegaRAC 780 Remote Assistant
+       9095    9095 SGPIO/SES/IPMI Initiator
 101F   PictureTel Corp.
 1020   Hitachi Computer Electronics
 1021   Oki Electric Industry
        9960    9960 Trident Video Accelerator CyberBlade-1A31
 1024   Zenith Data Systems
 1025   Acer Incorporated
-       0028    AC97 ID:SIL REV:0x27, 08 Agere Systems soft modem chip
+       0028    AC97 Agere Systems soft modem chip
        1435    M1435 CPU to PCI & PCI to ISA Bridge
        1445    ALI M1445 VL to PCI Bridge & Enhanced IDE Adapter
        1449    ALI M1449 PCI to ISA Bridge
        00C5    AIC-7899 U160/m SCSI Controller
        00CF    AIC-7899P U160/m
        0310    L64364 ATMizer r II+ ATM-SAR Chip
+       102A    HYDRA P5 Chipset
        9876    HYDRA P5 CHIPSET
 102B   Matrox Electronic Systems Ltd.
        0010    MGA-I (Impression??)
        010C    VR7701
        0125    uPD720400 PCI Express - PCI/PCI-X Bridge
        013A    Angel Family MPEG Device
+       0194    uPD720200 USB 3.0 Host Controller
        0520    NEC D72874GC 1394 CARD
        1033    0720101gj NEC USB 2.0 Host Adapter
 1034   Burndy/Framatome Connectors USA Ltd
        0540    SiS540 Host-to-PCI Bridge
        0550    SiS550/1/2 CPU to PCI Bridge
        0596    SiS596 Pentium PCI chipset with IDE
-       0597    SiS5513 EIDE Controller (step C)
+       0597    SiS5513 EIDE Controller (C step)
        0601    SiS83C601 PCI Enhanced IDE Controller
        0620    SiS620 Host-to-PCI Bridge
        0630    SiS630 Host-to-PCI Bridge
        1039    SiS5597a SiS5597 SVGAa
        1180    SATA Controller / IDE mode
        1182    SiS965/966 182/1182 RAID Controller
-       1183    ?SIS966/968  ?SATA
+       1183    SIS966/968  SATA IDE Controller
        1184    SIS966(AHCI)&#12289;SIS968(RAID) Raid/AHCI Controller
        1185    SIS968 AHCI Controller
        3602    SiS83C602 EIDE Controller
        5581    SiS5581 Pentium Chipset
        5582    SiS5582 PCI to ISA Bridge
        5591    SiS5591/2 CPU to PCI Bridge
-       5596    SiS5596 PCI, Memory & VGA Controller
+       5596    SiS5596 Pentium Chipset
        5597    SiS5597 Host to PCI bridge
        5600    SiS600 Host-to-PCI Bridge
        5630    SiS630 Host-to-PCI Bridge
        6204    SiS6204 Video decoder & MPEG interface
-       6205    SiS6206 PCI VGA Controller
+       6205    SiS6215 PCI VGA Controller
        6225    SiS 950 m2284dxs PCI Graphics & Video Accelerator
        6236    SiS6236 AGP GUI Accelerator+3D
        6300    SiS630/730 GUI Accelerator+3D
        6330    SiS661FX/M661FX/760/741/M760/M741 GUI 2D/3D Accelerator
        6342    SiS662/760GX/761/761GX
        6350    770/670 PCIE VGA Display Adapter
-       6351    SIS 651 IGP Graphics Drivers
+       6351    SIS M672 FX SiS IGP Graphics family SIS66x/SIS76x & SIS67x
        7001    SiS5597/8 Universal Serial Bus Controller
        7002    SiS 7001 PCI to USB Open Host Controller USB 2.0 Enhanced Host Controller
        7005    SiS551/552 Memory Stick Controller
        1411    HPOJ750 HP PSC 750
        1F1D    ? 3G Broadband device
        201D    ? 3G Broadband device
-       231D    ? 3G Broadband device
+       231D    ? HP Integrated Module with Bluetooth Wireless Technology
        2910    E2910A PCI Bus Exerciser
        2920    Fast Host Interface
        2924    E2924A PCI Host Interface Adapter
        8034    10981734 SDA Standard Compliant SD Host Controller
        8035    N/A PCI GemCore based SmartCard controller
        8036    PCI6515 Texas Instruments PCIxxx12 Cardbus Controller
-       8038    FF001179 Texas Instruments PCI GemCore SmartCard
+       8038    01821028 Texas Instruments PCI GemCore SmartCard
        8039    PCIxx12 Cardbus Controller
        803A    PCIxx12 OHCI Compliant IEEE 1394 Host controller
-       803B    PCI\VEN_104C&DEV_803B&SUBSYS_9015104D&REV_00 Texas Instruments an Integrated FlashMedia Controller
+       803B    PCI\VEN_104C&DEV_803B&SUBSYS_207C17AA&REV_00 Texas Instruments an Integrated FlashMedia Controller
        803C    PCIxx12 SDA Standard Compliant SD Host Controller
        803D    0780 Texas Instruments PCI GemCore based SmartCard controller
        8101    TSB43DB42 IEEE-1394a-2000 Controller (PHY/Link)
        8201    006D103C TI UltraMedia Firmware Loader Device
        8204    4610, 4515, 4610FM, 7510 PCI 7510/4510 Cardbus Controller
        8231    XIO2000A PCI-Express to PCI/PCI-X bridge
+       8232    XIO3130 PCI Express Switch (Upstream)
+       8233    XIO3130 PCI Express Switch (Downstream)
        8235    XIO2200(A) IEEE-1394a-2000 Controller (PHY/Link)
-       823E    XIO2213A PCI Express to PCI Bridge
-       823F    XIO2213A 1394b OHCI with 3-Port PHY
+       823E    XIO2213A/B/XIO2221 PCI Express to PCI Bridge
+       823F    XIO2213A/B/XIO2221 IEEE-1394b OHCI Controller
+       8240    XIO2001 PCI Express-to-PCI Bridge
        8400    ACX100AGHK D-Link AirPlus DWL-520+, Uses a TI 802.11b 22 MBPS Chip
        8401    ACX 100 22Mbps Wireless Interface
        8671    bogus bogus
        AC10    PCI1050 PC Card Controller
        AC11    PCI1030/1053 PC Card Controller
        AC12    PCI1131 PC card CardBus Controller
-       AC13    PCI9066 PCI\\VEN_0180&DEV_0822&SUBSYS_01270025&REV_22
+       AC13    PCI9066 PCI\VEN_104C&DEV_803B&SUBSYS_00011179&REV_00
        AC15    PCI1131 PC Card CardBus Controller
        AC16    PCI1250 PC Card CardBus Controller
        AC17    PCI1220 PC Card CardBus Controller
        18C0    MPC8265A/66 PowerQUICC II PCI Bridge
        18C1    MPC8271/MPC8272
        3052    0644dfea15 MotorolaSM56Modem_PCI device
-       3055    SM56 Motorola SM56 Data Fax Modem - amilo pi 1536
+       3055    SM56 Motorola SM56 Data Fax Modem
        3057    HDAUDIO\FUNC_02om&VEN_1057&DEV_3057&SUBSYS_0001000 Modem Device on High Definition Audio Bus
        3410    DSP56361 Digital Signal Processor
        3421    56IVMR/Phoenix 56ISMR Modem
        5809    MPC5200B
        6400    MPC190 Security Processor (S1 family, encryption)
        6405    MPC184 Security Processor (S1 family)
+       9876    1543 3052
 1058   Electronics Telecommunication Research Inc (ETRI)
 1059   Kontron Canada (Was: Teknor Microsystems)
 105A   Promise Technology Inc
        2312    QLA2312 SANblade 2300 64-bit FC-AL Adapter
        2322    QLA2322 Fibre Channel Adapter
        2422    ISP2422 QLogic PCI to Fibre Channel Host Adapter for QLA2460
-       2432    ISP2432 Dual Channel 4G PCIe Fibre Channel Adapter
+       2432    ISP2432 4Gb PCI Single/Dual Fibre Channel HBA
        2532    ISP2532 8Gb PCIe x8 Single/Dual Fibre Channel HBA
        3010    QLA3010 Network Adapter
        3022    QLA3022 Network Adapter
-       3032    ISP4032-based Ethernet IPv6 NIC
+       3032    n/a QLOGIC Dual Port 1GBPS PCI-E HBA
        4000    QLA4000 SANblade 4000 iSCSI Adapter
        4010    QLA4010 SANblade 4000 iSCSI Adapter
        4022    QLA4022 iSCSI TOE Adapter
        2971    WinFast A350 TDH MyViVo [GeForce FX 5900]
        6609    Winfast TV 2000 XP RM
        6654    Conexant CX23883 [WinFast DTV1800 H]
+       6F34    WinFast DVR3100 H
 107E   Interphase Corp
        0001    FLIPPER FRED Local Bus I/F to PCI Peripheral
        0002    100 VG amylan Controller
 1089   Data General Corporation
 108A   SBS Technologie (Was: Bit3 Computer)
        0001    Model 617 PCI-VME Bus Adapter
-       0003    not sure not sure
+       0003    Model 616 PCI to VME Bridge
        0010    Model 618 VME Bridge
        0040    dataBLIZZARD
        3000    Model 2106 VME Bridge
 109D   Zida Technologies Ltd.
 109E   Conexant (Was: Brooktree Corp)
        032E    Bt878 Video Capture
-       0350    BT848KPF Bt848AKPF video decoder
+       0350    Bt848 Mediastream Controller
        0351    B t878 khf tw card B t878 khf
        0369    Bt878fusion 878a Video Capture
        036C    Bt879(??) Video Capture
        036E    Bt878/Fusion 878A Mediastream Controller
-       036F    Bt878 Video Capturee
+       036F    Bt878 Video Capture
        0370    Bt880B Video Capture (10 bit High qualtiy cap)
        0878    SUBSYS_13EB0070&REV_11 TV Video Capture: Hauppauge WinTV GO
        0879    Bt879khf Video Capture (Audio Section)
        8533    PEX 8533 32-lane, 6-port PCI Express Switch
        8547    PEX 8547 48-lane, 3-port PCI Express Switch
        8548    PEX 8548 48-lane, 9-port PCI Express Switch
+       8604    PEX 8604 4-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8606    PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8608    PEX 8608 8-lane, 8-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8609    PEX 8609 8 Lane, 8 Port PCI Express Switch
+       8612    PEX 8612 12-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8613    PEX 8613 12-lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8614    PEX 8614 12-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8615    PEX 8615 12-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA
+       8616    PEX 8616 16-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8617    PEX 8617 16-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch with P2P
+       8618    PEX 8618 16-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8619    PEX 8619 16-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA
+       8624    PEX 8624 24-lane, 6-Port PCI Express Gen 2 (5.0 GT/s) Switch [ExpressLane]
+       8625    PEX 8625 24-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8632    PEX 8632 32-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8636    PEX 8636 36-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Switch
        8647    PEX 8647 48-Lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8648    PEX 8648 48-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+       8649    PEX 8649 48-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
        8664    PEX 8664 64-Lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch, 35 x 35mm FCBGA
+       8680    PEX 8680 80-lane, 20-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch
+       8696    PEX 8696 96-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch
        9016    PLX 9016 8-port serial controller
        9030    PCI 9030 PCI SMARTarget I/O Accelerator
        9036    PCI9036 Interface chip - value 1k
        1451    M1451 Pentium CPU to PCI Bridge
        1461    ALI M1461 Pentium PCI Chipset
        1489    ALI M1489 486 PCI Chipset
-       1511    M1511 Aladdin 2 Host Bridge
+       1511    M1575 Aladdin 2 Host Bridge
        1512    ALI M1512 Aladdin
        1513    M1513 Aladdin 2 South Bridge
        1521    ALI M1521 Aladdin III CPU to PCI Bridge
        5229    M5229 Southbridge EIDE Controller
        5235    ALI M5235 I/O Controller
        5236    M5273 EHCI USB 2.0
-       5237    M5273 A1 for windows 98 OpenHCI 1.1 USB to  2.0
+       5237    M5273 A1 for windows 2000 OpenHCI 1.1 USB to  2.0
        5239    USB 2.0 Enhanced Host Controller
        5240    EIDE Controller
        5241    PCMCIA Bridge
        0018    Riva 128 Graphics Accelerator [NV3]
        0019    Riva 128ZX GUI+3D Accelerator [NV3]
        0020    Riva TNT GUI+3D Accelerator [NV4]
-       0028    NV05 NVIDIA RIVA TNT2/TNT2 Pro
+       0028    NV05 MCP67 High Definition Audio
        0029    NV05 NVIDIA RIVA TNT 2 Ultra
        002A    Riva TNT2 [NV5]
        002B    Riva TNT2 [NV5]
        00E7    nForce3 250 OpenHCD USB Controller
        00E8    nForce3 250 Enhanced PCI to USB Controller
        00E9    nForce3 AC'97 Modem
-       00EA    nForce3 AC'97 Audio Codec Interface
+       00EA    nForce3 250  Audio Codec Interface (Realtek ALC658)
        00ED    nForce3 250 PCI-PCI Bridge
        00EE    nForce 250 CK8S SATA/RAID Controller
        00F0    BR02 NVIDIA Device
        0176    NV17 NVIDIA GeForce4 MX 420 Go 32M
        0177    NV17 NVIDIA GeForce4 460 Go
        0178    NV17 NVIDIA Quadro4 550 XGL
-       0179    NV17 NVIDIA GeForce4 MX 440 Go 64M
+       0179    NV17.2 NVIDIA GeForce4 MX 440 Go 64M
        017A    NV17 NVIDIA Quadro NVS
        017B    Quadro4 550 XGL [NV17GL.3]
        017C    NV17 NVIDIA Quadro4 500 Go GL
        01D0    G72 NVIDIA GeForce 7350 LE
        01D1    G72 NVIDIA GeForce 7300 LE
        01D2    G72 NVIDIA GeForce 7550 LE
-       01D3    G72 NVIDIA GeForce 7300 SE/7200 GS
+       01D3    G7200 NVIDIA GeForce 7300 SE/7200 GS
        01D5    G72 NVIDIA GeForce 7300 LE
        01D6    GeForce Go 7200
        01D7    Quadro NVS 110M / GeForce Go 7300
        03E8    nForce 430 (MCP61) PCIe bridge
        03E9    nForce 430 (MCP61) PCIe bridge
        03EA    nForce 430 (MCP61) Memory Controller
-       03EB    MCP61 NVIDIA nForce PCI System Management
+       03EB    MCP6P1   85B36Q1    G822B1 NVIDIA nForce PCI System Management
        03EC    nForce 430 (MCP61) IDE Controller
        03EE    nForce 430 (MCP61) Ethernet
        03EF    nForce 405 Nvidia Networking Card
        040D    Quadro FX 1600M
        040E    G84 NVIDIA Quadro FX 570
        040F    G84 NVIDIA Quadro FX 1700
+       0410    G92 [GeForce GT 330]
        0420    G86 NVIDIA GeForce 8400 SE
        0421    G86 NVIDIA GeForce 8500 GT
        0422    G86 NVIDIA GeForce 8400 GS
        0425    NVIDIA 8600m GS NVIDIA 8600m GS
        0426    G86M Geforce 8400M GT GPU
        0427    unknown Geforce 8400M GS
-       0428    NVIDIA� GeForce 8400M G NVIDIA� GeForce 8400M G
+       0428    NVIDIA GeForce 8400M G NVIDIA GeForce 8400M G
        0429    Unknown nVidia Quadro NVS 135M or Quadro NVS 140M
        042A    Quadro NVS 130M
        042B    8400 ?? NVIDIA Quadro NVS 135M
        056D    MCP73 PCI Express bridge
        056E    MCP73 PCI Express bridge
        056F    MCP73 PCI Express bridge
-       05B8    PCI express bridge for GTX 295
-       05BE    PCI express bridge for Quadro Plex S4 / Tesla S870 / Tesla S1070
+       05B1    NF200 PCIe 2.0 switch for mainboards
+       05B8    NF200 PCIe 2.0 switch for GTX 295
+       05BE    NF200 PCIe 2.0 switch for Quadro Plex S4 / Tesla S870 / Tesla S1070
        05E0    GT200b GeForce GTX 295
        05E1    GT200 NVIDIA GeForce GTX 280
        05E2    GT200 NVIDIA GeForce GTX 260
        05E3    GT200b GeForce GTX 285
-       05E6    GT200b [GeForce GTX 275]
+       05E6    GT200 NVIDIA GeForce GT 240M
        05E7    GT200 NVIDIA Tesla C1060
+       05EA    GT200 [GeForce GTX 260]
+       05EB    GT200 [GeForce GTX 295]
        05ED    GT200GL [Quadro Plex 2200 D2]
        05F8    GT200 NVIDIA Quadroplex 2200 S4
        05F9    GT200 NVIDIA Quadro CX
        0600    G92 NVIDIA GeForce 8800 GTS 512
        0601    G92 NVIDIA GeForce 9800 GT
        0602    G92 NVIDIA GeForce 8800 GT
+       0603    G92 [GeForce GT 230]
        0604    G92 NVIDIA GeForce 9800 GX2
        0605    G92 NVIDIA GeForce 9800 GT
        0606    G92 NVIDIA GeForce 8800 GS
+       0607    G92 [GeForce GTS 240]
        0608    G92 [GeForce 9800M GTX]
        0609    GeForce 8800M GTS
        060A    GT200 [GeForce GTX 280M]
        060B    G92 GeForce 9800M GT
        060C    GeForce 8800M GTX
        060D    G92 NVIDIA GeForce 8800 GS
+       060F    G92 [GeForce GTX 285M]
        0610    G92 NVIDIA GeForce 9600 GSO
        0611    G92 NVIDIA GeForce 8800 GT
        0612    G92 NVIDIA GeForce 9800 GTX/9800 GTX+
        0614    G92 NVIDIA GeForce 9800 GT
        0615    G92+ GeForce GTS 250
        0617    G92 [GeForce 9800M GTX]
-       0618    GT200 [GeForce GTX 260M]
+       0618    G92 [GeForce GTX 260M]
        0619    G92 NVIDIA Quadro FX 4700 X2
        061A    G92 NVIDIA Quadro FX 3700
        061B    G92 NVIDIA Quadro VX 200
        061C    G92M [Quadro FX 3600M]
        061D    G92 [Quadro FX 2800M]
+       061E    G92 [Quadro FX 3700M]
        061F    G92 [Quadro FX 3800M]
        0622    G94 NVIDIA GeForce 9600 GT
        0623    G94 NVIDIA GeForce 9600 GS
        062E    G94 NVIDIA GeForce 9600 GT
        0631    G94M [GeForce GTS 160M]
        0632    G94M [GeForce GTS 150M]
+       0635    G94 [GeForce 9600 GSO]
        0637    G94 NVIDIA GeForce 9600 GT
        0638    0638 NVIDIA Quadro FX 1800
        063A    G94M [Quadro FX 2700M]
        0651    G96 [GeForce G 110M]
        0652    G96M Ge Force GT 130M
        0653    G96M [GeForce GT 120M]
+       0654    G96 [GeForce GT 220M]
+       0656    G96 [GeForce 9650 S]
        0658    G96 [Quadro FX 380]
        0659    G96 [Quadro FX 580]
+       065A    G96 [Quadro FX 1700M]
        065B    G96 [GeForce 9400 GT]
        065C    unkown Quadro FX 770M
+       06C0    GTX 480 GeForce GTX 480
+       06CD    GF100 [GeForce GTX 470]
+       06D1    GF100 [Tesla C2050]
        06E0    G98 NVIDIA GeForce 9300 GE
        06E1    G98 NVIDIA GeForce 9300 GS
        06E2    G98 NVIDIA GeForce 8400
        06E8    G98 [GeForce 9200M GS]
        06E9    G98 NVIDIA GeForce 9300M GS
        06EA    unknown nvidia quadro nvs 150m
-       06EB    unknown Quadro NVS 160M
-       06EC    G98M [GeForce G 105M]
+       06EB    G98M Quadro NVS 160M
+       06EC    0x0003 Nvidia Corp
        06EF    G98M [GeForce G 103M]
+       06F1    G98 [GeForce G105M]
        06F8    G98 NVIDIA Quadro NVS 420
        06F9    G98 NVIDIA Quadro FX 370 LP
        06FA    G98 NVIDIA Quadro NVS 450
+       06FB    G98 [Quadro FX 370M]
        06FD    NVS 295 NVidia NVS 295
+       06FF    G98 [HICx16 + Graphics]
        0751    MCP78S [GeForce 8200] Memory Controller
        0752    MCP78S [GeForce 8200] SMBus
        0753    8100 NVIDIA nForce System Management Controller
        07D8    nForce 7100-630i (MCP73PV) nForce 7100-630i (MCP73PV)
        07D9    MCP73 Memory Controller
        07DA    MCP73 Co-processor
-       07DC    nForce 7100-630i (MCP73PV)asdf nForce 7100-630i (MCP73PV)asdf
+       07DC    nForce 7100-630i (MCP73PV) nForce 7100-630i (MCP73PV)
        07DD    MCP73 Ethernet
        07DE    MCP73 Ethernet
        07DF    MCP73 Ethernet
        07F9    MCP73 MCP73 RAID2
        07FA    MCP73 MCP73 RAID3
        07FB    MCP73 MCP73 RAID4
-       07FC    Possibly nForce 610i High Definition Audio Bus
+       07FC    nForce 630i High Definition Audio Bus
        07FE    GeForce 7100/nForce 630i USB
        0844    C77 [GeForce 9100M G]
        0845    C77 [GeForce 8200M G]
+       0846    C77 [GeForce 9200]
        0847    C78 [GeForce 9100]
        0848    C73 NVIDIA GeForce 8300
        0849    C77 NVIDIA GeForce 8200
        0871    C79 NVIDIA GeForce 9200
        0872    C79 [GeForce G102M]
        0873    C79 [GeForce G102M]
+       0874    C79 [ION]
        0876    ION VGA [GeForce 9400M]
        087A    C79 NVIDIA Quadro FX 470
        087D    ION VGA
        087E    ION LE VGA
-       087F    C79 [Quadro FX 470M]
+       087F    ION LE VGA
        0A20    GT216 [GeForce GT 220]
        0A23    GT218 [GeForce 210]
        0A28    GT216 [GeForce GT 230M]
+       0A29    GT216 [GeForce GT 330M]
        0A2A    GT216 [GeForce GT 230M]
+       0A2B    GT216 [GeForce GT 330M]
+       0A2C    GT216 [NVS 5100M]
+       0A2D    GT216 [GeForce GT 320M]
        0A34    GT216 [GeForce GT 240M]
+       0A35    GT216 [GeForce GT 325M]
+       0A3C    GT216 [Quadro FX 880M]
        0A60    GT218 [GeForce G210]
        0A62    GT218 [GeForce 205]
        0A63    GT218 [GeForce 310]
        0A64    GT218 [ION]
        0A65    GeForce 210 Nvidia 200 Series
        0A66    GT218 [GeForce 310]
-       0A6C    NVS 3100M
+       0A68    G98M [GeForce G105M]
+       0A69    G98M [GeForce G105M]
+       0A6A    GT218 [NVS 2100M]
+       0A6C    GT218 [NVS 3100M]
+       0A6E    GT218 [GeForce 305M]
+       0A6F    GT218 [ION]
+       0A70    GT218 [GeForce 310M]
+       0A71    GT218 [GeForce 305M]
+       0A72    GT218 [GeForce 310M]
+       0A73    GT218 [GeForce 305M]
        0A74    GT218 [GeForce G210M]
        0A75    GT218 [GeForce 310M]
        0A78    GT218GL [Quadro FX 380 LP]
+       0A7C    GT218 [Quadro FX 380M]
        0A80    MCP79 Host Bridge
        0A81    MCP79 Host Bridge
        0A82    MCP79 Host Bridge
        0BE2    High Definition Audio Controller
        0BE3    High Definition Audio Controller
        0BE4    High Definition Audio Controller
+       0BE5    GF100 High Definition Audio Controller
+       0CA0    GT215 [GeForce GT 330]
+       0CA2    GT215 [GeForce GT 320]
        0CA3    GT215 [GeForce GT 240]
+       0CA4    GT215 [GeForce GT 340]
+       0CA7    GT215 [GeForce GT 330]
        0CA8    GT215 [GeForce GTS 260M]
        0CA9    GT215 [GeForce GTS 250M]
+       0CAF    GT215 [GeForce GT 335M]
+       0CB0    GT215 [GeForce GTS 350M]
+       0CB1    GT215 [GeForce GTS 360M]
+       0CBC    GT215 [Quadro FX 1800M]
+       0D60    MCP89 HOST Bridge
+       0D68    MCP89 Memory Controller
+       0D69    MCP89 Memory Controller
+       0D76    MCP89 PCI Express Bridge
+       0D79    MCP89 SMBus
+       0D7A    MCP89 Co-Processor
+       0D7B    MCP89 Memory Controller
+       0D7D    MCP89 Ethernet
+       0D80    MCP89 LPC Bridge
+       0D85    MCP89 SATA Controller
+       0D89    MCP89 SATA Controller (AHCI mode)
+       0D8D    MCP89 SATA Controller (RAID mode)
+       0D94    MCP89 High Definition Audio
+       0D9C    MCP89 OHCI USB 1.1 Controller
+       0D9D    MCP89 EHCI USB 2.0 Controller
        10DE    NV34 Riva 128
        10F0    NV3 PCI DEVICE
        1112    0x1112 Gateway Solo 9550 NVIDIA Geforce 2 GO 32 MB
        1AE6    LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
        1AE7    LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:2-3)
        E100    Proteus-X: LightPulse IOV Fibre Channel Host Adapter
+       E131    LightPulse 8Gb/s PCIe Shared I/O Fibre Channel Adapter
        E180    Proteus-X: LightPulse IOV Fibre Channel Host Adapter
        F005    LP1150e Fibre Channel Host Adapter
        F011    LightPulse Fibre Channel Host Adapter (Saturn)
        F0F5    Neptune LightPulse Fibre Channel Host Adapter
        F0F6    LPX000 Fibre Channel Storport Driver
        F0F7    LPX000 Fibre Channel Storport Driver
-       F100    LPe12000 / LPe12002 8Gb PCIe Single / Dual port Fibre Channel Adapter
+       F100    LPe12000 / LPe12002 / LPe1205 8Gb PCIe Single / Dual port Fibre Channel Adapter
        F111    Saturn-X LightPulse Fibre Channel Host Adapter
        F112    Saturn-X LightPulse Fibre Channel Host Adapter
        F180    LPSe12002 EmulexSecure Fibre Channel Adapter
        FD00    L2A2860 HELIOS v1.11 Emulex LP11002
        FD11    LPX000 Fibre Channel Storport Driver
        FD12    LPX000 Fibre Channel Storport Driver
-       FE00    Zephyr-X LightPulse Fibre Channel Host Adapter
+       FE00    LPe11000 / LPe11002 / LPe1105 4Gb PCIe Single / Dual port Fibre Channel Adapter
        FE04    LPX000 Fibre Channel Storport Driver
        FE05    Zephyr-X: LightPulse FCoE Adapter
        FE11    LPX000 Fibre Channel Storport Driver
        0261    261 High Definition Audio
        0262    ALC882 Realtek High Definition Audio
        0268    Realtek ALC268 Realtek 2+2 High Definition Audio
-       0269    I don't know about chip number Realtek High Definition Audio
+       0269    ALC269 Realtek High Definition Audio
        0280    280 High Definition Audio
        0660    Realtek HD Audio High Definition Audio
        0662    ALC662 Realtek 5.1 High Definition Audio
        0883    ALC883 Realtek 7.1+2 High Definition Audio
        0885    ALC885 8-channel High Definition Audio
        0888    ALC888 Realtek 7.1+2 High Definition Audio
+       1003    123 321
+       7305    RTU7305 RF  controller UWD Wireless USB
        8021    RTL8029AS NIC
-       8029    RTL8029 PCI Full-Duplex Ethernet Controller with PnP Function
+       8029    RTL8028 PCI Full-Duplex Ethernet Controller with PnP Function
        8119    10 32BIT Card Bus 10/100 (10EC-8119)
        8129    RT8129/8130 Fast Ethernet Adapter
        8131    LFE8139ATX ethernet controller
        8136    Rtl8023 Realtek 10/100/1000 PCI-E NIC Family all in one NDIS Driver v5.728.0604.2009 06/04/2009
+       8137    10101010 milindmilind
        8138    RT8139 (B/C) CardBus Fast Ethernet Adapter
        8139    RTL-8139/8139C/8139D Realtek RTL8139 Family PCI Fast Ethernet NIC
        8167    RTL8169 / RTL8111B / RTL8111C Realtek RTL8169/8110 Family Gigabit Ethernet NIC
        8168    RTL8168/8111/8111c Gigabit Ethernet NIC(NDIS 6.0)
        8169    RTL8110 Single Gigabit LOM Ethernet Controller
+       8171    RTL8191SEvA Wireless LAN Controller
        8172    RTL8191SE ? Realtek RTL8191SE wireless LAN 802.11N PCI-E NIC
+       8173    RTL8192SE Wireless LAN Controller
+       8174    RTL8192SE Wireless LAN Controller
        8180    RTL8180L IEEE 802.11b Wireless MAC and Baseband Processor
        8185    RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller (rev 20)
-       8186    RTL8111/8168B PCI Express Gigabit Ethernet controller
+       8186    RTL8100C PCI Express Gigabit Ethernet controller
        8192    0280 -
        8197    8187B Wireless 802.11b/g 54Mbps USB 2.0 Network Adapter
        8199    RTL8187SE Single-Chip IEEE 802.11b/g WLAN Controller w/PCI Express Interface
 10EE   Xilinx Corporation
        0001    EUROCOM for PCI (ECOMP)
        0002    Octal E1/T1 for PCI ETP Card
+       0007    Zomojo Z1
        0205    Wildcard TE205P
        0210    Wildcard TE210P
        0314    Spartan XC2S50E Communications Controller
        8381    Ellips Santos Frame Grabber
        A123    XA3S1600E Spartan 3E
        A124    Spartan 3E XA3S1600E
+       A125    Spartan 6 XC6SLX45
        D154    Copley Controls CAN card (PCI-CAN-02)
        EBF0    SED Systems Modulator/Demodulator
        EBF1    SED Systems Audio Interface Card
        0005    SB0460 SoundBlaster X-FI XtremeMusic
        0006    emu10k1x Soundblaster Live! 5.1 (SB0200)
        0007    C6SB0410515017656A Device ID same for both, but Subsystem ID = 0x1012 - Extreme Audio, 0x100A - Audigy SE 7.1
-       0008    ca0108 sound blaster Audigy 2
+       0008    ca0108 sound blaster Audigy 2 or 4
        0009    [SB X-Fi Xtreme Audio] CA0110-IBG
        000B    X-Fi Titanium series [EMU20k2]
-       1017    ct4830 3D Blaster Banshee PCI CT6760
+       1017    5803 3D Blaster Banshee PCI CT6760
        1020    NV5 3D Blaster RIVA TNT2
        1047    EV1938 3D Blaster Annihilator 2
-       1371    ES1371-3  ES1373 AudioPCI
+       1371    ES1373  ES1373 AudioPCI
        2898    es2898 es56t-p1
        4001    EMU10K1 Audigy IEEE1394a Firewire Controller
        647D    AC'97 Audio Device
        7002    EMU10K1 GamePort
        7003    EMU10K2  Creative Labs SB Audigy MIDI/Game port
        7004    3 Game port for SB Live! Series
-       7005    ??? Audigy LS Series Game Port
+       7005    650 Audigy LS Series Game Port
        7006    [SB X-Fi Xtreme Audio] CA0110-IBG PCI to PCIe Bridge
        7802    EMU1OK1-NGF Environmental Audio (SB  Live)
        8064    SB0100 (SBLive! 5.1 OEM)
        1708    VIA VT1708  High Definition Audio controller
        1732    VT1732 [Envy24 II] PCI Multi-Channel Audio Controller
        2006    VT6105M VIA Rhine III VT6105M Fast Ethernet controller
+       2038    Unknown PCI Device
        2106    VT6105 Rhine Family Fast Ethernet Adapter
        2204    K8M400 CPU to PCI Bridge
        2208    PT890 Standard Host Bridge
        3058    VT8275 AC97 Audio Codec (All VIA Chipsets)
        3059    VT8233/A AC'97 Enhanced Audio Controller
        3065    VT6103 Rhine II PCI Fast Ethernet Controller
-       3068    PCI\VEN_1106&DEV_3068&SUBSYS_100B14FF&REV_80\3&267 VIA MC97 controller for AC-Link modems
+       3068    PCI\VEN_1106&DEV_3068&SUBSYS_4c211543_rev_80\3_61a VIA MC97 controller for AC-Link modems
        3074    VT8233 PCI to ISA Bridge
        3086    VT82C686 Power Management Controller (??)
        3091    VT8633 Apollo Pro 266 CPU to PCI Bridge
        324A    CX700 PCI to PCI Bridge
        324B    CX700 Host Bridge
        324E    CX700 Internal Module Bus
-       3253    VIA VT6655 WiFi Adapter, 802.11a/b/g
+       3253    VT6655 PCI-Cardbus Wireless LAN Adapter
        3258    PT880 CPU-to-PCI Bridge
        3259    PM880 CPU to PCI Bridge
        3260    VIA Chrome9 HC IGP
        3372    VT8237S PCI to ISA Bridge
        337A    VT8237A Standard PCI to PCI Bridge
        337B    VT8237A Standard PCI to PCIe Bridge
+       3403    VT6315 Series Firewire Controller
        3409    VX855/VX875 DRAM Bus Control
        4149    VT6420 ATA/ATAPI Host Controller
        4204    K8M400 CPU to PCI Bridge
        8D04    KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR]
        9238    K8T890 I/O APIC
        9398    VT8601 2D/3D Graphics Accelerator
-       9530    050100 Via MSP Cardreader driver
+       9530    1106 Via MSP Cardreader driver
        95D0    SDIO Host Controller
+       9875    1 pci
        9876    VT8233/A AC97' Enhance Audio Controller PCI to ISA Bridge
        A208    PT890 PCI-to-PCI Bridge
        A238    K8T890 PCI-to-PCI Bridge
        2340    4 Port Fast Ethernet Adapter
        2400    2400 ATM adapter
 1113   Accton Technology Corporation
-       1211    EN5030, EN5038 Ethernet Controller 10/100 MBit
+       1211    EN5030, EN5038,EN1207D-TX Ethernet Controller 10/100 MBit
        1216    EN-5251 Based Fast Ethernet Adapter
        1217    EN-2242 Ethernet Adapter
        5105    10Mbps Network Card
-       9211    EN-1207D Fast Ethernet Adapter
+       9211    EN-1207F Fast Ethernet Adapter
        9511    SMC en5251be 0445tabgf16143.1
        9876    EN5251BE Ethernet Controller/ drivers
        D301    CPWNA100 (Philips wireless PCMCIA)
        7634    IDT_Audiov5939 IDT/Sigmae HDl Audio Driver v6.10.5939.0 05/06/2008
        7662    IDT_Audiov5939 IDT/Sigmae HDl Audio Driver v6.10.5939.0 05/06/2008
        7675    92HD73C1 92HD73C1
-       76B2    92HD71B7 IDT Audio
+       76A0    102801FF SigmaTel High Definition Audio CODEC (Dell Precision M4300 and LAT D630)
+       76B2    92HD75B3 IDT Audio
        76D5    0x76D5 0x3649
        8018    PES12N3A PCI Express Switch
        801C    PES24N3A PCI Express Switch
        7134    SAA7134HL Multimedia Capture Device
        7135    SAA???? Multimedia Device(??)
        7145    SAA7145 Multimedia PCI Bridge
-       7146    saa7146 PCI\VEN_1131&DEV_7130&SUBSYS_D1091461&REV_01\3&61AAA01&0&60
+       7146    saa7130 PCI\VEN_1131&DEV_7130&SUBSYS_00001131&REV_01\4&1A671D0C&0&58F0
        7160    Philips SAA7134E, TDA10046 and TDA8275A PCI\VEN_13D0&DEV_2103&SUBSYS_210313D0&REV_02\4&1AF1648C&0&10F0
        7162    SAA7162 Hybrid Capture Device
        9730    SAA9730 Ethernet controller
        0019    Datafire PCI 1 U (Multifunction)
        001A    DataFirePRIme E1 (1-port)
        001B    AccelePort C/X (IBM)
+       001C    AccelePort Xr (SAIP)
        001D    DataFire RAS T1/E1/PRI
        001F    ClydeNonCsu6034
        0020    ClydeNonCsu6032
        0081    DataFire SYNC 2000 2P Adapter
        00B0    Digi Neo 4
        00B1    Digi Neo 8
-       00C8    Digi Neo 2 DB9
+       00C8    20F0 Digi Neo 2
        00C9    Digi Neo 2 DB9 PRI
        00CA    Digi Neo 2 RJ45
        00CB    Digi Neo 2 RJ45 PRI
        0236    Local Display Controller
        0237    NVRAM Controller
        0238    BCM5785 [HT1000] WDTimer
-       0240    K2 SATA
-       0241    BC4852 8-Channel RAIDCore\99 SATA RAID Host Bus Adapter
-       0242    RAIDCore BC4000
-       024A    HT1000 Broadcom/Serverworks HT1000 SATA Controller
-       024B    BCM5785 (HT1000) PATA/IDE Mode
+       0240    RaidCore4000 Apple K2 SATA AHCI&RAID Controller
+       0241    RC5000Series&BC48??(4850L&4852...) ServerWorks Frodo4 SATA RAID Controller
+       0242    RaidCore4000 Series ServerWorks Frodo8 8xSATA RAID
+       024A    BC5785 Broadcom5785/Serverworks HT1000 AHCI Controller
+       024B    BC5785 BC5785/ServerWorks HT1000 SATA(IDE MODE)
+       0252    RaidCore5000 Series ServerWorks Elrond 8xSAS/SATAII
        0406    HT1100 PCI-X Bridge
        0408    HT1100 Legacy Device
        040A    HT1100 ISA-LPC Bridge
        0604    PCI to PCI Bridge for Notebooks
        0605    PCI to ISA Bridge for Notebooks
        0606    PCI to ISA Bridge for Notebooks
-       0609    PCI to PCI Bridge for Notebooks
+       0609    0322 PCI to PCI Bridge for Notebooks
        060A    ToPIC95B Toshiba ToPIC95 CardBus Controller
        060F    ToPIC97 CardBus Controller
        0611    PCI to ISA Bridge
        0554    R5C554
        0575    SD Bus Host Adapter
        0576    SD Bus Host Adapter
-       0592    13171043 Ricoh Memory Stick Host Controller
+       0592    FF621179 Ricoh Memory Stick Host Controller
        0811    R5C811
        0822    R5C832 SDA Standard Compliant SD Host Controller
        0832    30CF103C IEEE 1394 (4 pin firewire) chip)
        0841    R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394
        0843    R5C853 Ricoh SD/MMC Host Controller
        0852    01cf1028 http://driverzone.com/device.php?id=51441
+       1108    30CF Ricoh Memory Stick Host Controller
        5551    Unknown IEEE 1394 Controller
        E230    R5U230 Ricoh PCIe Memory Stick Host Controller
        E832    R5U832 Ricoh PCIe IEEE1394 Fireware Host Controller
        1561    DRP-32TXD CardBus PC Card
        2027    DWL-G520 AirPlus Xtreme G Adapter
        3065    14001186 D-Link DFE-500Tx PCI fast Ethernet adapter Re v.A
-       3106    DFE 530TX+ rev E1 Fast Ethernet Adapter
+       3106    DFE 520TX/530TX+ rev E1 Fast Ethernet Adapter
        3203    DWL-G520 AirPlus Xtreme G Adapter
        3300    D-Link Air Wireless Network (DWL-G510) IEEE 802.11g PCI card
        3A03    DWL-A650 AirPro Wireless CardBus Adapter(rev.B)
        0324    Model 24 Road Runner Frame Grabber
        0344    Model 44 Road Runner Frame Grabber
 118E   Hermstedt GmbH
+       0842    02321038
 118F   Green Logic
 1190   Tripace
        2550    TC-2550 Single Chip Ultra (Wide) SCSI Processor
        0006    ATP860A UltraDMA66 EIDE Controller, NO-BIOS (AEC6260)
        0007    ATP860R UltraDMA66 EIDE Controller (AEC6260)
        0008    ATP865 2CH PCI UltraDMA133 IDE Controller
-       0009    ATP865 2CH PCI UltraDMA133 IDE Controller
+       0009    ATP865 AEC6280PATA133|AEC6880 PATA RAID|AEC6290 SATA|AEC6890 SATA RAID|AEC6891 SATA RAID
        000A    aec6885 ACARD AEC-6885/6895/6896 RAID Controller
        000B    AEC6897/6898 ACARD AEC-6897/6898 RAID Controller
        000D    ATP8620 2S1P PCI-X SATA(3G)/UDMA Combo Controller
        000E    ATP8620
        8001    ATP8600 SCSI-2 RAID (Cache??) Host Adapter (AEC6820U)
-       8002    ATP850S SCSI-2 Host Adapter (AEC6710L/F/s)
+       8002    ATP850S AEC6710S/U/UW SCSI-2 Host Adapter
        8010    ATP870 Ultra Wide SCSI Contoller (AEC6712UW)
-       8020    ATP870 Ultra SCSI Controller (AEC6712U)
-       8030    ATP870 SCSI Controller (AEC6710S/6712S)
+       8020    ATP870 AEC6712U/TU Ultra SCSI Controller
+       8030    ATP870 AEC 6712S/TS Ultra SCSI Controller
        8040    ATP870 SCSI Controller (AEC6710D)
-       8050    Ultra Wide SCSI Controller
+       8050    AEC6715UW Ultra Wide SCSI Controller
        8060    AEC671x SCSI Host Adapter
        8080    AEC67160 SCSI
        8081    AEC-67160 PCI Ultra160 LVD/SE SCSI Adapter
        4354    88E8040 Marvell Yukon 88E8040 PCI-E Fast Ethernet Controller
        4355    88E8040T Marvell Yukon 88E8040T PCI-E Fast Ethernet Controller
        4356    Yukon 88EC033 PCI-E Fast Ethernet Controller
-       4357    marvell ethernet lan
+       4357    marvell ethernet lan No painel
        435A    88E8048 PCI-E Fast Ethernet Controller
        4360    88E8050 Yukon PCI-E ASF Gigabit Ethernet Controller
        4361    Yukon 88E8050 PCI-E ASF Gigabit Ethernet Controller
        4362    88E8053 Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller
-       4363    88E8055 Yukon PCI-E Gigabit Ethernet Controller
+       4363    88E8042 Yukon PCI-E Gigabit Ethernet Controller
        4364    88E8056 Yukon PCI-E Gigabit Ethernet Controller
        4365    Yukon 88E8070 PCI-E Gigabit Ethernet Controller
        4366    Yukon 88EC036 PCI-E Gigabit Ethernet Controller
        436A    Yukon 88E8058 PCI-E Gigabit Ethernet Controller
        436B    Yukon 88E8071 PCI-E Gigabit Ethernet Controller
        436C    88E8072 Marvell 8072 Ethernet Nic
+       436D    88E8055 PCI-E Gigabit Ethernet Controller
        4370    88E8075 PCI-E Gigabit Ethernet Controller
        4380    88e8057 Marvell Yukon 88E8057 PCI-E Gigabit Ethernet Controller
+       4381    88E8059 PCI-E Gigabit Ethernet Controller
        4611    GT-64115 System Controller
        4620    GT-64120 System Controller for R5000 & R7000 (64-bit PCI)
        4801    GT-48001 8-port Switched Ethernet Controller
        6281    88F6281 [Kirkwood] ARM SoC
        6320    GT-64130/131 System Controller for PowerPC Processors
        6381    MV78xx0 [Discovery Innovation] ARM SoC
-       6440    ? 64xx/63xx SAS
+       6440    88SE6320 64xx/63xx SAS
        6450    64560 System Controller
        6460    MV64360/64361/64362 System Controller
        6480    MV64460/64461/64462 System Controller
        7042    MV88SXxxxx Family 4-port SATA II PCIe Controller (??)
        7810    MV78100 [Discovery Innovation] ARM SoC
        7820    MV78200 [Discovery Innovation] ARM SoC
+       9128    SE9128 SATA3  6 GB/s  SATA3/Raid Controller
        9653    GT-96100A Advanced Communication Controller
        F003    GT-64010 Primary Image Piranha Image Generator
        F004    GT-64120 Primary Image Barracuda Image Generator
 11AC   Canon Information Systems
 11AD   Lite-On Communications Inc
        0001    LC82C168 Fast Ethernet Adapter (??)
-       0002    LC82C169C NETGEAR FA310TX Fast Ethernet PCI Adapter
+       0002    LC82C169 NETGEAR FA310TX Fast Ethernet PCI Adapter
        C115    LC82C115 PNIC II PCI MAC/PHY
 11AE   Scitex Corporation Ltd
        4153    Bridge Controller
 11BB   Pyramid Technology/DAPHA Electronics Corp
 11BC   Network Peripherals Inc
        0001    NPI NuCard PCI FDDI
-11BD   Pinnacle Systems Inc
+11BD   NABOHO/INFORMATICIEN /BURKINA
        0015    FireWire IEEE1394
        002E    PCTV 40i
        0040    Royal TS Function 1
        0042    Royal TS Function 3
        0051    PCTV HD 800i
        1158    48 spécialité électronique et informatique
-       11BD    45 maintenance informatique
+       11BD    40 maintenance informatique
+       2020    assistance en ligne 70003823/76199706
        BEBE    51015777 MAINTENANCE INFORMATIQUE VENTE DE CONSOMABLE
        BEDE    51011810 MB87J3560
 11BE   International Microcircuits Inc
        0447    LT Winmodem windowsme
        0448    LT Winmodem 56k SV2P2
        0449    LT Winmodem 56k 0449144F
-       044A    LT Winmodem 56k
+       044A    LT Winmodem 56k pci ven_1904
        044B    LT Winmodem
        044C    LT Winmodem 9M56PML-G
        044D    LT Winmodem
        048F    SV92P-T00 Agere PCI Soft Modem. SV92PL
        0600    sv92p2 SV92P-T00 Agere PCI Soft Modem. SV92PL
        0620    SV92PP Agere PCI Soft Modem
+       0630    #1: SV92EX / TNN / 30931K #2: CSP1040 / AGR A3 / 9 #1: 32 pins, 8 each on 4 sides #2: 20 pins, 10 ea on 2 sides
        1040    Prespa VEN_11C1&DEV_1040&SUBSYS_11790001
-       11C1    Prespa VEN_11C1&DEV_0620&SUBSYS_11790001&REV_1002
+       11C1    Prespa Agere Systems HDA Modem
        2600    StarPro26XX family (SP2601, SP2603, SP2612) DSP
        3026    0x11c11040 Agere Systems HDA Modem
        5400    OR3TP12 FPSC FPGA with 32/64bit, 33/66MHz core
 11D3   Trancell Systems Inc
 11D4   Analog Devices, Inc.
        0078    AD1986HD sound chip
+       11D4    AD198b SoundMAX Integrated Digital HD Audio
        1535    ADSP-21535 Blackfin DSP PCI Bus Interface
        1805    Motorola SM56 PCI Speakerphone Modem
        1807    56k Winmodem Chip
 1227   Tech-Source
        0006    Raptor GFX 8P
        0023    Raptor GFX [1100T]
+       0045    Raptor 4000-L [Linux version]
+       004A    Raptor 4000-LR-L [Linux version]
 1228   Norsk Elektro Optikk A/S
 1229   Data Kinesis Inc.
 122A   Integrated Telecom
        1968    ES2839 Maestro-2 PCI audio accelerator
        1969    ES72222 Solo-1 PCI AudioDrive family
        1978    ES1978 Maestro-2E Audiodrive, ES1970 Canyon3D
-       1988    ES1989 ESS Allegro PCI Audio (WDM)
+       1988    ES1999 ESS Allegro PCI Audio (WDM)
        1989    ES1989 Allegro ES56CVM-PI PCI Voice+Fax Modem
        1990    ES2898S
        1998    ES1980 Maestro-3 PCI Audio Accelerator
 1260   Intersil Americas Inc (Was: Harris Semiconductor)
        3872    PRISM 3 LAN-Express IEEE 802.11b PCI Adapter
        3873    PRISM 2.5 802.11b 11Mbps Wireless Controller
-       3886    Unknown Creatix CTX405 WLAN Controller
+       3877    ISL3877 [Prism Indigo]
+       3886    003617SF Creatix CTX405 WLAN Controller / ZyAir G100 - WLAN
        3890    ISL3890 PRISM GT 802.11g 54Mbps Wireless Controller
        8130    HMP8130 NTSC/PAL Video Decoder
        8131    HMP8131 NTSC/PAL Video Decoder
 1280   Photoscript Group Ltd.
 1281   Yokogawa Electronic Corp.
 1282   Davicom Semiconductor Inc.
+       1282    DM9102AF DEV
        6585    DM562P V90 Modem
        9009    DM9009 Ethernet Adapter
        9100    DM9100 Ethernet Controller
        000C    ST128 Ctrl Port
 128F   Tateno Dennou Inc.
 1290   Sord Computer Corporation
+       0010    ? ?
 1291   NCS Computer Italia
 1292   Tritech Microelectronics Intl PTE
        FC02    Pyramid3D TR25202
 12CF   Prophet Systems Inc.
 12D0   GDE Systems Inc.
 12D1   PsiTech
+       1003    unknow usbserial converter
 12D2   Nvidia (Was:STB,SGS Thompson)
        0008    NV1
        0009    DAC64
        8154    PI7C8154A/PI7C8154B/PI7C8154BI PCI-to-PCI Bridge
        A404    PI7C9X20404SL PCIe Packet Switch
        E110    PI7C9X110 PCI Express to PCI bridge
+       E111    P17C9X PCI to PCIe Bridge
        E130    PI7C9X130 PCI-X Bridge
 12D9   Aculab Plc.
        0002    PCI Prosody
        8803    Vortex 56k Software Modem
 12EC   3A International Inc.
        8139    0xxxx 0xxxx
+       8140    10 asf
 12ED   Optivision Inc.
 12EE   Orange Micro, Inc.
 12EF   Vienna Systems
        0019    PCI-DAS1200/JR
        001A    PCI-DAS1001
        001B    PCI-DAS1002
-       001C    PCI-DAS1602JR/16
+       001C    PCI-DAS1602JR/16 AR2425
        001D    PCI-DAS6402/16
        001E    PCI-DAS6402/12
        001F    PCI-DAS16/M1
 1347   Spectracom Corporation
 1349   Sumitomo Electric Industries Ltd
 134A   DTC Technology Corp.
-       0001    F01 2ASV17184.1 Domex DMX 3191 PCI SCSI Controller
+       0001    F01 2ASV17184.1 Domex DMX 3191D PCI SCSI Controller
        0002    Domex DMX3192U/3194UP SCSI Adapter
 134B   ARK Research Corp.
 134C   Chori Joho System Co. Ltd
        4E00    WG511v2 54 Mbps Wireless PC Card
        4F00    WG511U Double 108 Mbps  Wireless PC Card
        5200    GA511 Gigabit PC Card
-       620A    GA620
+       620A    GA620 Toshiba
        622A    GA622
        630A    GA630
        6B00    WG311v3 54 Mbps Wireless PCI Adapter
        F312    FA312 REV-A1 Fast Ethernet PCI Adapter
 1386   Video Domain Technologies
 1387   Curtiss-Wright Controls Embedded Computing
+       4640    -none- sl240
        5310    N/A SCRAMNet GT200
 1388   Hitachi Information Technology Co Ltd
 1389   Applicom International
        0001    PCI1500PFB Intelligent fieldbus Adapter
        0104    PCI-CANIO PCI-CANIO adapter
-138A   Fusion Micromedia Corp
+138A   Validity Sensors, Inc.
 138B   Tokimec Inc
 138C   Silicon Reality
 138D   Future Techno Designs Pty Ltd
        0020    7954/7955 Cryptographic Processor
        0026    8155 Security Processor
        002E    9630 Compression Processor
-       0037    DS4100 Secure Multi-Gigabit Server Adapter with Compression
+       002F    9725 Compression and Security Processor
+       0033    8201 Compression and Security Processor
+       0034    8202 Compression and Security Processor
+       0035    8203 Compression and Security Processor
 13A4   Rascom Inc
 13A5   Audio Digital Imaging Inc
 13A6   Videonics Inc
 13FD   Micro Science Inc
        160E    a a
        161F    1D59CB92 s
-       1840    don't know what you mean... :-( USB Harddisk adapter
+       1840    INIC-1608L SATA/150 device to USB 2.0 Host interface (http://www.initio.com/Html/inic-1608.html)
 13FE   Advantech Co., Ltd.
        1240    NOVA MCX314 4-Axis Stepping/Servo Motor Card
        1600    PCI-16xx series PCI multiport serial board (function 0)
 1414   Microsoft Corp
        0001    MN-120 (ADMtek Centaur-C based)
        0002    MN-130 (ADMtek Centaur-P based)
+       5353    Hyper-V virtual VGA
        5801    XMA Decoder (Xenon)
        5802    SATA Controller - CdRom (Xenon)
        5803    SATA Controller - Disk (Xenon)
        0385    TPMC901 Extended CAN bus with 2/4/6 CAN controller
        21CC    TCP460 CompactPCI 16 Channel Serial Interface RS232/RS422
        21CD    TCP461 CompactPCI 8 Channel Serial Interface RS232/RS422
+       3064    TPCI100 (2 Slot IndustryPack PCI Carrier)
        30C8    TPCI200
 1499   Micro-Technology Co Ltd
 149A   Andor Technology Ltd
        1612    BCM70010/BCM70012 Broadcom Video Decoder/Accelerator
        1639    BCM5709 NetXtreme II Gigabit Ethernet
        163A    NetXtreme II BCM5709S Gigabit Ethernet
-       163B    NetXtreme II BCM5716 Gigabit Ethernet
+       163B    BCM5709 Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver
        163C    NetXtreme II BCM5716S Gigabit Ethernet
        1644    BCM5700 NetXtreme Gigabit Ethernet Controller
        1645    BCM5701 broadtcomBCM5701 Gigabit Ethernet
        165C    NetXtreme BCM5724 Gigabit Ethernet PCIe
        165D    BCM5705M Broadcom NetXtreme Gigabit Ethernet
        165E    BCM5705MA2 NetXtreme Gigabit Ethernet
+       1662    NetXtreme II BCM57712 10 Gigabit Ethernet
        1668    NetXtreme BCM5714 Gigabit Ethernet
        1669    NetXtreme 5714S Gigabit Ethernet
        166A    BCM5780 Broadcom NetXtreme Gigabit Ethernet 5780
        1673    NetXtreme BCM5755M Gigabit Ethernet PCIe
        1674    NetXtreme BCM5756ME Gigabit Ethernet PCIe
        1676    BCM5750A1 NetXtreme Gigabit Ethernet
-       1677    BCM5750A1 NetXtreme Gigabit Ethernet PCI Express
+       1677    BCM5750A1 NetXtreme Gigabit Ethernet PCIe
        1678    BCM5715C 10/100/100 PCIe Ethernet Controller
        1679    NetXtreme 5715S Gigabit Ethernet
        167A    BCM5754 Broadcom NetXtreme Gigabit Ethernet Controller
        1680    NetXtreme BCM5761e Gigabit Ethernet PCIe
        1681    BCM5761 Broadcom 57XX Gigabit Integrated Controller
        1684    BCM5764 Broadcom NetXtreme Gigabit Ethernet
+       1685    NetXtreme II BCM57500S Gigabit Ethernet
+       168A    NetXtreme II BCM57800S 10 Gigabit Ethernet
+       168D    NetXtreme II BCM57840S 20 Gigabit Ethernet
+       168E    NetXtreme II BCM57810S 10 Gigabit Ethernet
        1690    NetXtreme BCM57760 Gigabit Ethernet PCIe
        1691    NetLink BCM57788 Gigabit Ethernet PCIe
-       1692    NetLink BCM57780 Gigabit Ethernet PCIe
-       1693    BCM5787A Ethernet Controller Broadcom Netlink Gigabit
+       1692    BCM57780 NetLink
+       1693    BCM5784 Ethernet Controller Broadcom Netlink Gigabit
        1694    NetLink BCM57790 Gigabit Ethernet PCIe
        1696    BCM5782 Broadcom NetXtreme Gigabit Ethernet - http://www.broadcom.com/support/ethernet_nic/downloaddrivers.p
-       1698    BCM5786gigabit ethernet pcie NetLink
+       1698    BCM5784M NetLink-FOR DELL LAPTOP AND MAYBE OTHERS
        1699    NetLink BCM5785 Gigabit Ethernet
        169A    NetLink BCM5786 Gigabit Ethernet PCIe
        169B    NetLink BCM5787 Gigabit Ethernet PCIe
        4318    BCM4318 Broadcom 802.11b/g
        4319    Dell Wireless 1470 DualBand WLAN
        431A    802.11a Network Adapter
-       4320    BCM4309 802.11b/g Wireless LAN Controller
+       4320    BCM4310 802.11b/g Wireless LAN Controller
        4321    BCM4306 802.11a Wireless LAN Controller
        4322    BCM4306 UART
        4323    BCM4306 V.90 56k Modem
        4324    BCM4309 802.11a/b/g Wireless LAN Controller
        4325    BCM4306 802.11b/g Wireless LAN Controller
        4326    BCM4307 Chipcommon I/O Controller(??)
-       4328    BCM4321KFBG Broadcom 432AGN 802.11a/b/g/draft-n Wi-Fi Solution
-       4329    BCM43XNG 802.11n Network Adapter
+       4328    BCM4321KFBG Broadcom BCM43xx 1.0 (5.10.91.27)
+       4329    BCM43XX Broadcom 802.11n Network Adapter
        432A    802.11n Network Adapter
-       432B    4322 WIRELESS for Hp pavilion, Wireless for macbook pro (late 2009 model), Wireless for Dell e6500  , Ali
+       432B    4322 WIRELESS for Hp pavilion, Wireless for macbook pro (late 2009 model), Wireless for Dell e6500 ,Dell
+       432C    BCM4322 802.11b/g/n
+       432D    BCM4322 802.11a/b/g/n
        4344    EDGE/GPRS data and 802.11b/g combo cardbus [GC89]
+       4353    BCM43224 802.11a/b/g/n
+       4357    BCM43225 802.11b/g/n
        4401    BCM4401 10/100 Integrated Ethernet Controller
        4402    BCM440x 10/100 Integrated Ethernet Controller
        4403    BCM4402 V.90 56k Modem
        4718    BCM47xx Sentry5 Crypto Accelerator
        4719    BCM47xx/53xx RoboSwitch Core
        4720    BCM4712 MIPS CPU
+       4727    BCM4313 802.11b/g LP-PHY
        5365    BCM5365P Sentry5 PCI to SB Bridge
        5600    BCM5600 StrataSwitch 24+2 Ethernet Switch Controller
        5605    BCM5605 StrataSwitch 24+2 Ethernet Switch Controller
-       5615    BCM5615 StrataSwitch 24+2 Ethernet Switch Controller
+       5615    BCM5784 StrataSwitch 24+2 Ethernet Switch Controller
        5625    BCM5625 StrataSwitch 24+2 Ethernet Switch Controller
        5645    BCM5645 StrataSwitch 24+2 Ethernet Switch Controller
        5670    BCM5670 8-Port 10GE Ethernet Switch Fabric
        1454    HCF 56k Data/Fax/Voice Modem
        1455    HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
        1456    HCF 56k Data/Fax/Voice/Spkp Modem
-       14F1    14F12F30 Conextant High Definition Audio_Venice5051
+       14F1    14F12F20 Conextant High Definition Audio_Venice5051
        1610    ADSL AccessRunner PCI Arbitration Device
        1611    AccessRunner PCI ADSL Interface Device
        1612    8 8
        2F40    71030277 Conexant Modem RD02-D490
        2F50    205F14F1 unknown
        2F82    cx9510-11z Conexant PCI-E Soft Data/Fax Modem with SmartCP
-       5045    4.0.3.1 HDAUDIO Soft Data Fax Modem with SmartCP / Conexant High Definition Audio (SmartAudio HD2)
+       5045    4.0.3.1 HDAUDIO Soft Data Fax MDrivers Available for Windows XP from HP Site for HP Pavilion DV9000 series:
        5047    High Definition Audio [Waikiki]
        5051    4.0.1.6 Audio
+       5066    Cx20561 HDAUDIO\Func_01&VEN_14F1&DEV_5066&SUBSYS_17AA4002&REV_1003
        5B7A    Belived to be a CX23416 Single-Chip MPEG-2 Encoder with Integrated Analog Video/Broadcast Audio Decoder
        8234    RS8234 ATM SAR Controller [ServiceSAR Plus]
        8237    CN8237 ATM OC2 ServiceSAR+ Controller with BR Traffic Management
        8502    CX28500 676 Channel HDLC Controller
        8503    CX28500 1024 Channel HDLC Controller
        8563    CX28560 2047 Channel HDLC Controller
-       8800    2003 Conexant 23881 Video Capture (NTSC)
-       8801    CX2388x TV Capture Chip
+       8800    23888 Video Capture (NTSC)
+       8801    CX23880 PCI Broadcast Audio/Video Decoder
        8802    CX2388x TV Capture Chip
        8803    CX2388x TV Capture Chip
        8804    CX2388x TV Capture Chip
        0520    PCI SmartMedia / xD Card Reader Controller
        0530    CB-712/714/810 Memory Stick Card Reader
        0550    CB-712/714/810 Secure Digital Card Reader
-       0551    PCI SD/MMC Card Reader Controller
+       0551    10C11734 ven1524&dev_0551&SUBSYS_009F1025&REV_01
        0610    ??? PCI Smart Card Reader Controller
        0720    Memory Stick Card Reader Controller
        0730    PCI Memory Stick Card Reader Controller
        1225    CB-1225 CardBus Controller
        1410    CB-1420 CardBus Controller
        1411    CB-710/2/4/810 Cardbus Controller
-       1412    CB-712/714 CardBus Controller
+       1412    CB-712/714/810 Cardbus Controller
        1420    CB-1420 CardBus Controller
        1421    CB-720/722/724 CardBus Controller
        1422    CB-722/724 CardBus Controller
 1536   ACTIS Computer
 1537   Datalex Communications
 1538   Aralion Inc.
-       0301    Ultima RAID-100/Multi RAID-100 Controller
-       0303    UltimaRAID-133 Controller
+       0301    ARS106S Tekram DC200 PATA100 RAID Controller
+       0303    ARS0304S ARS0304S PATA133 RAID5
 1539   Atelier Informatiques et Electronique Etudes S.A.
 153A   ONO Sokki
 153B   Terratec Electronic GMBH
 1542   Vivid Technology Inc
        9260    RCIM-II Real-Time Clock & Interrupt Module
 1543   Silicon Laboratories
+       1052    30201543 Modem Intel 537EP (Chipset KAIOMY)
        3052    30201543 Modem Intel 537EP (Chipset KAIOMY)
        3155    Unknown Modem Device on High Definition Audio Bus
        4C22    Si3036 MC'97 DAA
 1555   Gesytec GmbH
        0002    PLX PCI 9050 Easylon PCI Bus Interface
 1556   PLD Applications
+       5555    001 an cpci application
 1557   Mediastar Co. Ltd
 1558   Clevo/Kapok Computer
 1559   SI Logic Ltd
        0770    n/a Standard Enhanced PCI to USB Host Controller
        0790    PCI bridge
        07A0    PCI Express Root Port
-       07B0    VMXNET3 Ethernet Controller
+       07B0    VMXNET 3 VMware vSphere 4 PCI Ethernet Adapter
        07C0    PVSCSI SCSI Controller
        0801    Virtual Machine Interface
 15AE   Amersham Pharmacia Biotech
 15B2   Mosaid Technologies Inc.
 15B3   Mellanox Technology
        0191    MT25408 [ConnectX IB SDR Flash Recovery]
+       1002    MT25400 Family [ConnectX-2 Virtual Function]
+       1003    MT27500 Family [ConnectX-3]
+       1004    MT257500 Family [ConnectX-3 Virtual Function]
        5274    MT21108 InfiniBridge
        5A44    MT23108 InfiniHost
        5A45    MT23108 Infinihost HCA Flash Recovery
        0002    PEB 20535 E v3.1 DSCC4 4 Channel Serial Communication Controller
        0003    PEB 20544 E v1.1 SPOCC Six Port Optimized Communication Controller
        0004    PEB 3454 E v1.1 TE3-SPICE Six Port Integrated Communication Controller w/- 4 DS3 Framers & 2 Fast Ethernet MACs
+       000B    SLB9635 TPM
 15D2   FIC (First International Computer Inc)
 15D3   NDS Technologies Israel Ltd
 15D4   Iwill Corporation
 1614   Jace Tech Inc.
 1615   Equus Computer Systems Inc
 1616   Iotech Inc.
+       0409    DaqBoard/2000 16-Bit, 200-kHz PCI Data Acquisition DaqBoards with DBK Signal Conditioning Support
 1617   Rapidstream Inc
 1618   Esec SA
+       0001    RDX 11
+       0400    FarSync T2P (2 port X.21/V.35/V.24)
+       0440    FarSync T4P (4 port X.21/V.35/V.24)
+       0610    FarSync T1U (1 port X.21/V.35/V.24)
+       0620    FarSync T2U (2 port X.21/V.35/V.24)
+       0640    FarSync T4U (4 port X.21/V.35/V.24)
+       1610    FarSync TE1 (T1,E1)
+       2610    FarSync DSL-S1 (SHDSL)
+       3640    FarSync T4E (4-port X.21/V.35/V.24)
+       4620    FarSync T2Ue PCI Express (2-port X.21/V.35/V.24)
+       4640    FarSync T4Ue PCI Express (4-port X.21/V.35/V.24)
 1619   FarSite Communications Limited
        0400    FarSync T2P Two Port Intelligent Sync Comms Card
        0440    FarSync T4P Four Port Intelligent Sync Comms Card
 1635   Decros
 1636   Jean Company Ltd
 1637   NSI
-       3874    Linksys 802.11b WMP11 PCI Wireless card
 1638   Eumitcom Technology Inc
        1100    WL11000P  WL11000P
 163A   Air Prime Inc
        0017    Wireless Network Adapter
        0018    Wireless Network Adapter
        0019    Wireless Network Adapter
-       001A    Atheros AR5005G http://cr.am/framed.php?url=http%3A%2F%2Fwww.tp%2Dlink.com%2Fsupport%2Fdownload.asp&ref=driverguide
+       001A    Atheros AR5005G http://support1.toshiba-tro.de/tools/updates/atheros-wlan/atheros-wlan-xp-7702331.zip
        001B    AR5006 family 802.11abg Wireless NIC
-       001C    AR5006 family 802.11abg Wireless NIC
+       001C    AR5007EG PCI\VEN_168C&DEV_001C&SUBSYS_7128144F&REV_01\4&29E2C51B&0&00E1
        001D    TP-Link TL-WN350GD PCI\VEN_168C&DEV_001D&SUBSYS_2055168C&REV_01\3&267A616A&0&50
        0020    AR5005VL 802.11bg Wireless NIC
        0023    AR5416 802.11a/b/g/n Wireless PCI Adapter
        0029    AR922X Wireless Network Adapter
        002A    0001 Atheros AR5B91 Wireless Network Adapter
        002B    AR928x Atheros AR9285 Wireless LAN 802.11 a/b/g/n Controller
-       002E    AR9287 Wireless Network Adapter
+       002C    AR2427 Wireless Network Adapter (PCI-Express)
+       002D    AR9287 Wireless Network Adapter
+       002E    AR9287 Wireless Network Adapter (PCI-Express)
+       0030    AR9300 Wireless LAN adaptor
        0033    11a/b/g/n Wireless LAN Mini-PCI Express Adapter
        0207    AR5210
        1014    AR5212 Atheros AR5212 802.11abg wireless Drivers
        14F1    nForce6100-430   PCI\VEN_14f1&DEV_10b6&SUBSYS_10b614f&REV_89
-       3B08    D-Link AirPlus G DWL-G630
        FF19    AR5006X Wireless Network Adapter
        FF1C    AR5008 Wireless Network Adapter
        FF1D    AR5008 Wireless Network Adapter
        1001    UMIO communication Card
 16EE   Canberra Industries Inc
 16EF   Amigo Technology
-16F0   TLA Inc.
+16F0   LaserLinc Inc.
 16F1   Adicti Corp.
 16F2   Bosch Rexroth AG
 16F3   Jetway Information Co., Ltd
        0050    Octeon CN57XX Network Processor (CN54XX/CN55XX/CN56XX)
        0070    Octeon CN50XX Network Processor
        0080    Octeon CN52XX Network Processor
+       0090    Octeon II CN63XX Network Processor
 177E   Jeol  USA Inc
 177F   Precision Instruments Inc
 1780   Unixtar Technology Inc
        0200    RT2500 802.11g PCI
        0201     RT2560F Ralink Chipset 802.11b/g WLAN Card
        0300    Wireless Adapter Canyon CN-WF511
-       0301    b8341462 Edimax 54 MBit WLan 802.11g rt 2500
-       0302    RT2525 2.4GHz transceiver + RT2560 MAC/BBP wireless a/b
+       0301    rt2561 RaLink rt2561 Wireless-G PCI
+       0302    RT2525 2.4GHz transceiver + RT2560 MAC/BBP wireless p/n
        0401    RT 2661 Ralink MIMO RT 2661 Wireless 54 Mbps
        0601    RT2860T b/g/n  Wlan
        0681    RT2860 Wireless 802.11n PCIe
 1848   Microcom C.E. as
 1849   ASRock Inc
 184A   Thales Computers
+       1100    MAX II cPLD
 184B   Systec Corporation
 184C   Hirose Electric Co Ltd
 184D   ICTV Inc
        0016    Fastcom FSCC-232
        0017    SuperFSCC-104-NOUART
        0018    SuperFSCC/4
-       0019    SuperFSCC-104
+       0019    SuperFSCC with soft UARTs
        001A    SuperFSCC-104-LVDS
        001B    FSCC/4
        001C    SuperFSCC/4-LVDS
 193C   MAXIM Integrated Products
 193F   Comtech AHA Corp.
        0001    AHA36x-PCIX
+       0360    AHA360-PCIe
        0363    AHA363-PCIe
        0364    AHA364-PCIe
        0367    AHA367-PCIe
        0085    MPC8347 PBGA
        0086    MPC8343E
        0087    MPC8343
+       00B4    MPC8315E
        0100    P1020E
        0101    P1020
+       0102    P1021E
+       0103    P1021
        0108    P1011E
        0109    P1011
+       010A    P1012E
+       010B    P1012
        0110    P1022E
        0111    P1022
        0118    P1013E
        1048    Atheros L1 Gigabit Ethernet 10/100/1000 Base-T Controller
        1062    AR8132 Atheros AR8132 PCI-E Fast Ethernet Controller
        1063    AR8131 Atheros AR8131 PCI-E Gigabit Ethernet Controller
-       1066    L2c Gigabit Ethernet Adapter
-       1067    L1c Gigabit Ethernet Adapter
+       1066    L2c Gigabit Ethernet
+       1067    L1c Gigabit Ethernet
        1073    AR8151 v1.0 Gigabit Ethernet
        2048    Atheros L2 Fast Ethernet 10/100 Base-T Controller
        2060    AR8152 v1.1 Fast Ethernet
        197B    JMB38X JMB38X SD/MMC Host Controller
        2360    JMicron 20360/20363 AHCI Controller
        2361    JMB363 PCI Express to SATA II and PATA Host Controller
+       2362    JMB362 AHCI Controller
        2363    JMB36X JMicron JMB362/JMB363 AHCI Controller
        2365    JMB365 AHCI/IDE
        2366    JMB36X JMicron JMB366 AHCI/IDE Controller
 19DE   Pico Computing
 19E2   Vector Informatik GmbH
 19E3   DDRdrive LLC
-       DD52      DDRdrive X1
+       5801    NA DDRdrive X1
+       5808    NA DDRdrive X8
+       DD52      DDRdrive X1-30
 19E7   NET (Network Equipment Technologies)
        1001    STIX DSP Card
        1002    STIX - 1 Port T1/E1 Card
        1004    STIX - 4 Port T1/E1 Card
        1005    STIX - 4 Port FXS Card
 19EE   Netronome Systems, Inc.
+19FF   Eclipse Electronic Systems, Inc.
 1A03   ASPEED Technology Inc
        2000    ASPEED Graphics Family
 1A07   Kvaser AB
 1AB6   CalDigit, Inc.
        6201    RAID Card
 1AB9   Espia Srl
+1AD7   Spectracom Corporation
+       8000    TSync-PCIe Time Code Processor
+       9100    TPRO-PCI-66U Timecode Reader/Generator
 1ADE   Spin Master Ltd.
        1501    Swipetech barcode scanner
 1AE0   Google, Inc.
        1003    Virtio console
 1AF5   Netezza Corp.
 1AFA   J & W Electronics Co., Ltd.
+1B03   Magnum Semiconductor, Inc,
+       6100    DXT/DXTPro Multiformat Broadcast HD/SD Encoder/Decoder/Transcoder
 1B13   Jaton Corporation USA
        0001    GeForce4 MX 440 nVidia Corporation NV17
 1B1A   K&F Computing Research Co.
        1FA8    BYNET BIC2SE/X
 1B40   Schooner Information Technology, Inc.
 1B47   Proxim(??) (Possibly Incorrect)
+1B4B   Marvell Technology Group Ltd.
+       9123    88SE9123 PCIe SATA 6.0 Gb/s controller
 1B55   NetUP Inc.
        2A2C    Dual DVB-S2-CI card
        E2E4    Dual DVB-T/C-CI RF card
        4E04    BC-04120A 4 port MPEG4 video encoder / decoder
        4E09    BC-08240A 8 port MPEG4 video encoder / decoder
        4E10    BC-16480A 16 port MPEG4 video encoder / decoder
+       5304    BC-H04120A 4 port H.264 video and audio encoder / decoder
+       5308    BC-H08240A 8 port H.264 video and audio encoder / decoder
+       5310    BC-H16480A 16 port H.264 video and audio encoder / decoder
 1C1C   DTC / Symphony / Forex Computer Corp
        0001    FR710/82C101 EIDE
 1D44   Distributed Processing Technology (DPT)
        A400    PM2x24/PM3224 SCSI Adapter
 1DE1   Tekram Technology
+       0045    RaidCore5000 Series Tekram SAS860 Embedded 8xSAS/SATAII RAID
+       0058    RC5000Series Tekram Elrond 8xSAS/SATAII RAID
        0391    TRM-S1040 DC-315U Ultra SCSI Controller
        2020    DC-390 SCSI Controller
        690C    DC-690C IDE Cache Controller
        DE01    DL200ME High resolution delay line PCI based card
        DE02    DL200ME Middle resolution delay line PCI based card
 4680   UMAX Computer Corp.
+       0804    Webcam c250 Camera
 4843   Hercules Computer Technology Inc
 4916   RedCreek Communications Inc
        1960    RedCreek PCI Adapter
 4C48   Lung Hwa Electronics
 4C53   SBS Technologies (AKA: SBS-Or Industrial Computers)
        0000    PLUSTEST Diagnostics Device
-       0001    PLUSTEST-MM device
+       0001    pustest Diagnostics Device
 4CA1   Seanix Technology Inc
 4CCC   Computer Conversions Corp
 4D51   Mediaq Inc.
 50B2   TerraTec Electronic GmbH
        1111    Terratec XLerate
 5136   S S Technologies
-5143   Qualcomm Inc.
+5143   Qualcomm Inc. USA
 5145   Ensoniq (Oldest ID)
        3031    Concert AudioPCI
 5168   Animation Technologies Inc
        0001    I-30xx Scanner Interface
 5555   Genroco Inc.
        0003    VPI General Digital Video Component Digital Video OEM computer module
+5646   Vector Fabrics BV
 5654   VoiceTronix Pty Ltd
        3132    OpenSwitch12
 5700   Netpower
        6773    CT-GPPCI General Purpose PCI Interface
 6409   Logitec Corp.
 6549   Teradici Corp.
+       1200    TERA1200 PC-over-IP Host
 6666   Decision Computer International Co.
        0001    815 PCCOM4
        0002    PCCOM8
        5500    HD5500 HDTV
 7284   HT OMEGA Inc.
 7604   O.N. Electric Co. Ltd.
+       3C03    DWL-G122 Wifi USB Same chipset of RALINK  RT2500
 7747   DaoGuo Technology Co Ltd
 7BDE   Midac Corporation
 7FED   PowerTV
        004A    Core Processor Integrated Graphics Controller
        004B    Core Processor Secondary PCI Express Root Port
        0050    Core Processor Thermal Management Controller
-       0083    WiFi Link 1000 Series
-       0084    WiFi Link 1000 Series
-       0087    WiMAX/WiFi Link 6050 Series
-       0089    WiMAX/WiFi Link 6050 Series
+       0069    Core Processor DRAM Controller
+       0082    6000 Series Gen2
+       0083    Centrino Wireless-N 1000
+       0084    Centrino Wireless-N 1000
+       0085    6000 Series Gen2
+       0087    Centrino Advanced-N + WiMAX 6250
+       0089    Centrino Advanced-N + WiMAX 6250
+       008F    6000 Series Gen3
+       0090    6000 Series Gen3
+       0100    Sandy Bridge DRAM Controller
        0101    Sandy Bridge PCI Express Root Port
        0102    Sandy Bridge Integrated Graphics Controller
        0103    Sandy Bridge Thermal Management Controller
+       0104    Sandy Bridge DRAM Controller
        0105    Sandy Bridge PCI Express Root Port
        0106    Sandy Bridge Integrated Graphics Controller
+       0108    Sandy Bridge DRAM Controller
        0109    Sandy Bridge PCI Express Root Port
        010A    Sandy Bridge Integrated Graphics Controller
        010B    Sandy Bridge Integrated Graphics Controller
+       010C    Sandy Bridge DRAM Controller
        010D    Sandy Bridge PCI Express Root Port
        010E    Sandy Bridge Integrated Graphics Controller
        0122    82437FX 430FX (Triton) System Controller
        0372    80333 Segment-B PCI Express-to-PCI Express Bridge
        0373    80333 B-Bus IOAPIC
        0374    80333 Address Translation Unit
-       0482    82375MB PCI-EISA Bridge (PCEB)
+       0482    82375MB PCI-EISA Bridge (PCEB)hp dx 7300 microwave tower
        0483    82424TX/ZX (Saturn) Cache/DRAM Controller
        0484    82378ZB/IB,82379AB PCI to ISA Bridge, System I/O
        0486    82420EX/ZX 486 PCIset System, ISA Bridge & EIDE Controller
        1002    Pro 100 LAN+Modem 56 CardBus II
        1004    82543GC Gigabit Ethernet Controller (Copper)
        1008    82544EI/GC Gigabit Ethernet Controller (Copper)
-       1009    82544EI Gigabit Ethernet Controller (Fiber)
+       1009    82845G/GL/GV/GE/PE Integrated Graphics Device Intel
        100A    82540EM Gigabit Ethernet Controller
        100C    82543EI/GC Gigabit Ethernet Controller (Copper)
        100D    82544GC Gigabit Ethernet Controller (LOM)
        10D3    82574L Intel® 82574L Gigabit Ethernet Controller
        10D5    82571PT Gigabit PT Quad Port Server ExpressModule
        10D6    82575GB Gigabit Network Connection
+       10D8    82599EB 10 Gigabit Unprogrammed
        10D9    82571EB Dual Port Gigabit Mezzanine Adapter
        10DA    82571EB Quad Port Gigabit Mezzanine Adapter
        10DB    82598EB 10-Gigabit Dual Port Network Connection
        10EB    82577LC Gigabit Network Connection
        10EC    82598EB 10-Gigabit AT CX4 Network Connection
        10ED    82559 Ethernet Controller Virtual Function
-       10EF    82578DM Gigabit Network Connection
+       10EF    Intel® 82578DM Gigabit Ethernet Controller Intel® 82578DM Gigabit Ethernet Controller
        10F0    82578DC Gigabit Network Connection
        10F1    82598EB 10-Gigabit AF Dual Port Network Connection
        10F4    82598EB 10-Gigabit AF Network Connection
        1223    SAA 7116 H Video Controller
        1225    82452KX/GX Orion Extended Express Processor to PCI Bridge
        1226    82596 EtherExpress PRO/10
-       1227    82801db ich4 LAN Controller with 82562EM/EX PHY PCI
+       1227    82801db ich4 LAN Controller with 82562ET/EZ PHY PCI
        1228    EE PRO/100 Smart Intelligent 10/100 Fast Ethernet Adapter
        1229    82550/1/7/8/9 EtherExpress PRO/100(B) Ethernet Adapter
        122D    82437FX 430FX (Triton) Cache/DRAM Controller
        123F    82466GX Integrated Hot-Plug Controller (IHPC)
        1240    Intel752 AGP Graphics Accelerator
        124B    82380FB 380FB Mobile Chipset PCI Bridge
+       124C    9776 Mobile PCI-to-PCI Bridge (MPCI2)
        1250    82430HX System Controller (TXC)
        12D8    92XX SIGMATEL STAC 92XX C-Major HD Audio
        1360    82806AA Hub Interface to PCI Bridge
        1461    P64H2 I/O Advanced Programmable Interrupt Controller
        1462    82870P2 P64H2 PCI/PCI-X Hot Plug Controller
        1501    82567V-3 Gigabit Network Connection
+       1502    82579LM Gigabit Network Connection
+       1503    82579V Gigabit Network Connection
        1507    82599EB 10 Gigabit Network Connection
        1508    82598EB Gigabit BX Network Connection
        150A    82576NS Gigabit Network Connection
        1516    82580 Gigabit Network Connection
        1517    82599ES 10 Gigabit Network Connection
        1518    82576NS SerDes Gigabit Network Connection
+       151C    82599EB 10 Gigabit TN Network Connection
+       1525    82567V-4 Gigabit Network Connection
+       1526    82576 Gigabit Network Connection
        1960    80960RP i960RP Microprocessor
        1962    Windows 2003 Server Promise SuperTrak SX6000 (tm) IDE RAID Controller
        1A10    Celeron(tm) Processor to I/O Controller
        1C3D    Cougar Point KT Controller
        1C42    Cougar Point LPC Controller
        1C43    Cougar Point LPC Controller
+       1C44    Cougar Point LPC Controller
+       1C45    Cougar Point LPC Controller
+       1C46    Cougar Point LPC Controller
+       1C47    Cougar Point LPC Controller
+       1C48    Cougar Point LPC Controller
+       1C49    Cougar Point LPC Controller
+       1C4A    Cougar Point LPC Controller
+       1C4B    Cougar Point LPC Controller
+       1C4C    Cougar Point LPC Controller
+       1C4D    Cougar Point LPC Controller
+       1C4E    Cougar Point LPC Controller
+       1C4F    Cougar Point LPC Controller
+       1C50    Cougar Point LPC Controller
+       1C51    Cougar Point LPC Controller
+       1C52    Cougar Point LPC Controller
+       1C53    Cougar Point LPC Controller
+       1C54    Cougar Point LPC Controller
+       1C55    Cougar Point LPC Controller
+       1C56    Cougar Point LPC Controller
+       1C57    Cougar Point LPC Controller
+       1C58    Cougar Point LPC Controller
+       1C59    Cougar Point LPC Controller
+       1C5A    Cougar Point LPC Controller
+       1C5B    Cougar Point LPC Controller
+       1C5C    Cougar Point LPC Controller
+       1C5D    Cougar Point LPC Controller
+       1C5F    Cougar Point LPC Controller
        2125    82801AA AC97 Audio Controller. website to download - http://www.intel.com/design/chipsets/manuals/29802801.p
        2406    82801 / ? AC97 Modem Controller / PCI Modem
        2410    82801AA 8xx Chipset LPC Interface Bridge
        24C2    82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1
        24C3    82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller
        24C4    82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2
-       24C5    82801DBM SoundMAXController (ICH4-M B0 step) Realtek AC97 Audio
+       24C5    82801DBM SoundMAXController (ICH4-M B0 step) VIA Vynil v700b
        24C6    82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller
        24C7    82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3
        24CA    82801DBM (ICH4-M) UltraATA/100 EIDE Controller
        24D2    82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1
        24D3    82801EB/ER (ICH5/ICH5R) SMBus Controller
        24D4    82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2
-       24D5    8086 ADI® SoundMAX® Audio Device Driver, Version 5.12.1.3622 for the Microsoft® Windows® XP Operating Sys
+       24D5    82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
        24D6    82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller
        24D7    82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3
        24DB    82801EB/ER (ICH5/ICH5R) EIDE Controller
        250B    82820 820 (Camino) Chipset CPU Host Bridge (MCH) (RDRAM Only)
        250F    82820 820 (Camino) Chipset PCI to AGP Bridge
        2520    82805AA Memory Translator Hub (MTH)
-       2521    82804AA Memory Repeater Hub for SDRAM (MRH-S)
+       2521    82804AA Audio Device on High Definition Audio Bus
        2530    82850/E Host-Hub Interface Bridge(A2 step)
        2531    82860 (860) CPU to I/O Hub Bridge (Interface A)
        2532    82850/850E/860 AGP Bridge
        2591    82915PM/GM PCIe Graphics Port
        2592    82915GM/GMS, 82910GML Integrated Graphics Device
        25A1    6300ESB LPC Inteface Controller
-       25A2    6300ESB IDE Controller
-       25A3    6300ESB Serial ATA Controller
+       25A2    6300ESB PATA100 IDE Controller
+       25A3    6300ESB SATA Controller(IDE Mode)
        25A4    6300ESB SMBus Controller
        25A6    6300ESB AC'97 Audio Controller
        25A7    6300ESB AC'97 Modem Controller
        2662    82801FB/FR/FW/FRW PCI Express Port 2
        2664    82801FB (ICH6) PCIe Root Port 3
        2666    82801FB/FR/FW/FRW PCI Express Port 4
-       2668    11583659 82801FB (ICH6) High Definition Audio Controller
+       2668    11511583659 82801FB (ICH6) High Definition Audio Controller
        2669    2028026 jkn
        266A    82801FB (ICH6) SMBus Controller
        266C    82801FB/FR/FW/FRW LAN Controller
-       266D    czc82809kr hp/Compal - http://service.marasst.com/Compal/DL75/HDL75%20driver%20Ver%2002/Modem.zip
+       266D    czc82809kr http://service.marasst.com/Compal/DL75/HDL75%20driver%20Ver%2002/Modem.zip
        266E    VIA Technologies Vinyl AC'97 Codec Combo Driver (W VIA AC97 codec incorporated into VT82C686A/B, VT8231, VT8233/A/C, VT8235, VT8237/R, VT8251 Southbrid
        266F    82801FB/FBM/FW/FR/FRW PATA100 Controller - 266F
        2670    631xESB/6321ESB/3100  LPC Interface Controller
        2772    82945G Integrated Graphics Controller
        2774    82955X Memory Controller Hub
        2775    82955X PCIe Root Port
-       2776    82945G Integrated Graphics Controller
+       2776    82945G INTEL(R) 82945G EXPRESS FAMILY
        2778    E7230/3000/3010 Processor to I/O Controller
        2779    E7230/3000/3010 PCIe Root Port
        277A    82975X PCIe Root Port
        27AE    Mobile 945 Express Chipset Family
        27B0    82801GH (ICH7DH) LPC Interface Controller
        27B1    82801GBM (ICH7) LPC Interface Controller
-       27B8    945GL Intel 82801GB/GR (ICH7 Family) LPC Interface Controller - 27B8
+       27B8    945GL Intel 82801GB/GR (ICH7 Family) LPC Interface Controller - 27B9
        27B9    82801GBM (ICH7-M) LPC Interface Controller
        27BC    NM10 Family LPC Controller
        27BD    82801GHM (ICH7-M DH) LPC Interface Controller
        2825    82801H (ICH8 Family) 2 port SATA Controller
        2828    82801 (ICH8M) 3 port SATA Controller
        2829    Mobile SATA AHCI Controller
-       282A    Mobile SATA RAID Controller
+       282A    ICH8M/9M/ICH10M/i5M Raid Controller
        2830    82801H (ICH8 Family) USB UHCI #1
        2831    82801H (ICH8 Family) USB UHCI #2
        2832    82801H (ICH8 Family) USB UHCI #3
        292C    82801IB/IR/IH (ICH9 Family) Mobile SATA RAID Controller
        292D    82801IB/IR/IH (ICH9 Family) Mobile 2 port Serial ATA Storage Controller 2
        292E    82801IB/IR/IH (ICH9 Family) Mobile 1 port Serial ATA Storage Controller 2
-       2930    8086 Intel(R) ICH9 Family SMBus Controller working fine with http://download.cnet.com/Chipset-Driver-Inte
+       2930    Intel ICH9 Family SMBus Controller Intel ICH9 Family SMBus Controller
        2932    82801IB/IR/IH (ICH9 Family) Thermal Subsystem
        2934    82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
        2935    82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
        2994    0x8086 intel management engine interface
        2995    Q963/Q965 HECI Controller
        2996    Q963/Q965 PT IDER Controller
-       2997    Q965/Q963 Intel PCI Serial Port
+       2997    Q965/Q963 Intel PCI Serial Port - Serial over Lan
        29A0    ?(82P965) Intel P965/G965 Processor to I/O Controller
        29A1    ?(82Q965, 82G965, 82P965) Intel P965/G965 PCI Express Root Port
        29A2    G965 Integrated Graphics Controller
        29C1    P35/G33 (Bearlake) PCIe Root Port
        29C2    P35/G33 (Bearlake) Integrated Graphics Controller
        29C3    P35/G33 (Bearlake) Integrated Graphics Controller
-       29C4    Intel DG33fb Intel ME: Management Engine Interface
+       29C4    Intel DG33BU Intel ME: Management Engine Interface
        29C5    P35/G33 (Bearlake) HECI Controller
        29C6    P35/G33 (Bearlake) PT IDER Controller
        29C7    P35/G33 (Bearlake) Serial KT Controller
        2A43    Mobile Intel 4 Series Chipset Family Intel Mobile Graphic
        2A44    Mobile 4 Series Chipset Intel Management Engine Interface
        2A45    Mobile 4 Series Chipset MEI Controller
-       2A46    Mobile 4 Series Chipset PT IDER Controller
+       2A46    M4x IDE Controller
        2A47    20EC17AA Active Management Technology - SOL
        2A50    Mobile MEI Controller
        2A51    Mobile MEI Controller
        2A52    Mobile PT IDER Controller
        2A53    Mobile AMT SOL Redirection
-       2B00    Nehalem-EX System Configuration Controller 1
-       2B02    Nehalem-EX System Configuration Controller 2
-       2B04    Nehalem-EX Power Controller
-       2B08    Nehalem-EX Caching Agent 0
-       2B0C    Nehalem-EX Caching Agent 1
-       2B10    Nehalem-EX QPI Home Agent 0
-       2B13    Nehalem-EX Memory Controller 0c
-       2B14    Nehalem-EX Memory Controller 0a
-       2B16    Nehalem-EX Memory Controller 0b
-       2B18    Nehalem-EX QPI Home Agent 1
-       2B1B    Nehalem-EX Memory Controller 1c
-       2B1C    Nehalem-EX Memory Controller 1a
-       2B1E    Nehalem-EX Memory Controller 1b
-       2B20    Nehalem-EX Last Level Cache Coherence Engine 0
-       2B22    Nehalem-EX System Configuration Controller 3
-       2B24    Nehalem-EX Last Level Cache Coherence Engine 1
-       2B28    Nehalem-EX Last Level Cache Coherence Engine 2
-       2B2A    Nehalem-EX System Configuration Controller 4
-       2B2C    Nehalem-EX Last Level Cache Coherence Engine 3
-       2B30    Nehalem-EX Last Level Cache Coherence Engine 4
-       2B34    Nehalem-EX Last Level Cache Coherence Engine 5
-       2B38    Nehalem-EX Last Level Cache Coherence Engine 6
-       2B3C    Nehalem-EX Last Level Cache Coherence Engine 7
-       2B40    Nehalem-EX QPI Router Port 0-1
-       2B42    Nehalem-EX QPI Router Port 2-3
-       2B44    Nehalem-EX QPI Router Port 4-5
-       2B46    Nehalem-EX QPI Router Port 6-7
-       2B48    Nehalem-EX Test and Debug 0
-       2B4C    Nehalem-EX Test and Debug 1
-       2B50    Nehalem-EX QPI Physical Port 0: REUT control/status
-       2B52    Nehalem-EX QPI Physical Port 0: Misc. control/status
-       2B54    Nehalem-EX QPI Physical Port 1: REUT control/status
-       2B56    Nehalem-EX QPI Physical Port 1: Misc. control/status
-       2B58    Nehalem-EX QPI Physical Port 2: REUT control/status
-       2B5A    Nehalem-EX QPI Physical Port 2: Misc. control/status
-       2B5C    Nehalem-EX QPI Physical Port 3: REUT control/status
-       2B5E    Nehalem-EX QPI Physical Port 3: Misc. control/status
-       2B60    Nehalem-EX SMI Physical Port 0: REUT control/status
-       2B62    Nehalem-EX SMI Physical Port 0: Misc control/status
-       2B64    Nehalem-EX SMI Physical Port 0: REUT control/status
-       2B66    Nehalem-EX SMI Physical Port 1: Misc control/status
-       2B68    Nehalem-EX System Configuration Controller 3
-       2B6A    Nehalem-EX System Configuration Controller 4
+       2B00    Xeon 7500 System Configuration Controller 1
+       2B02    Xeon 7500 System Configuration Controller 2
+       2B04    Xeon 7500 Power Controller
+       2B08    Xeon 7500 Caching Agent 0
+       2B0C    Xeon 7500 Caching Agent 1
+       2B10    Xeon 7500 QPI Home Agent 0
+       2B13    Xeon 7500 Memory Controller 0c
+       2B14    Xeon 7500 Memory Controller 0a
+       2B16    Xeon 7500 Memory Controller 0b
+       2B18    Xeon 7500 QPI Home Agent 1
+       2B1B    Xeon 7500 Memory Controller 1c
+       2B1C    Xeon 7500 Memory Controller 1a
+       2B1E    Xeon 7500 Memory Controller 1b
+       2B20    Xeon 7500 Last Level Cache Coherence Engine 0
+       2B22    Xeon 7500 System Configuration Controller 3
+       2B24    Xeon 7500 Last Level Cache Coherence Engine 1
+       2B28    Xeon 7500 Last Level Cache Coherence Engine 2
+       2B2A    Xeon 7500 System Configuration Controller 4
+       2B2C    Xeon 7500 Last Level Cache Coherence Engine 3
+       2B30    Xeon 7500 Last Level Cache Coherence Engine 4
+       2B34    Xeon 7500 Last Level Cache Coherence Engine 5
+       2B38    Xeon 7500 Last Level Cache Coherence Engine 6
+       2B3C    Xeon 7500 Last Level Cache Coherence Engine 7
+       2B40    Xeon 7500 QPI Router Port 0-1
+       2B42    Xeon 7500 QPI Router Port 2-3
+       2B44    Xeon 7500 QPI Router Port 4-5
+       2B46    Xeon 7500 QPI Router Port 6-7
+       2B48    Xeon 7500 Test and Debug 0
+       2B4C    Xeon 7500 Test and Debug 1
+       2B50    Xeon 7500 QPI Physical Port 0: REUT control/status
+       2B52    Xeon 7500 QPI Physical Port 0: Misc. control/status
+       2B54    Xeon 7500 QPI Physical Port 1: REUT control/status
+       2B56    Xeon 7500 QPI Physical Port 1: Misc. control/status
+       2B58    Xeon 7500 QPI Physical Port 2: REUT control/status
+       2B5A    Xeon 7500 QPI Physical Port 2: Misc. control/status
+       2B5C    Xeon 7500 QPI Physical Port 3: REUT control/status
+       2B5E    Xeon 7500 QPI Physical Port 3: Misc. control/status
+       2B60    Xeon 7500 SMI Physical Port 0: REUT control/status
+       2B62    Xeon 7500 SMI Physical Port 0: Misc control/status
+       2B64    Xeon 7500 SMI Physical Port 0: REUT control/status
+       2B66    Xeon 7500 SMI Physical Port 1: Misc control/status
        2C01    QuickPath Architecture System Address Decoder
        2C10    QuickPath Interconnect Link 0
        2C11    QuickPath Interconnect Physical 0
        2C55    Core Processor QuickPath Architecture Generic Non-Core Registers
        2C56    Core Processor QuickPath Architecture Generic Non-Core Registers
        2C57    Core Processor QuickPath Architecture Generic Non-Core Registers
-       2C58    Jasper Forest QPI Generic Non-core Registers
-       2C59    Jasper Forest QPI Generic Non-core Registers
-       2C5A    Jasper Forest QPI Generic Non-core Registers
-       2C5B    Jasper Forest QPI Generic Non-core Registers
-       2C5C    Jasper Forest QPI Generic Non-core Registers
-       2C5D    Jasper Forest QPI Generic Non-core Registers
-       2C5E    Jasper Forest QPI Generic Non-core Registers
-       2C5F    Jasper Forest QPI Generic Non-core Registers
+       2C58    Xeon C5500/C3500 QPI Generic Non-core Registers
+       2C59    Xeon C5500/C3500 QPI Generic Non-core Registers
+       2C5A    Xeon C5500/C3500 QPI Generic Non-core Registers
+       2C5B    Xeon C5500/C3500 QPI Generic Non-core Registers
+       2C5C    Xeon C5500/C3500 QPI Generic Non-core Registers
+       2C5D    Xeon C5500/C3500 QPI Generic Non-core Registers
+       2C5E    Xeon C5500/C3500 QPI Generic Non-core Registers
+       2C5F    Xeon C5500/C3500 QPI Generic Non-core Registers
        2C61    Core Processor QuickPath Architecture Generic Non-core Registers
        2C62    Core Processor QuickPath Architecture Generic Non-core Registers
-       2C70    QuickPath Architecture Generic Non-core Registers
+       2C70    Xeon 5600 Series QuickPath Architecture Generic Non-core Registers
        2C81    Core Processor QuickPath Architecture System Address Decoder
        2C90    Core Processor QPI Link 0
        2C91    Core Processor QPI Physical 0
        2C98    Core Processor Integrated Memory Controller
        2C99    Core Processor Integrated Memory Controller Target Address Decoder
+       2C9A    Core Processor Integrated Memory Controller Test Registers
        2C9C    Core Processor Integrated Memory Controller Test Registers
        2CA0    Core Processor Integrated Memory Controller Channel 0 Control Registers
        2CA1    Core Processor Integrated Memory Controller Channel 0 Address Registers
        2CA9    Core Processor Integrated Memory Controller Channel 1 Address Registers
        2CAA    Core Processor Integrated Memory Controller Channel 1 Rank Registers
        2CAB    Core Processor Integrated Memory Controller Channel 1 Thermal Control Registers
-       2CC1    Jasper Forest QPI System Address Decoder
-       2CD0    Jasper Forest QPI Link 0
-       2CD1    Jasper Forest QPI Physical 0
-       2CD4    Jasper Forest QPI Link 1
-       2CD5    Jasper Forest QPI Physical 1
-       2CD8    Jasper Forest Integrated Memory Controller Registers
-       2CD9    Jasper Forest Integrated Memory Controller Target Address Decoder
-       2CDA    Jasper Forest Integrated Memory Controller RAS Registers
-       2CDC    Jasper Forest Integrated Memory Controller Test Registers
-       2CE0    Jasper Forest Integrated Memory Controller Channel 0 Control
-       2CE1    Jasper Forest Integrated Memory Controller Channel 0 Address
-       2CE2    Jasper Forest Integrated Memory Controller Channel 0 Rank
-       2CE3    Jasper Forest Integrated Memory Controller Channel 0 Thermal Control
-       2CE8    Jasper Forest Integrated Memory Controller Channel 1 Control
-       2CE9    Jasper Forest Integrated Memory Controller Channel 1 Address
-       2CEA    Jasper Forest Integrated Memory Controller Channel 1 Rank
-       2CEB    Jasper Forest Integrated Memory Controller Channel 1 Thermal Control
-       2CF0    Jasper Forest Integrated Memory Controller Channel 2 Control
-       2CF1    Jasper Forest Integrated Memory Controller Channel 2 Address
-       2CF2    Jasper Forest Integrated Memory Controller Channel 2 Rank
-       2CF3    Jasper Forest Integrated Memory Controller Channel 2 Thermal Control
+       2CC1    Xeon C5500/C3500 QPI System Address Decoder
+       2CD0    Xeon C5500/C3500 QPI Link 0
+       2CD1    Xeon C5500/C3500 QPI Physical 0
+       2CD4    Xeon C5500/C3500 QPI Link 1
+       2CD5    Xeon C5500/C3500 QPI Physical 1
+       2CD8    Xeon C5500/C3500 Integrated Memory Controller Registers
+       2CD9    Xeon C5500/C3500 Integrated Memory Controller Target Address Decoder
+       2CDA    Xeon C5500/C3500 Integrated Memory Controller RAS Registers
+       2CDC    Xeon C5500/C3500 Integrated Memory Controller Test Registers
+       2CE0    Xeon C5500/C3500 Integrated Memory Controller Channel 0 Control
+       2CE1    Xeon C5500/C3500 Integrated Memory Controller Channel 0 Address
+       2CE2    Xeon C5500/C3500 Integrated Memory Controller Channel 0 Rank
+       2CE3    Xeon C5500/C3500 Integrated Memory Controller Channel 0 Thermal Control
+       2CE8    Xeon C5500/C3500 Integrated Memory Controller Channel 1 Control
+       2CE9    Xeon C5500/C3500 Integrated Memory Controller Channel 1 Address
+       2CEA    Xeon C5500/C3500 Integrated Memory Controller Channel 1 Rank
+       2CEB    Xeon C5500/C3500 Integrated Memory Controller Channel 1 Thermal Control
+       2CF0    Xeon C5500/C3500 Integrated Memory Controller Channel 2 Control
+       2CF1    Xeon C5500/C3500 Integrated Memory Controller Channel 2 Address
+       2CF2    Xeon C5500/C3500 Integrated Memory Controller Channel 2 Rank
+       2CF3    Xeon C5500/C3500 Integrated Memory Controller Channel 2 Thermal Control
        2D01    Core Processor QuickPath Architecture System Address Decoder
        2D10    Core Processor QPI Link 0
        2D11    Core Processor QPI Physical 0
        2D12    Core Processor Reserved
        2D13    Core Processor Reserved
-       2D81    QuickPath Architecture System Address Decoder
-       2D90    QPI Link 0
-       2D91    QPI Physical 0
-       2D92    Mirror Port Link 0
-       2D93    Mirror Port Link 1
-       2D94    QPI Link 1
-       2D95    QPI Physical 1
-       2D98    Integrated Memory Controller Registers
-       2D99    Integrated Memory Controller Target Address Decoder
-       2D9A    Integrated Memory Controller RAS Registers
-       2D9C    Integrated Memory Controller Test Registers
-       2DA0    Integrated Memory Controller Channel 0 Control
-       2DA1    Integrated Memory Controller Channel 0 Address
-       2DA2    Integrated Memory Controller Channel 0 Rank
-       2DA3    Integrated Memory Controller Channel 0 Thermal Control
-       2DA8    Integrated Memory Controller Channel 1 Control
-       2DA9    Integrated Memory Controller Channel 1 Address
-       2DAA    Integrated Memory Controller Channel 1 Rank
-       2DAB    Integrated Memory Controller Channel 1 Thermal Control
-       2DB0    Integrated Memory Controller Channel 2 Control
-       2DB1    Integrated Memory Controller Channel 2 Address
-       2DB2    Integrated Memory Controller Channel 2 Rank
-       2DB3    Integrated Memory Controller Channel 2 Thermal Control
+       2D81    Xeon 5600 Series QuickPath Architecture System Address Decoder
+       2D90    Xeon 5600 Series QPI Link 0
+       2D91    Xeon 5600 Series QPI Physical 0
+       2D92    Xeon 5600 Series Mirror Port Link 0
+       2D93    Xeon 5600 Series Mirror Port Link 1
+       2D94    Xeon 5600 Series QPI Link 1
+       2D95    Xeon 5600 Series QPI Physical 1
+       2D98    Xeon 5600 Series Integrated Memory Controller Registers
+       2D99    Xeon 5600 Series Integrated Memory Controller Target Address Decoder
+       2D9A    Xeon 5600 Series Integrated Memory Controller RAS Registers
+       2D9C    Xeon 5600 Series Integrated Memory Controller Test Registers
+       2DA0    Xeon 5600 Series Integrated Memory Controller Channel 0 Control
+       2DA1    Xeon 5600 Series Integrated Memory Controller Channel 0 Address
+       2DA2    Xeon 5600 Series Integrated Memory Controller Channel 0 Rank
+       2DA3    Xeon 5600 Series Integrated Memory Controller Channel 0 Thermal Control
+       2DA8    Xeon 5600 Series Integrated Memory Controller Channel 1 Control
+       2DA9    Xeon 5600 Series Integrated Memory Controller Channel 1 Address
+       2DAA    Xeon 5600 Series Integrated Memory Controller Channel 1 Rank
+       2DAB    Xeon 5600 Series Integrated Memory Controller Channel 1 Thermal Control
+       2DB0    Xeon 5600 Series Integrated Memory Controller Channel 2 Control
+       2DB1    Xeon 5600 Series Integrated Memory Controller Channel 2 Address
+       2DB2    Xeon 5600 Series Integrated Memory Controller Channel 2 Rank
+       2DB3    Xeon 5600 Series Integrated Memory Controller Channel 2 Thermal Control
        2E00    DRAM Controller
        2E01    PCI Express Root Port
        2E02    Integrated Graphics Controller
        2E13    4 Series Chipset Integrated Graphics Controller
        2E14    PCI\VEN_8086&DEV_2E14&SUBSYS_3035103C&REV_03\B1B68 Intel Active Client Manager HECI Device
        2E15    4 Series Chipset HECI Controller
-       2E16    4 Series Chipset PT IDER Controller
+       2E16    4x IDE Controller
        2E17    CC_0700 Intel PCI Serial Port
        2E20    4 Series Chipset DRAM Controller
        2E21    4 Series Chipset PCI Express Root Port
        2E22    4 Series Chipset Integrated Graphics Controller
        2E23    4 Series Chipset Integrated Graphics Controller
-       2E24    PCI\VEN_8086&DEV_2E24&SUBSYS_028A1028&REV_03 Intel Management Engine Interface
+       2E24    PCI\VEN_8086&DEV_2E24&SUBSYS_00238086&REV_03 Intel Management Engine Interface
        2E25    4 Series Chipset HECI Controller
-       2E26    4 Series Chipset PT IDER Controller
+       2E26    4x IDE Controller
        2E27    4 Series Chipset Serial KT Controller
        2E29    4 Series Chipset PCI Express Root Port
        2E30    4 Series Chipset DRAM Controller
        2E43    4 Series Chipset Integrated Graphics Controller
        2E44    4 Series Chipset HECI Controller
        2E45    4 Series Chipset HECI Controller
-       2E46    4 Series Chipset PT IDER Controller
+       2E46    4x IDE Controller
        2E47    4 Series Chipset Serial KT Controller
        2E90    4 Series Chipset DRAM Controller
        2E91    4 Series Chipset PCI Express Root Port
        2E93    4 Series Chipset Integrated Graphics Controller
        2E94    4 Series Chipset HECI Controller
        2E95    4 Series Chipset HECI Controller
-       2E96    4 Series Chipset PT IDER Controller
+       2E96    4x IDE Controller
        2F00    815B104D multimedia audio device (codec AC97) SoundMAX or VIA
        3092    SRCU32 I2O 1.5 RAID Controller
        3200    31244 PCI-X to Serial ATA Controller
        360E    7300 Chipset (Caneland) Debug and Miscellaneous Registers
        360F    7300 Chipset (Caneland) FBD Branch 0 Registers
        3610    7300 Chipset (Caneland) FBD Branch 1 Registers
-       3700    Jasper Forest DMI
-       3701    Jasper Forest DMI
-       3702    Jasper Forest DMI
-       3703    Jasper Forest DMI
-       3704    Jasper Forest DMI
-       3705    Jasper Forest DMI
-       3706    Jasper Forest DMI
-       3707    Jasper Forest DMI
-       3708    Jasper Forest DMI
-       3709    Jasper Forest DMI
-       370A    Jasper Forest DMI
-       370B    Jasper Forest DMI
-       370C    Jasper Forest DMI
-       370D    Jasper Forest DMI
-       370E    Jasper Forest DMI
-       370F    Jasper Forest DMI
-       3710    Jasper Forest CB3 DMA
-       3711    Jasper Forest CB3 DMA
-       3712    Jasper Forest CB3 DMA
-       3713    Jasper Forest CB3 DMA
-       3714    Jasper Forest CB3 DMA
-       3715    Jasper Forest CB3 DMA
-       3716    Jasper Forest CB3 DMA
-       3717    Jasper Forest CB3 DMA
-       3718    Jasper Forest CB3 DMA
-       3719    Jasper Forest CB3 DMA
-       371A    Jasper Forest QPI Link
-       371B    Jasper Forest QPI Routing and Protocol
-       371D    Jasper Forest QPI Routing and Protocol
-       3720    Jasper Forest PCI Express Root Port 0
-       3721    Jasper Forest PCI Express Root Port 1
-       3722    Jasper Forest PCI Express Root Port 2
-       3723    Jasper Forest PCI Express Root Port 3
-       3724    Jasper Forest PCI Express Root Port 4
-       3725    Jasper Forest NTB Primary
-       3726    Jasper Forest NTB Primary
-       3727    Jasper Forest NTB Secondary
-       3728    Jasper Forest Core
-       3729    Jasper Forest Core
-       372A    Jasper Forest Core
-       372B    Jasper Forest Core
-       372C    Jasper Forest Reserved
-       373F    Jasper Forest IOxAPIC
+       3700    Xeon C5500/C3500 DMI
+       3701    Xeon C5500/C3500 DMI
+       3702    Xeon C5500/C3500 DMI
+       3703    Xeon C5500/C3500 DMI
+       3704    Xeon C5500/C3500 DMI
+       3705    Xeon C5500/C3500 DMI
+       3706    Xeon C5500/C3500 DMI
+       3707    Xeon C5500/C3500 DMI
+       3708    Xeon C5500/C3500 DMI
+       3709    Xeon C5500/C3500 DMI
+       370A    Xeon C5500/C3500 DMI
+       370B    Xeon C5500/C3500 DMI
+       370C    Xeon C5500/C3500 DMI
+       370D    Xeon C5500/C3500 DMI
+       370E    Xeon C5500/C3500 DMI
+       370F    Xeon C5500/C3500 DMI
+       3710    Xeon C5500/C3500 CB3 DMA
+       3711    Xeon C5500/C3500 CB3 DMA
+       3712    Xeon C5500/C3500 CB3 DMA
+       3713    Xeon C5500/C3500 CB3 DMA
+       3714    Xeon C5500/C3500 CB3 DMA
+       3715    Xeon C5500/C3500 CB3 DMA
+       3716    Xeon C5500/C3500 CB3 DMA
+       3717    Xeon C5500/C3500 CB3 DMA
+       3718    Xeon C5500/C3500 CB3 DMA
+       3719    Xeon C5500/C3500 CB3 DMA
+       371A    Xeon C5500/C3500 QPI Link
+       371B    Xeon C5500/C3500 QPI Routing and Protocol
+       371D    Xeon C5500/C3500 QPI Routing and Protocol
+       3720    Xeon C5500/C3500 PCI Express Root Port 0
+       3721    Xeon C5500/C3500 PCI Express Root Port 1
+       3722    Xeon C5500/C3500 PCI Express Root Port 2
+       3723    Xeon C5500/C3500 PCI Express Root Port 3
+       3724    Xeon C5500/C3500 PCI Express Root Port 4
+       3725    Xeon C5500/C3500 NTB Primary
+       3726    Xeon C5500/C3500 NTB Primary
+       3727    Xeon C5500/C3500 NTB Secondary
+       3728    Xeon C5500/C3500 Core
+       3729    Xeon C5500/C3500 Core
+       372A    Xeon C5500/C3500 Core
+       372B    Xeon C5500/C3500 Core
+       372C    Xeon C5500/C3500 Reserved
+       373F    Xeon C5500/C3500 IOxAPIC
        3A00    ICH10 Family ICH10 4 port SATA IDE Controller
        3A01    2 port SATA IDE Controller
        3A02    82801JD ICH10D SATA Controller
        3A78    PCI Express Port 5
        3A7A    PCI Express Port 6
        3A7C    Gigabit Ethernet Controller
-       3B00    5 Series/3400 Series Chipset LPC Interface Controller
-       3B01    Mobile 5 Series Chipset LPC Interface Controller
-       3B02    5 Series Chipset LPC Interface Controller
-       3B03    Mobile 5 Series Chipset LPC Interface Controller
+       3B00    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
+       3B01    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
+       3B02    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
+       3B03    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
        3B04    5 Series Chipset LPC Interface Controller
        3B05    Mobile 5 Series Chipset LPC Interface Controller
-       3B06    5 Series Chipset LPC Interface Controller
-       3B07    Mobile 5 Series Chipset LPC Interface Controller
-       3B08    5 Series Chipset LPC Interface Controller
-       3B09    Mobile 5 Series Chipset LPC Interface Controller
-       3B0A    5 Series Chipset LPC Interface Controller
-       3B0B    Mobile 5 Series Chipset LPC Interface Controller
+       3B06    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
+       3B07    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
+       3B08    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
+       3B09    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
+       3B0A    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
+       3B0B    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
        3B0C    5 Series Chipset LPC Interface Controller
-       3B0D    5 Series/3400 Series Chipset LPC Interface Controller
+       3B0D    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
        3B0E    5 Series/3400 Series Chipset LPC Interface Controller
-       3B0F    5 Series/3400 Series Chipset LPC Interface Controller
+       3B0F    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
        3B10    5 Series/3400 Series Chipset LPC Interface Controller
        3B11    5 Series/3400 Series Chipset LPC Interface Controller
-       3B12    3400 Series Chipset LPC Interface Controller
+       3B12    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
        3B13    5 Series/3400 Series Chipset LPC Interface Controller
-       3B14    3400 Series Chipset LPC Interface Controller
+       3B14    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
        3B15    5 Series/3400 Series Chipset LPC Interface Controller
-       3B16    3400 Series Chipset LPC Interface Controller
+       3B16    Intel(R) 5 Series/3400 Series Chipset Family LPC Interface Controller
        3B17    5 Series/3400 Series Chipset LPC Interface Controller
        3B18    5 Series/3400 Series Chipset LPC Interface Controller
        3B19    5 Series/3400 Series Chipset LPC Interface Controller
        3B1D    5 Series/3400 Series Chipset LPC Interface Controller
        3B1E    5 Series/3400 Series Chipset LPC Interface Controller
        3B1F    5 Series/3400 Series Chipset LPC Interface Controller
-       3B20    ? IBEX SATA Controller
-       3B21    ? IBEX SATA Controller
-       3B22    Intel® Q57 Express IBEX AHCI Controller(6Port)
-       3B23    ? IBEX AHCI Controller(4Port)
-       3B25    5 Series/3400 Series Chipset SATA RAID Controller
-       3B26    ? IBEX SATA Controller
-       3B28    ? IBEX SATA Controller
-       3B29    ? IBEX AHCI Controller(4Port)
-       3B2C    5 Series/3400 Series Chipset SATA RAID Controller
-       3B2D    5 Series/3400 Series Chipset 2 port SATA IDE Controller
-       3B2E    ? IBEX SATA Controller
-       3B2F    ? IBEX AHCI Controller(6Port)
-       3B30    5 Series/3400 Series Chipset SMBus Controller
-       3B32    5 Series/3400 Series Chipset Thermal Subsystem
+       3B20    PCH (Ibex Peak) SATA IDE 4-Port Desktop
+       3B21    PCH (Ibex Peak) SATA IDE 2-Port Desktop
+       3B22    PCH (Ibex Peak) SATA AHCI 6-Port Desktop
+       3B23    PCH (Ibex Peak) SATA AHCI 4-Port Desktop
+       3B24    PCH SATA Enhanced RAID
+       3B25    PCH SATA Raid Controller
+       3B26    PCH (Ibex Peak) SATA IDE 2-Port Secondary Desktop
+       3B28    PCH (Ibex Peak) SATA IDE 4-Port Mobile
+       3B29    PCH (Ibex Peak) SATA AHCI 4-Port Mobile
+       3B2B    PCHM SATA Enhanced RAID
+       3B2C    PCHM SATA Raid Controller
+       3B2D    PCHM SATA IDE Controller:2 port
+       3B2E    PCH (Ibex Peak) SATA IDE 4-Port Mobile
+       3B2F    PCH (Ibex Peak) SATA AHCI 6-Port Mobile
+       3B30    Intel(R) 5 Series/3400 Series Chipset Family SMBus Controller
+       3B32    Intel(R) Turbo Boost Technology Driver LPC Interface Controller
        3B34    5 Series/3400 Series Chipset USB2 Enhanced Host Controller
        3B36    5 Series/3400 Series Chipset USB Universal Host Controller
        3B37    5 Series/3400 Series Chipset USB Universal Host Controller
        3B50    5 Series/3400 Series Chipset PCI Express Root Port 8
        3B53    5 Series/3400 Series Chipset VECI Controller
        3B56    5 Series/3400 Series Chipset High Definition Audio
-       3B64    5 Series/3400 Series Chipset HECI Controller
+       3B64    0780 Intel Management Engine Interface (MEI) Driver
        3B65    5 Series/3400 Series Chipset HECI Controller
        3B66    5 Series/3400 Series Chipset PT IDER Controller
        3B67    5 Series/3400 Series Chipset KT Controller
        4227    PRO/Wireless 3945ABG Network Connection
        4228    PRO/Wireless 3965ABG Network Connection
        4229    Intel 4965AGN Intel® Wireless WiFi Link 4965AGN(supporting 802.11a/b/g/Draft-N)
-       422B    WiFi Link 6000 Series
-       422C    WiFi Link 6000 Series
+       422B    Centrino Ultimate-N 6300
+       422C    Centrino Advanced-N 6200
        422D    Intel 4965AGN Intel® Wireless WiFi Link 4965AGN
        4230    Intel 4965AGN Intel® Wireless WiFi Link 4965AGN
        4232    Intel® WiFi Link 5100 Carte Intel® WiFi Link 5100 AGN
-       4233    Intel 4965AGN Intel® Wireless WiFi Link 4965AGN
+       4233    Intel 4965AGN Intel® Wireless WiFi Link 4965AGN
        4235    5300AGN Intel® WiFi Link 5300 AGN
-       4236    Wireless WiFi Link 5300
+       4236    Ultimate N WiFi Link 5300
        4237    5100 AGN Intel (R) WiFi Link 5100 AGN
-       4238    WiFi Link 6000 Series
-       4239    WiFi Link 6000 Series
+       4238    Centrino Ultimate-N 6300
+       4239    Centrino Advanced-N 6200
        423A    PRO/Wireless 5350 AGN [Echo Peak] Network Connection
        423B    PRO/Wireless 5350 AGN [Echo Peak] Network Connection
-       423C    WiMAX/WiFi Link 5150 Series
-       423D    WiMAX/WiFi Link 5150 Series
+       423C    WiMAX/WiFi Link 5150
+       423D    WiMAX/WiFi Link 5150
        4318    1370 (0280) Dell Wireless 1370 WLAN Mini-PCI Card
        444D    Flash Cache Logic Chip
        444E    TurboMemory Intel TurboMemory
        5025    PCI Express Port PEA1
        5028    S-ATA IDE
        5029    ?(EP80579) AHCI Controller
-       502A    S-ATA RAID0/1
-       502B    S-ATA Reserved
+       502A    Tolaoai SATA Controller
+       502B    Tolapai SATA Controller
        502C    System Device
        502D    EP80579 Integrated Processor with QuickAssist ASU
        502E    EP80579 Reserved
        803B    0x104d 0x81ef
        8086    24D0 PRO/100 VE Network Connection
        8100    System Controller Hub (SCH Poulsbo)
-       8108    System Controller Hub (SCH Poulsbo) Graphics Controller
+       8108    SCH US15WP Intel(R) Graphics Media Accelerator 500
        8110    System Controller Hub (SCH Poulsbo) PCI Express Port 1
        8112    System Controller Hub (SCH Poulsbo) PCI Express Port 2
        8114    System Controller Hub (SCH Poulsbo) USB UHCI #1
        880E    Topcliff USB OHCI Controller #3
        880F    Topcliff USB2 EHCI Controller #1
        8810    Topcliff DMA Controller #1
-       8811    Topcliff UART Controller #1
-       8812    Topcliff UART Controller #2
-       8813    Topcliff UART Controller #3
-       8814    Topcliff UART Controller #4
+       8811    Topcliff UART Controller 0
+       8812    Topcliff UART Controller 1
+       8813    Topcliff UART Controller 2
+       8814    Topcliff UART Controller 3
        8815    Topcliff DMA Controller #2
        8816    Topcliff Serial Peripheral Interface Bus
        8817    Topcliff I2C Controller
 8384   Sigmatel Inc (??)
        7618    High Definition Audio Codec
        7634    9250 HD Audio Codec
+       7662    High Definition Audio Codec
        7664    High Definition Audio Codec
        7670    9770 High Definition Audio
        7672    9772 High Definition Audio
        00C3    AIC-7899D Ultra160 SCSI Host Adapter
        00C5    RAID Subsystem HBA
        00CF    AIC-7899P Ultra160 SCSI Host Adapter
-       0241    Serial ATA II RAID 1420SA
+       0241    1420 Adaptec 1420SA Serial AHA HostRAID Controller
        0242    Serial ATA II RAID 1220SA
        0243    Serial ATA II RAID 1430SA
        0244    eSATA II RAID 1225SA
@@ -12840,6 +13092,7 @@ AECB    Adrienne Electronics Corporation
        6250    VITC/LTC Timecode Reader card [PCI-VLTC/RDR]
 AFFE   Sirrix AG security technologies
        02E1    PCI2E1 2-port ISDN E1 interface
+       450E    PCI4S0EC 4-port ISDN S0 interface
        DEAD    Sirrix.PCI4S0 4-port ISDN S0 interface
 B00C   IC Book Labs
        001C    IC80+PCI POST Diagnostics Card
@@ -12901,6 +13154,7 @@ D161    Digium, Inc
        0411    Wildcard TE411P Quad-Span togglable E1/T1/J1 echo cancellation card 3.3v
        0420    Wildcard TE420P quad-span T1/E1/J1 card 3.3V (PCI-Express)
        0800    Wildcard TDM800P 8-port analog card
+       1220    Wildcard TE220 dual-span T1/E1/J1 card 3.3V (PCI-Express) (5th gen)
        2400    Wildcard TDM2400P
        3400    Wildcard TC400P transcoder base card
        8000    Wildcard TE121 single-span T1/E1/J1 card (PCI-Express)
@@ -12910,6 +13164,8 @@ D161    Digium, Inc
        8004    Wildcard TCE400P transcoder base card
        8005    Wildcard TDM410 4-port analog card
        8006    Wildcard AEX410 4-port analog card (PCI-Express)
+       8007    Hx8 Series 8-port Base Card
+       8008    Hx8 Series 8-port Base Card (PCI-Express)
        B410    Wildcard B410 quad-BRI card
 D4D4   Curtiss-Wright Controls Embedded Computing
        010F    PMC-211 PMC-211
@@ -12948,6 +13204,7 @@ EA60    RME
        9898    Digi32/8
 EABB   Aashima Technology B.V.
 EACE   Endace Measurement Systems Ltd.
+       2870    Pinnacle e70 TV DVB-T
        3100    DAG 3.10 OC-3/OC-12
        3200    DAG 3.2x OC-3/OC-12
        320E    DAG 3.2E Fast Ethernet
@@ -12987,12 +13244,18 @@ EACE  Endace Measurement Systems Ltd.
        6100    DAG 6.1SE 10G Ethernet/OC-192
        6200    DAG 6.2SE 10G Ethernet/OC-192
        7100    DAG 7.1S OC-3/OC-12
+       7400    DAG 7.4S OC-3/OC-12
+       7401    DAG 7.4S48 OC-48
+       752E    DAG 7.5G2 Gig Ethernet
+       754E    DAG 7.5G4 Gig Ethernet
        8100    DAG 8.1X 10G Ethernet
        8101    DAG 8.1SX 10G Ethernet/OC-192
        8102    DAG 8.1X 10G Ethernet
        820E    DAG 8.2X 10G Ethernet
        820F    DAG 8.2X 10G Ethernet (2nd bus)
        8400    DAG 8.4I Infiniband x4 SDR
+       8500    DAG 8.5I Infiniband x4 DDR
+       920E    DAG 9.2X2 10G Ethernet
 EC80   Belkin Corp
        EC00    F5D6000
 ECC0   Echo Digital Audio Corporation
index 3a8ce90..2ad539c 100644 (file)
        unset acpi_load
        set hint.acpi.0.disabled="1"
 
+       If needed, disable the use of EHCI with:
+
+       unset ehci_load
+       set hint.ehci.0.disabled="1"
+
 ################################################################################
 # Tautoboot DBoot after a delay
 
 
        will print the current device.
 
+################################################################################
+# TEHCI DControl EHCI module behaviour
+
+       $ehci_load
+
+       If the ehci_load variable is set, the EHCI module will be loaded.
+       The use of EHCI can be disabled with:
+
+       unset ehci_load
+       set hint.ehci.0.disabled="1"
+
 ################################################################################
 # Tload DLoad a kernel or module
        
index ead2046..9d68e8f 100644 (file)
@@ -26,7 +26,7 @@
 .\"
 .\" Note: The date here should be updated whenever a non-trivial
 .\" change is made to the manual page.
-.Dd November 26, 2009
+.Dd July 4, 2010
 .Dt LOADER 8
 .Os
 .Sh NAME
@@ -388,6 +388,8 @@ Defines the current console.
 .It Va currdev
 Selects the default device.
 Syntax for devices is odd.
+.It Va ehci_load
+Unset this to disable automatic loading of the EHCI module.
 .It Va init_path
 Sets the list of binaries which the kernel will try to run as the initial
 process.
index eb26674..ef1731c 100644 (file)
@@ -24,7 +24,6 @@
 \ SUCH DAMAGE.
 \
 \ $FreeBSD: src/sys/boot/forth/beastie.4th,v 1.7 2003/10/28 17:18:42 scottl Exp $
-\ $DragonFly: src/sys/boot/forth/beastie.4th,v 1.9 2008/09/02 17:21:15 dillon Exp $
 
 marker task-beastie.4th
 
@@ -233,6 +232,9 @@ set-current
                                s" 1" s" hint.acpi.0.disabled" setenv
                                s" 1" s" loader.acpi_disabled_by_user" setenv
                        then
+                       s" ehci_load" unsetenv
+                       s" 1" s" hint.ehci.0.disabled" setenv
+                       s" 1" s" loader.ehci_disabled_by_user" setenv
                        s" 0" s" hw.ata.ata_dma" setenv
                        s" 0" s" hw.ata.atapi_dma" setenv
                        s" 0" s" hw.ata.wc" setenv
index 237d690..f2676ef 100644 (file)
@@ -24,7 +24,6 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/boot/i386/libi386/i386_module.c,v 1.12 2003/08/25 23:28:31 obrien Exp $
- * $DragonFly: src/sys/boot/pc32/libi386/i386_module.c,v 1.3 2003/11/10 06:08:36 dillon Exp $
  */
 
 /*
@@ -64,5 +63,17 @@ i386_autoload(void)
            printf("ACPI autoload failed - %s\n", strerror(error));
     }
 
+    disabled = 0;
+    rv = getenv("hint.ehci.0.disabled");
+    if (rv != NULL && strncmp(rv, "0", 1) != 0) {
+       disabled = 1;
+    }
+
+    if (getenv("ehci_load") && (!disabled)) {
+       error = mod_load("ehci", NULL, 0, NULL);
+       if (error != 0)
+           printf("EHCI autoload failed - %s\n", strerror(error));
+    }
+
     return(0);
 }
index d40426d..84a61fe 100644 (file)
@@ -13,8 +13,6 @@
        pass information to the ACPI module.  These should not be 
        overridden, or system behaviour will be undefined.
 
-       $DragonFly: src/sys/boot/pc32/loader/help.i386,v 1.3 2008/02/19 21:41:07 thomas Exp $
-
 ################################################################################
 # Treboot DReboot the system
 
index 414bb10..af24fcf 100644 (file)
@@ -240,6 +240,9 @@ main(void)
     /* detect ACPI for future reference */
     biosacpi_detect();
 
+    /* enable EHCI */
+    setenv("ehci_load", "YES", 1);
+
     printf("\n");
     printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
     printf("(%s, %s)\n", bootprog_maker, bootprog_date);
index a600fbf..81b671a 100644 (file)
@@ -333,6 +333,26 @@ ${_src}: @/tools/makeobjops.awk @/${_srcsrc}
 #.endif
 #.endfor
 
+.if !empty(SRCS:Massym.s)
+CLEANFILES+=   assym.s genassym.o
+assym.s: genassym.o
+.if defined(BUILDING_WITH_KERNEL)
+genassym.o: opt_global.h
+.endif
+.if !exists(@)
+assym.s: @
+.else
+assym.s: @/kern/genassym.sh
+.endif
+       sh @/kern/genassym.sh genassym.o > ${.TARGET}
+.if exists(@)
+genassym.o: @/platform/${MACHINE_PLATFORM}/${MACHINE_ARCH}/genassym.c          
+.endif
+genassym.o: @ ${SRCS:Mopt_*.h}
+       ${CC} -c ${CFLAGS:N-fno-common:N-mcmodel=small} ${WERROR} \
+       @/platform/${MACHINE_PLATFORM}/${MACHINE_ARCH}/genassym.c
+.endif
+
 regress:
 
 .include <bsd.dep.mk>
index c508d29..13af91c 100644 (file)
@@ -1021,7 +1021,7 @@ pseudo-device     ccd     4       #Concatenated disk driver
 # Can't get vinum config: Invalid argument
 #
 # see vinum(4) for more reasons not to use these options.
-#pseudo-device vinum           #Vinum concat/mirror/raid driver
+pseudo-device  vinum           #Vinum concat/mirror/raid driver
 options        VINUMDEBUG      #enable Vinum debugging hooks
 
 # Kernel side iconv library
index 3260f58..72706cb 100644 (file)
@@ -1,5 +1,4 @@
 KMOD=          acpi_sony
-CFLAGS+=       -I${.OBJDIR}/.. -I${.CURDIR}/..
-SRCS=          acpi_sony.c opt_acpi.h device_if.h bus_if.h
+SRCS=          acpi_sony.c opt_acpi.h device_if.h bus_if.h acpi_if.h
 
 .include <bsd.kmod.mk>
index 135b682..df2bf8d 100644 (file)
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpi_support/acpi_sony.c,v 1.13 2009/06/05 18:44:36 jkim
+ * $FreeBSD: src/sys/dev/acpi_support/acpi_sony.c,v 1.14 2010/02/07 18:36:30 gavin Exp $
  */
 
 #include "opt_acpi.h"
 #define _COMPONENT     ACPI_OEM
 ACPI_MODULE_NAME("Sony")
 
-#define ACPI_SONY_GET_BRIGHTNESS "GBRT"
-#define ACPI_SONY_SET_BRIGHTNESS "SBRT"
 #define ACPI_SONY_GET_PID "GPID"
 
 /*
  * SNY5001
+ *   This is the ACPI handle for the "Sony Notebook Control" driver under
+ *   Windows.
+ *   It provides several methods within the ACPI namespace, including:
  *  [GS]BRT [GS]PBR [GS]CTR [GS]PCR [GS]CMI [CDPW GCDP]? GWDP PWAK PWRN 
  *
+ * SNY6001
+ *   This is the ACPI handle for the "Sony Programmable I/O" driver under
+ *   Windows.
+ *   It is not yet supported by this driver, but provides control over the
+ *   power to the bluetooth, built-in camera and HSDPA modem devices in some
+ *   laptops, and also allows some control of the fan speed.
  */
 
 struct acpi_sony_softc {
@@ -64,14 +71,17 @@ static struct acpi_sony_name_list
        char *comment;
 } acpi_sony_oids[] = {
        { "brightness", "GBRT", "SBRT", "Display Brightness"},
-       { "ctr", "GCTR", "SCTR", "??"},
+       { "brightness_default", "GPBR", "SPBR", "Default Display Brightness"},
+       { "contrast", "GCTR", "SCTR", "Display Contrast"},
+       { "bass_gain", "GMGB", "SMGB", "Multimedia Bass Gain"},
        { "pcr", "GPCR", "SPCR", "???"},
 #if 0
-       { "cmi", "GCMI", "SCMI", "????"},
+       { "cmi", "GCMI", "SCMI", "???"},
 #endif
-       { "wdp", "GWDP", NULL, "?????"},
+       { "wdp", "GWDP", NULL, "???"},
        { "cdp", "GCDP", "CDPW", "CD Power"},  /*shares [\GL03]&0x8 flag*/
        { "azp", "GAZP", "AZPW", "Audio Power"}, 
+       { "lnp", "GLNP", "LNPW", "LAN Power"},
        { NULL, NULL, NULL }
 };
 
index cdeacbc..1aa444b 100644 (file)
@@ -1145,7 +1145,7 @@ sk_attach(device_t dev)
        struct sk_softc *sc = device_get_softc(device_get_parent(dev));
        struct sk_if_softc *sc_if = device_get_softc(dev);
        struct ifnet *ifp = &sc_if->arpcom.ac_if;
-       int i, error;
+       int i, error, if_attached = 0;
 
        if_initname(ifp, device_get_name(dev), device_get_unit(dev));
 
@@ -1272,6 +1272,16 @@ sk_attach(device_t dev)
        /* Don't use jumbo buffers by default */
        sc_if->sk_use_jumbo = 0;
 
+       /*
+        * Call MI attach routines.
+        *
+        * NOTE:
+        * This must be done before following sk_init_xxx(), in which
+        * if_multiaddrs will be used.
+        */
+       ether_ifattach(ifp, sc_if->arpcom.ac_enaddr, &sc->sk_serializer);
+       if_attached = 1;
+
        /*
         * Do miibus setup.
         */
@@ -1301,14 +1311,11 @@ sk_attach(device_t dev)
 
        callout_init(&sc_if->sk_tick_timer);
 
-       /*
-        * Call MI attach routines.
-        */
-       ether_ifattach(ifp, sc_if->arpcom.ac_enaddr, &sc->sk_serializer);
-
        DPRINTFN(2, ("sk_attach: end\n"));
        return 0;
 fail:
+       if (if_attached)
+               ether_ifdetach(ifp);
        sk_detach(dev);
        sc->sk_if[sc_if->sk_port] = NULL;
        return error;
index ec88411..a2aabba 100644 (file)
@@ -699,11 +699,10 @@ vinum_scandisk(char *devicename[], int drives)
 
     /* Open all drives and find which was modified most recently */
     for (driveno = 0; driveno < drives; driveno++) {
-       char part;                                          /* UNIX partition */
+       char part, has_part = 0;                            /* UNIX partition */
        int slice;
        int founddrive;                                     /* flag when we find a vinum drive */
        int has_slice = -1;
-       int has_part = 0;
        char *tmp;
 
        founddrive = 0;                                     /* no vinum drive found yet on this spindle */
index 7a8974b..7b4ebad 100644 (file)
@@ -12,6 +12,7 @@ SRCS= linux_dummy.c linux_emuldata.c linux_epoll.c \
        linux_socket.c \
        linux_stats.c linux_sysctl.c linux_sysent.c linux_sysvec.c \
        linux_util.c opt_compat.h opt_global.h opt_vmpage.h
+SRCS+= opt_nfs.h assym.s
 OBJS=  linux_support.o linux_locore.o
 
 SUBDIR= i386/linprocfs
@@ -22,6 +23,7 @@ SRCS+=        linux_ptrace.c linux_uid16.c imgact_linux.c opt_cpu.h
 CLEANFILES=    linux_assym.h linux_genassym.o
 
 linux_assym.h: linux_genassym.o
+
 .if exists(@)
 linux_assym.h: @/kern/genassym.sh
 .endif
@@ -31,7 +33,7 @@ linux_locore.o: linux_locore.s linux_assym.h
        ${CC} -c -x assembler-with-cpp -DLOCORE ${CFLAGS} \
            ${.IMPSRC} -o ${.TARGET}
 
-linux_support.o: linux_support.s linux_assym.h
+linux_support.o: linux_support.s linux_assym.h assym.s
        ${CC} -c -x assembler-with-cpp -DLOCORE ${CFLAGS} \
            ${.IMPSRC} -o ${.TARGET}
 
index d8d3ecb..dad054f 100644 (file)
@@ -398,19 +398,15 @@ sys_linux_exit_group(struct linux_exit_group_args *args)
        int rval;
 
        rval = args->rval;
-
-       get_mplock();
-
        EMUL_LOCK();
 
        em = emuldata_get(curproc);
 
        if (em->s->refs == 1) {
+               EMUL_UNLOCK();
+               get_mplock();
                exit1(W_EXITCODE(rval, 0));
                /* notreached */
-
-               EMUL_UNLOCK();
-
                rel_mplock();
                return (0);
        }
@@ -421,7 +417,7 @@ sys_linux_exit_group(struct linux_exit_group_args *args)
 
        LIST_REMOVE(em, threads);
        LIST_INSERT_HEAD(&em->s->threads, em, threads);
-       
+
        while ((e = LIST_NEXT(em, threads)) != NULL) {
                LIST_REMOVE(em, threads);
                LIST_INSERT_AFTER(e, em, threads);
@@ -432,9 +428,8 @@ sys_linux_exit_group(struct linux_exit_group_args *args)
                }
        }
 
-
        EMUL_UNLOCK();
-
+       get_mplock();
        exit1(W_EXITCODE(rval, 0));
        rel_mplock();
        /* notreached */
index 56f57b8..7daf8f5 100644 (file)
@@ -191,6 +191,9 @@ emuldata_exit(void *unused, struct proc *p)
                return;
        }
 
+       LIST_REMOVE(em, threads);
+       p->p_emuldata = NULL;
+
        /*
         * Members of the thread groups others than the leader should
         * exit quietely: no zombie stage, no signal. We do that by
@@ -205,6 +208,20 @@ emuldata_exit(void *unused, struct proc *p)
                proc_reparent(p, initproc); /* XXX: might be dangerous */
        }
 
+       if ((em->s->group_pid == p->p_pid) &&
+           (em->s->flags & LINUX_LES_INEXITGROUP)) {
+               p->p_xstat = em->s->xstat;
+       }
+
+       if (atomic_fetchadd_int(&em->s->refs, -1) == 1) {
+               kfree(em->s, M_LINUX);
+               em->s = NULL;
+       }
+       if (em->s)
+               KKASSERT(em->s->refs >= 0);
+
+       EMUL_UNLOCK();
+
        if (em->clear_tid != NULL) {
                int tid = 0;
                copyout(&tid, em->clear_tid, sizeof(tid));
@@ -219,23 +236,6 @@ emuldata_exit(void *unused, struct proc *p)
                        kprintf("emuldata_exit futex stuff failed miserably\n");
        }
 
-       LIST_REMOVE(em, threads);
-
-       p->p_emuldata = NULL;
-
-       if ((em->s->group_pid == p->p_pid) &&
-           (em->s->flags & LINUX_LES_INEXITGROUP)) {
-               p->p_xstat = em->s->xstat;
-       }
-
-       if (atomic_fetchadd_int(&em->s->refs, -1) == 1) {
-               kfree(em->s, M_LINUX);
-               em->s = NULL;
-       }
-       if (em->s)
-               KKASSERT(em->s->refs >= 0);
-
-       EMUL_UNLOCK();
        kfree(em, M_LINUX);
 }
 
index e976114..b2978ba 100644 (file)
 #include <sys/lock.h>
 #endif
 
-#ifndef _SYS_MPLOCK2_H
-#include <sys/mplock2.h>
-#endif
-
 #ifndef _COMMON_LINUX_EMULDATA_H
 #define _COMMON_LINUX_EMULDATA_H
 
@@ -91,13 +87,8 @@ struct linux_emuldata {
 #define        EMUL_LOCKINIT(x)        lockinit(&emul_lock, "tux_emul", 0, LK_CANRECURSE)
 #define        EMUL_LOCKUNINIT(x)      lockuninit(&emul_lock)
 
-#if 0
 #define EMUL_LOCK(x)   lockmgr(&emul_lock, LK_EXCLUSIVE)
 #define        EMUL_UNLOCK(x)  lockmgr(&emul_lock, LK_RELEASE)
-#endif
-
-#define EMUL_LOCK(x)   get_mplock()
-#define        EMUL_UNLOCK(x)  rel_mplock()
 
 extern struct lock emul_lock;
 
index c4cf129..0f3db5c 100644 (file)
@@ -708,8 +708,9 @@ sys_linux_get_robust_list(struct linux_get_robust_list_args *args)
        if (ldebug(get_robust_list))
                kprintf(ARGS(get_robust_list, ""));
 #endif
-       EMUL_LOCK();
+
        if (args->pid == 0) {
+               EMUL_LOCK();
                em = emuldata_get(curproc);
                KKASSERT(em != NULL);
                if (em->robust_futexes == NULL) {
@@ -718,27 +719,28 @@ sys_linux_get_robust_list(struct linux_get_robust_list_args *args)
                } else {
                        head = em->robust_futexes;
                }
+               EMUL_UNLOCK();
        } else {
                struct proc *p;
 
                p = pfind(args->pid);
                if (p == NULL) {
-                       EMUL_UNLOCK();
                        return (ESRCH);
                }
 
+               EMUL_LOCK();
                em = emuldata_get(p);
+               head = em->robust_futexes;
+               EMUL_UNLOCK();
                /* XXX: ptrace? p_candebug?*/
                if (priv_check(curthread, PRIV_CRED_SETUID) ||
                    priv_check(curthread, PRIV_CRED_SETEUID)/* ||
                    p_candebug(curproc, p) */) {
-                       EMUL_UNLOCK();
                        return (EPERM);
                }
-               head = em->robust_futexes;
+               
 
        }
-       EMUL_UNLOCK();
 
        error = copyout(&len, args->len, sizeof(l_size_t));
        if (error)
index ab480fa..cb032fb 100644 (file)
@@ -1660,7 +1660,7 @@ sys_linux_getpid(struct linux_getpid_args *args)
        struct linux_emuldata *em;
        struct proc *p = curproc;
 
-       get_mplock();
+
        EMUL_LOCK();
        em = emuldata_get(p);
        if (em == NULL) /* this should never happen */
@@ -1668,7 +1668,7 @@ sys_linux_getpid(struct linux_getpid_args *args)
        else
                args->sysmsg_result = em->s->group_pid;
        EMUL_UNLOCK();
-       rel_mplock();
+
        return (0);
 }
 
@@ -1681,27 +1681,30 @@ sys_linux_getppid(struct linux_getppid_args *args)
        struct linux_emuldata *em;
        struct proc *parent;
        struct proc *p;
+       pid_t group_pid;
 
-       get_mplock();
        EMUL_LOCK();
        em = emuldata_get(curproc);
        KKASSERT(em != NULL);
+       group_pid = em->s->group_pid;
+       EMUL_UNLOCK();
 
-       p = pfind(em->s->group_pid);
+       p = pfind(group_pid);
        /* We are not allowed to fail */
        if (p == NULL)
                goto out;
 
        parent = p->p_pptr;
        if (parent->p_sysent == &elf_linux_sysvec) {
+               EMUL_LOCK();
                em = emuldata_get(parent);
                args->sysmsg_result = em->s->group_pid;
+               EMUL_UNLOCK();
        } else {
                args->sysmsg_result = parent->p_pid;
        }
+
 out:
-       EMUL_UNLOCK();
-       rel_mplock();
        return (0);
 }
 
index d1e14b7..f7a1ff6 100644 (file)
@@ -423,7 +423,6 @@ linux_do_tkill(l_int tgid, l_int pid, l_int sig)
        if (sig > 0 && sig <= LINUX_SIGTBLSZ)
                sig = linux_to_bsd_signal[_SIG_IDX(sig)];
 
-       get_mplock();
        lwkt_gettoken(&proc_token);
        if ((p = pfind(pid)) == NULL) {
                if ((p = zpfind(pid)) == NULL) {
@@ -448,13 +447,15 @@ linux_do_tkill(l_int tgid, l_int pid, l_int sig)
                goto done1;
        }
        EMUL_UNLOCK();
-       
+
+       get_mplock();
        error = kern_kill(sig, pid, -1);
+       rel_mplock();
+
 done1:
        PRELE(p);
 done2:
        lwkt_reltoken(&proc_token);
-       rel_mplock();
 
        return (error);
 }
index 93d3772..8d1e0fb 100644 (file)
@@ -40,8 +40,6 @@
 #ifndef        _LINUX_UTIL_H_
 #define        _LINUX_UTIL_H_
 
-#include "opt_global.h"
-
 #include <vm/vm.h>
 #include <vm/vm_param.h>
 #include <vm/pmap.h>
index b3d847c..8e40782 100644 (file)
@@ -607,6 +607,7 @@ exec_map_page(struct image_params *imgp, vm_pindex_t pageno,
         */
        m = vm_page_grab(object, pageno, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
        crit_enter();
+       lwkt_gettoken(&vm_token);
        while ((m->valid & VM_PAGE_BITS_ALL) != VM_PAGE_BITS_ALL) {
                ma = m;
 
@@ -625,12 +626,14 @@ exec_map_page(struct image_params *imgp, vm_pindex_t pageno,
                                vm_page_protect(m, VM_PROT_NONE);
                                vnode_pager_freepage(m);
                        }
+                       lwkt_reltoken(&vm_token);
                        crit_exit();
                        return EIO;
                }
        }
-       vm_page_hold(m);
+       vm_page_hold(m);        /* requires vm_token to be held */
        vm_page_wakeup(m);      /* unbusy the page */
+       lwkt_reltoken(&vm_token);
        crit_exit();
 
        *plwb = lwbuf_alloc(m);
index 0961f31..f2bbe91 100644 (file)
@@ -177,13 +177,13 @@ xio_init_kbuf(xio_t xio, void *kbase, size_t kbytes)
     xio->xio_error = 0;
     if ((n = PAGE_SIZE - xio->xio_offset) > kbytes)
        n = kbytes;
+    lwkt_gettoken(&vm_token);
+    crit_enter();
     for (i = 0; n && i < XIO_INTERNAL_PAGES; ++i) {
        if ((paddr = pmap_kextract(addr)) == 0)
            break;
-       crit_enter();
        m = PHYS_TO_VM_PAGE(paddr);
        vm_page_hold(m);
-       crit_exit();
        xio->xio_pages[i] = m;
        kbytes -= n;
        xio->xio_bytes += n;
@@ -191,6 +191,8 @@ xio_init_kbuf(xio_t xio, void *kbase, size_t kbytes)
            n = PAGE_SIZE;
        addr += PAGE_SIZE;
     }
+    crit_exit();
+    lwkt_reltoken(&vm_token);
     xio->xio_npages = i;
 
     /*
@@ -221,12 +223,14 @@ xio_init_pages(xio_t xio, struct vm_page **mbase, int npages, int xflags)
     xio->xio_pages = xio->xio_internal_pages;
     xio->xio_npages = npages;
     xio->xio_error = 0;
+    lwkt_gettoken(&vm_token);
     crit_enter();
     for (i = 0; i < npages; ++i) {
        vm_page_hold(mbase[i]);
        xio->xio_pages[i] = mbase[i];
     }
     crit_exit();
+    lwkt_reltoken(&vm_token);
     return(0);
 }
 
@@ -240,6 +244,7 @@ xio_release(xio_t xio)
     int i;
     vm_page_t m;
 
+    lwkt_gettoken(&vm_token);
     crit_enter();
     for (i = 0; i < xio->xio_npages; ++i) {
        m = xio->xio_pages[i];
@@ -248,6 +253,7 @@ xio_release(xio_t xio)
        vm_page_unhold(m);
     }
     crit_exit();
+    lwkt_reltoken(&vm_token);
     xio->xio_offset = 0;
     xio->xio_npages = 0;
     xio->xio_bytes = 0;
index fba4324..26d7a8b 100644 (file)
@@ -1680,6 +1680,7 @@ vfs_vmio_release(struct buf *bp)
        int i;
        vm_page_t m;
 
+       lwkt_gettoken(&vm_token);
        crit_enter();
        for (i = 0; i < bp->b_xio.xio_npages; i++) {
                m = bp->b_xio.xio_pages[i];
@@ -1743,6 +1744,7 @@ vfs_vmio_release(struct buf *bp)
                }
        }
        crit_exit();
+       lwkt_reltoken(&vm_token);
        pmap_qremove(trunc_page((vm_offset_t) bp->b_data), bp->b_xio.xio_npages);
        if (bp->b_bufsize) {
                bufspacewakeup();
@@ -4360,8 +4362,10 @@ vm_hold_free_pages(struct buf *bp, vm_offset_t from, vm_offset_t to)
 
        from = round_page(from);
        to = round_page(to);
-       newnpages = index = (from - trunc_page((vm_offset_t)bp->b_data)) >> PAGE_SHIFT;
+       index = (from - trunc_page((vm_offset_t)bp->b_data)) >> PAGE_SHIFT;
+       newnpages = index;
 
+       lwkt_gettoken(&vm_token);
        for (pg = from; pg < to; pg += PAGE_SIZE, index++) {
                p = bp->b_xio.xio_pages[index];
                if (p && (index < bp->b_xio.xio_npages)) {
@@ -4379,6 +4383,7 @@ vm_hold_free_pages(struct buf *bp, vm_offset_t from, vm_offset_t to)
                }
        }
        bp->b_xio.xio_npages = newnpages;
+       lwkt_reltoken(&vm_token);
 }
 
 /*
index 05733c7..3ab94e2 100644 (file)
@@ -633,6 +633,21 @@ dounmount_interlock(struct mount *mp)
        return(0);
 }
 
+static int
+unmount_allproc_cb(struct proc *p, void *arg)
+{
+       struct mount *mp;
+
+       if (p->p_textnch.ncp == NULL)
+               return 0;
+
+       mp = (struct mount *)arg;
+       if (p->p_textnch.mount == mp)
+               cache_drop(&p->p_textnch);
+
+       return 0;
+}
+
 int
 dounmount(struct mount *mp, int flags)
 {
@@ -681,6 +696,11 @@ dounmount(struct mount *mp, int flags)
                cache_inval(&mp->mnt_ncmountpt, CINV_DESTROY|CINV_CHILDREN);
                cache_unlock(&mp->mnt_ncmountpt);
 
+               if ((ncp = mp->mnt_ncmountpt.ncp) != NULL &&
+                   (ncp->nc_refs != 1 || TAILQ_FIRST(&ncp->nc_list))) {
+                       allproc_scan(&unmount_allproc_cb, mp);
+               }
+
                if ((ncp = mp->mnt_ncmountpt.ncp) != NULL &&
                    (ncp->nc_refs != 1 || TAILQ_FIRST(&ncp->nc_list))) {
 
index 04b50b5..6975be4 100644 (file)
@@ -436,6 +436,7 @@ nvnode_pager_setsize(struct vnode *vp, off_t length, int blksize, int boff)
                 * invalidated.
                 */
                pi = OFF_TO_IDX(length + PAGE_MASK);
+               lwkt_gettoken(&vm_token);
                while (pi < nobjsize) {
                        do {
                                m = vm_page_lookup(object, pi);
@@ -447,6 +448,7 @@ nvnode_pager_setsize(struct vnode *vp, off_t length, int blksize, int boff)
                        }
                        ++pi;
                }
+               lwkt_reltoken(&vm_token);
        } else {
                /*
                 * File has expanded.
index 91f1b67..ea70e53 100644 (file)
 #include <net/altq/altq.h>
 
 /* machine dependent clock related includes */
-#if defined(__i386__)
 #include <machine/clock.h>             /* for tsc_frequency */
 #include <machine/md_var.h>            /* for cpu_feature */
 #include <machine/specialreg.h>                /* for CPUID_TSC */
-#endif /* __i386__ */
 
 /*
  * internal function prototypes
index 084de48..5a43dac 100644 (file)
@@ -728,10 +728,12 @@ if_detach(struct ifnet *ifp)
 #endif
        if_down(ifp);
 
+#ifdef ALTQ
        if (ifq_is_enabled(&ifp->if_snd))
                altq_disable(&ifp->if_snd);
        if (ifq_is_attached(&ifp->if_snd))
                altq_detach(&ifp->if_snd);
+#endif
 
        /*
         * Clean up all addresses.
index 78eb6ce..2d70cc2 100644 (file)
@@ -1212,6 +1212,7 @@ pmap_puninit(pmap_t pmap)
        vm_page_t p;
 
        KKASSERT(pmap->pm_active == 0);
+       lwkt_gettoken(&vm_token);
        if ((p = pmap->pm_pdirm) != NULL) {
                KKASSERT(pmap->pm_pdir != NULL);
                pmap_kremove((vm_offset_t)pmap->pm_pdir);
@@ -1222,6 +1223,7 @@ pmap_puninit(pmap_t pmap)
                vm_page_free_zero(p);
                pmap->pm_pdirm = NULL;
        }
+       lwkt_reltoken(&vm_token);
        if (pmap->pm_pdir) {
                kmem_free(&kernel_map, (vm_offset_t)pmap->pm_pdir, PAGE_SIZE);
                pmap->pm_pdir = NULL;
@@ -2048,9 +2050,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
                return;
 
        if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
-               lwkt_gettoken(&vm_token);
                pmap_remove(pmap, sva, eva);
-               lwkt_reltoken(&vm_token);
                return;
        }
 
@@ -2823,6 +2823,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
        lwkt_gettoken(&vm_token);
        TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
                if (pv->pv_pmap == pmap) {
+                       lwkt_reltoken(&vm_token);
                        crit_exit();
                        return TRUE;
                }
index a955284..fef9c60 100644 (file)
@@ -1,4 +1,6 @@
 /*
+ * (MPSAFE)
+ *
  * Copyright (c) 1991 Regents of the University of California.
  * Copyright (c) 1994 John S. Dyson
  * Copyright (c) 1994 David Greenman
@@ -843,12 +845,9 @@ pmap_track_modified(vm_offset_t va)
 }
 
 /*
- * pmap_extract:
- *
- *     Extract the physical page address associated with the map/VA pair.
+ * Extract the physical page address associated with the map/VA pair.
  *
- *     This function may not be called from an interrupt if the pmap is
- *     not kernel_pmap.
+ * The caller must hold vm_token if non-blocking operation is desired.
  */
 vm_paddr_t 
 pmap_extract(pmap_t pmap, vm_offset_t va)
@@ -857,6 +856,7 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
        pt_entry_t *pte;
        pd_entry_t pde, *pdep;
 
+       lwkt_gettoken(&vm_token);
        rtval = 0;
        pdep = pmap_pde(pmap, va);
        if (pdep != NULL) {
@@ -870,14 +870,12 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
                        }
                }
        }
+       lwkt_reltoken(&vm_token);
        return rtval;
 }
 
 /*
- *     Routine:        pmap_kextract
- *     Function:
- *             Extract the physical page address associated
- *             kernel virtual address.
+ * Extract the physical page address associated kernel virtual address.
  */
 vm_paddr_t
 pmap_kextract(vm_offset_t va)
@@ -1367,6 +1365,7 @@ pmap_puninit(pmap_t pmap)
        vm_page_t p;
 
        KKASSERT(pmap->pm_active == 0);
+       lwkt_gettoken(&vm_token);
        if ((p = pmap->pm_pdirm) != NULL) {
                KKASSERT(pmap->pm_pml4 != NULL);
                KKASSERT(pmap->pm_pml4 != (void *)(PTOV_OFFSET + KPML4phys));
@@ -1387,6 +1386,7 @@ pmap_puninit(pmap_t pmap)
                vm_object_deallocate(pmap->pm_pteobj);
                pmap->pm_pteobj = NULL;
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -1399,8 +1399,10 @@ void
 pmap_pinit2(struct pmap *pmap)
 {
        crit_enter();
+       lwkt_gettoken(&vm_token);
        TAILQ_INSERT_TAIL(&pmap_list, pmap, pm_pmnode);
        /* XXX copies current process, does not fill in MPPTDI */
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
@@ -1767,6 +1769,7 @@ pmap_release(struct pmap *pmap)
        info.pmap = pmap;
        info.object = object;
        crit_enter();
+       lwkt_gettoken(&vm_token);
        TAILQ_REMOVE(&pmap_list, pmap, pm_pmnode);
        crit_exit();
 
@@ -1784,6 +1787,7 @@ pmap_release(struct pmap *pmap)
                }
                crit_exit();
        } while (info.error);
+       lwkt_reltoken(&vm_token);
 }
 
 static
@@ -1820,6 +1824,7 @@ pmap_growkernel(vm_offset_t addr)
        pdp_entry_t newpdp;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        if (kernel_vm_end == 0) {
                kernel_vm_end = VM_MIN_KERNEL_ADDRESS;
                nkpt = 0;
@@ -1885,6 +1890,7 @@ pmap_growkernel(vm_offset_t addr)
                        break;                       
                }
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
@@ -1901,11 +1907,13 @@ pmap_destroy(pmap_t pmap)
        if (pmap == NULL)
                return;
 
+       lwkt_gettoken(&vm_token);
        count = --pmap->pm_count;
        if (count == 0) {
                pmap_release(pmap);
                panic("destroying a pmap is not yet implemented");
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -1915,7 +1923,9 @@ void
 pmap_reference(pmap_t pmap)
 {
        if (pmap != NULL) {
+               lwkt_gettoken(&vm_token);
                pmap->pm_count++;
+               lwkt_reltoken(&vm_token);
        }
 }
 
@@ -1967,7 +1977,7 @@ pmap_collect(void)
 
        if (pmap_pagedaemon_waken == 0)
                return;
-
+       lwkt_gettoken(&vm_token);
        if (warningdone < 5) {
                kprintf("pmap_collect: collecting pv entries -- suggest increasing PMAP_SHPGPERPROC\n");
                warningdone++;
@@ -1981,6 +1991,7 @@ pmap_collect(void)
                pmap_remove_all(m);
        }
        pmap_pagedaemon_waken = 0;
+       lwkt_reltoken(&vm_token);
 }
        
 
@@ -2146,8 +2157,11 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
        if (pmap == NULL)
                return;
 
-       if (pmap->pm_stats.resident_count == 0)
+       lwkt_gettoken(&vm_token);
+       if (pmap->pm_stats.resident_count == 0) {
+               lwkt_reltoken(&vm_token);
                return;
+       }
 
        pmap_inval_init(&info);
 
@@ -2161,6 +2175,7 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
                if (pde && (*pde & PG_PS) == 0) {
                        pmap_remove_page(pmap, sva, &info);
                        pmap_inval_done(&info);
+                       lwkt_reltoken(&vm_token);
                        return;
                }
        }
@@ -2230,6 +2245,7 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
                }
        }
        pmap_inval_done(&info);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2252,6 +2268,7 @@ pmap_remove_all(vm_page_t m)
        if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
                return;
 
+       lwkt_gettoken(&vm_token);
        pmap_inval_init(&info);
        crit_enter();
        while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
@@ -2294,6 +2311,7 @@ pmap_remove_all(vm_page_t m)
        crit_exit();
        KKASSERT((m->flags & (PG_MAPPED|PG_WRITEABLE)) == 0);
        pmap_inval_done(&info);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2328,6 +2346,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
        if (prot & VM_PROT_WRITE)
                return;
 
+       lwkt_gettoken(&vm_token);
        pmap_inval_init(&info);
 
        for (; sva < eva; sva = va_next) {
@@ -2421,6 +2440,7 @@ again:
                }
        }
        pmap_inval_done(&info);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2470,6 +2490,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
 #endif
        }
 
+       lwkt_gettoken(&vm_token);
+
        /*
         * In the case that a page table page is not
         * resident, we are creating it here.
@@ -2602,6 +2624,7 @@ validate:
        }
        KKASSERT((newpte & PG_MANAGED) == 0 || (m->flags & PG_MAPPED));
        pmap_inval_done(&info);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2621,6 +2644,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
        pd_entry_t *ptepa;
        pmap_inval_info info;
 
+       lwkt_gettoken(&vm_token);
        pmap_inval_init(&info);
 
        if (va < UPT_MAX_ADDRESS && pmap == &kernel_pmap) {
@@ -2693,6 +2717,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
                pa = VM_PAGE_TO_PHYS(m);
                KKASSERT(((*pte ^ pa) & PG_FRAME) == 0);
                pmap_inval_done(&info);
+               lwkt_reltoken(&vm_token);
                return;
        }
 
@@ -2720,6 +2745,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
                *pte = pa | PG_V | PG_U | PG_MANAGED;
 /*     pmap_inval_add(&info, pmap, va); shouldn't be needed inval->valid */
        pmap_inval_done(&info);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2798,8 +2824,10 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_prot_t prot,
        info.pmap = pmap;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
                                pmap_object_init_pt_callback, &info);
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
@@ -2842,16 +2870,18 @@ pmap_prefault_ok(pmap_t pmap, vm_offset_t addr)
 {
        pt_entry_t *pte;
        pd_entry_t *pde;
+       int ret;
 
+       lwkt_gettoken(&vm_token);
        pde = pmap_pde(pmap, addr);
-       if (pde == NULL || *pde == 0)
-               return(0);
-
-       pte = vtopte(addr);
-       if (*pte)
-               return(0);
-
-       return(1);
+       if (pde == NULL || *pde == 0) {
+               ret = 0;
+       } else {
+               pte = vtopte(addr);
+               ret = (*pte) ? 0 : 1;
+       }
+       lwkt_reltoken(&vm_token);
+       return(ret);
 }
 
 /*
@@ -2869,6 +2899,7 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
        if (pmap == NULL)
                return;
 
+       lwkt_gettoken(&vm_token);
        pte = pmap_pte(pmap, va);
 
        if (wired && !pmap_pte_w(pte))
@@ -2894,6 +2925,7 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
        else
                atomic_clear_long_nonlocked(pte, PG_W);
 #endif
+       lwkt_reltoken(&vm_token);
 }
 
 
@@ -3156,9 +3188,11 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
                return FALSE;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
 
        TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
                if (pv->pv_pmap == pmap) {
+                       lwkt_reltoken(&vm_token);
                        crit_exit();
                        return TRUE;
                }
@@ -3166,6 +3200,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
                if (loops >= 16)
                        break;
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
        return (FALSE);
 }
@@ -3195,6 +3230,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
        else
                iscurrentpmap = 0;
 
+       lwkt_gettoken(&vm_token);
        pmap_inval_init(&info);
        for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
                if (pv->pv_va >= eva || pv->pv_va < sva) {
@@ -3259,6 +3295,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
                }
        }
        pmap_inval_done(&info);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -3405,12 +3442,14 @@ pmap_page_protect(vm_page_t m, vm_prot_t prot)
 {
        /* JG NX support? */
        if ((prot & VM_PROT_WRITE) == 0) {
+               lwkt_gettoken(&vm_token);
                if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
                        pmap_clearbit(m, PG_RW);
                        vm_page_flag_clear(m, PG_WRITEABLE);
                } else {
                        pmap_remove_all(m);
                }
+               lwkt_reltoken(&vm_token);
        }
 }
 
@@ -3443,6 +3482,7 @@ pmap_ts_referenced(vm_page_t m)
                return (rtval);
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
 
        if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
 
@@ -3474,6 +3514,7 @@ pmap_ts_referenced(vm_page_t m)
                        }
                } while ((pv = pvn) != NULL && pv != pvf);
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
 
        return (rtval);
@@ -3488,7 +3529,12 @@ pmap_ts_referenced(vm_page_t m)
 boolean_t
 pmap_is_modified(vm_page_t m)
 {
-       return pmap_testbit(m, PG_M);
+       boolean_t res;
+
+       lwkt_gettoken(&vm_token);
+       res = pmap_testbit(m, PG_M);
+       lwkt_reltoken(&vm_token);
+       return (res);
 }
 
 /*
@@ -3497,7 +3543,9 @@ pmap_is_modified(vm_page_t m)
 void
 pmap_clear_modify(vm_page_t m)
 {
+       lwkt_gettoken(&vm_token);
        pmap_clearbit(m, PG_M);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -3508,7 +3556,9 @@ pmap_clear_modify(vm_page_t m)
 void
 pmap_clear_reference(vm_page_t m)
 {
+       lwkt_gettoken(&vm_token);
        pmap_clearbit(m, PG_A);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -3630,17 +3680,15 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
        vm_page_t m;
        int val = 0;
        
+       lwkt_gettoken(&vm_token);
        ptep = pmap_pte(pmap, addr);
-       if (ptep == 0) {
-               return 0;
-       }
 
-       if ((pte = *ptep) != 0) {
+       if (ptep && (pte = *ptep) != 0) {
                vm_offset_t pa;
 
                val = MINCORE_INCORE;
                if ((pte & PG_MANAGED) == 0)
-                       return val;
+                       goto done;
 
                pa = pte & PG_FRAME;
 
@@ -3670,6 +3718,8 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
                        vm_page_flag_set(m, PG_REFERENCED);
                }
        } 
+done:
+       lwkt_reltoken(&vm_token);
        return val;
 }
 
index f1e15e5..9bea25e 100644 (file)
@@ -148,8 +148,8 @@ copyin(const void *udaddr, void *kaddr, size_t len)
                len -= n;
                udaddr = (const char *)udaddr + n;
                kaddr = (char *)kaddr + n;
-               vm_page_unhold(m);
                lwbuf_free(lwb);
+               vm_page_unhold(m);
        }
        rel_mplock();
        return (error);
@@ -187,8 +187,8 @@ copyout(const void *kaddr, void *udaddr, size_t len)
                udaddr = (char *)udaddr + n;
                kaddr = (const char *)kaddr + n;
                vm_page_dirty(m);
-               vm_page_unhold(m);
                lwbuf_free(lwb);
+               vm_page_unhold(m);
        }
        rel_mplock();
        return (error);
index 9374dd3..9cc3aed 100644 (file)
@@ -1,4 +1,6 @@
 /*
+ * (MPSAFE)
+ *
  * Copyright (c) 2006 The DragonFly Project.  All rights reserved.
  * Copyright (c) 1991 Regents of the University of California.
  * All rights reserved.
@@ -234,10 +236,13 @@ pmap_pinit(struct pmap *pmap)
 
 /*
  * Clean up a pmap structure so it can be physically freed
+ *
+ * No requirements.
  */
 void
 pmap_puninit(pmap_t pmap)
 {
+       lwkt_gettoken(&vm_token);
        if (pmap->pm_pdir) {
                kmem_free(&kernel_map, (vm_offset_t)pmap->pm_pdir, PAGE_SIZE);
                pmap->pm_pdir = NULL;
@@ -246,6 +251,7 @@ pmap_puninit(pmap_t pmap)
                vm_object_deallocate(pmap->pm_pteobj);
                pmap->pm_pteobj = NULL;
        }
+       lwkt_reltoken(&vm_token);
 }
 
 
@@ -256,12 +262,16 @@ pmap_puninit(pmap_t pmap)
  * then copies the template.
  *
  * In a virtual kernel there are no kernel global address entries.
+ *
+ * No requirements.
  */
 void
 pmap_pinit2(struct pmap *pmap)
 {
        crit_enter();
+       lwkt_gettoken(&vm_token);
        TAILQ_INSERT_TAIL(&pmap_list, pmap, pm_pmnode);
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
@@ -269,6 +279,8 @@ pmap_pinit2(struct pmap *pmap)
  * Release all resources held by the given physical map.
  *
  * Should only be called if the map contains no valid mappings.
+ *
+ * No requirements.
  */
 static int pmap_release_callback(struct vm_page *p, void *data);
 
@@ -309,6 +321,7 @@ pmap_release(struct pmap *pmap)
        info.pmap = pmap;
        info.object = object;
        crit_enter();
+       lwkt_gettoken(&vm_token);
        TAILQ_REMOVE(&pmap_list, pmap, pm_pmnode);
        crit_exit();
 
@@ -332,6 +345,7 @@ pmap_release(struct pmap *pmap)
         */
        pmap->pm_pdirpte = 0;
        pmap->pm_cpucachemask = 0;
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -361,30 +375,35 @@ pmap_release_callback(struct vm_page *p, void *data)
 /*
  * Retire the given physical map from service.  Should only be called if
  * the map contains no valid mappings.
+ *
+ * No requirements.
  */
 void
 pmap_destroy(pmap_t pmap)
 {
-       int count;
-
        if (pmap == NULL)
                return;
 
-       count = --pmap->pm_count;
-       if (count == 0) {
+       lwkt_gettoken(&vm_token);
+       if (--pmap->pm_count == 0) {
                pmap_release(pmap);
                panic("destroying a pmap is not yet implemented");
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
  * Add a reference to the specified pmap.
+ *
+ * No requirements.
  */
 void
 pmap_reference(pmap_t pmap)
 {
-       if (pmap != NULL) {
-               pmap->pm_count++;
+       if (pmap) {
+               lwkt_gettoken(&vm_token);
+               ++pmap->pm_count;
+               lwkt_reltoken(&vm_token);
        }
 }
 
@@ -869,15 +888,19 @@ pmap_dispose_proc(struct proc *p)
 /*
  * We pre-allocate all page table pages for kernel virtual memory so
  * this routine will only be called if KVM has been exhausted.
+ *
+ * No requirements.
  */
 void
 pmap_growkernel(vm_offset_t addr)
 {
        addr = (addr + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
 
+       lwkt_gettoken(&vm_token);
        if (addr > virtual_end - SEG_SIZE)
                panic("KVM exhausted");
        kernel_vm_end = addr;
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -1259,6 +1282,8 @@ get_pv_entry(void)
 /*
  * This routine is very drastic, but can save the system
  * in a pinch.
+ *
+ * No requirements.
  */
 void
 pmap_collect(void)
@@ -1269,6 +1294,7 @@ pmap_collect(void)
 
        if (pmap_pagedaemon_waken == 0)
                return;
+       lwkt_gettoken(&vm_token);
        pmap_pagedaemon_waken = 0;
 
        if (warningdone < 5) {
@@ -1283,6 +1309,7 @@ pmap_collect(void)
                        continue;
                pmap_remove_all(m);
        }
+       lwkt_reltoken(&vm_token);
 }
        
 /*
@@ -1426,15 +1453,15 @@ pmap_remove_page(struct pmap *pmap, vm_offset_t va)
 }
 
 /*
- * pmap_remove:
+ * Remove the given range of addresses from the specified map.
  *
- *     Remove the given range of addresses from the specified map.
+ * It is assumed that the start and end are properly rounded to the
+ * page size.
  *
- *     It is assumed that the start and end are properly
- *     rounded to the page size.
+ * This function may not be called from an interrupt if the pmap is
+ * not kernel_pmap.
  *
- *     This function may not be called from an interrupt if the pmap is
- *     not kernel_pmap.
+ * No requirements.
  */
 void
 pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
@@ -1447,9 +1474,12 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
        if (pmap == NULL)
                return;
 
+       lwkt_gettoken(&vm_token);
        KKASSERT(pmap->pm_stats.resident_count >= 0);
-       if (pmap->pm_stats.resident_count == 0)
+       if (pmap->pm_stats.resident_count == 0) {
+               lwkt_reltoken(&vm_token);
                return;
+       }
 
        /*
         * special handling of removing one page.  a very
@@ -1459,6 +1489,7 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
        if (((sva + PAGE_SIZE) == eva) && 
                ((pmap->pm_pdir[(sva >> PDRSHIFT)] & VPTE_PS) == 0)) {
                pmap_remove_page(pmap, sva);
+               lwkt_reltoken(&vm_token);
                return;
        }
 
@@ -1520,15 +1551,16 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
                                break;
                }
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
- * pmap_remove_all:
- *
  * Removes this physical page from all physical maps in which it resides.
  * Reflects back modify bits to the pager.
  *
  * This routine may not be called from an interrupt.
+ *
+ * No requirements.
  */
 static void
 pmap_remove_all(vm_page_t m)
@@ -1547,6 +1579,7 @@ pmap_remove_all(vm_page_t m)
 #endif
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
                KKASSERT(pv->pv_pmap->pm_stats.resident_count > 0);
                --pv->pv_pmap->pm_stats.resident_count;
@@ -1586,17 +1619,18 @@ pmap_remove_all(vm_page_t m)
                free_pv_entry(pv);
        }
        KKASSERT((m->flags & (PG_MAPPED | PG_WRITEABLE)) == 0);
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
 /*
- * pmap_protect:
+ * Set the physical protection on the specified range of this map
+ * as requested.
  *
- *     Set the physical protection on the specified range of this map
- *     as requested.
+ * This function may not be called from an interrupt if the map is
+ * not the kernel_pmap.
  *
- *     This function may not be called from an interrupt if the map is
- *     not the kernel_pmap.
+ * No requirements.
  */
 void
 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
@@ -1618,6 +1652,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
        if (prot & VM_PROT_WRITE)
                return;
 
+       lwkt_gettoken(&vm_token);
        ptbase = get_ptbase(pmap, sva);
 
        sindex = (sva >> PAGE_SHIFT);
@@ -1688,6 +1723,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
                        }
                }
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -1702,6 +1738,8 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
  *
  * NOTE: When entering a page at a KVA address, the pmap must be the
  * kernel_pmap.
+ *
+ * No requirements.
  */
 void
 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
@@ -1718,6 +1756,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
 
        va &= VPTE_FRAME;
 
+       lwkt_gettoken(&vm_token);
+
        /*
         * Get the page table page.   The kernel_pmap's page table pages
         * are preallocated and have no associated vm_page_t.
@@ -1854,6 +1894,7 @@ validate:
                        vm_page_flag_set(m, PG_WRITEABLE);
        }
        KKASSERT((newpte & VPTE_MANAGED) == 0 || m->flags & PG_MAPPED);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -1882,6 +1923,8 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
         */
        ptepindex = va >> PDRSHIFT;
 
+       lwkt_gettoken(&vm_token);
+
        do {
                /*
                 * Get the page directory entry
@@ -1917,6 +1960,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
        pte = pmap_pte(pmap, va);
        if (*pte) {
                pmap_unwire_pte_hold(pmap, mpte);
+               lwkt_reltoken(&vm_token);
                return;
        }
 
@@ -1946,11 +1990,15 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
                *pte = (vpte_t)pa | VPTE_V | VPTE_U | VPTE_MANAGED;
        /*pmap_inval_add(&info, pmap, va); shouldn't be needed 0->valid */
        /*pmap_inval_flush(&info); don't need for vkernel */
+       lwkt_reltoken(&vm_token);
 }
 
 /*
  * Extract the physical address for the translation at the specified
  * virtual address in the pmap.
+ *
+ * The caller must hold vm_token if non-blocking operation is desired.
+ * No requirements.
  */
 vm_paddr_t
 pmap_extract(pmap_t pmap, vm_offset_t va)
@@ -1958,6 +2006,7 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
        vm_paddr_t rtval;
        vpte_t pte;
 
+       lwkt_gettoken(&vm_token);
        if (pmap && (pte = pmap->pm_pdir[va >> SEG_SHIFT]) != 0) {
                if (pte & VPTE_PS) {
                        rtval = pte & ~((vpte_t)(1 << SEG_SHIFT) - 1);
@@ -1966,9 +2015,11 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
                        pte = *get_ptbase(pmap, va);
                        rtval = (pte & VPTE_FRAME) | (va & PAGE_MASK);
                }
-               return(rtval);
+       } else {
+               rtval = 0;
        }
-       return(0);
+       lwkt_reltoken(&vm_token);
+       return(rtval);
 }
 
 #define MAX_INIT_PT (96)
@@ -1977,6 +2028,8 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
  * This routine preloads the ptes for a given object into the specified pmap.
  * This eliminates the blast of soft faults on process startup and
  * immediately after an mmap.
+ *
+ * No requirements.
  */
 static int pmap_object_init_pt_callback(vm_page_t p, void *data);
 
@@ -2035,11 +2088,16 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_prot_t prot,
        info.pmap = pmap;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
                                pmap_object_init_pt_callback, &info);
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
+/*
+ * The caller must hold vm_token.
+ */
 static
 int
 pmap_object_init_pt_callback(vm_page_t p, void *data)
@@ -2073,28 +2131,31 @@ pmap_object_init_pt_callback(vm_page_t p, void *data)
  *
  * Returns FALSE if it would be non-trivial or if a
  * pte is already loaded into the slot.
+ *
+ * No requirements.
  */
 int
 pmap_prefault_ok(pmap_t pmap, vm_offset_t addr)
 {
        vpte_t *pte;
+       int ret;
 
-       if ((*pmap_pde(pmap, addr)) == 0)
-               return(0);
-
-       pte = get_ptbase(pmap, addr);
-       if (*pte)
-               return(0);
-
-       return(1);
+       lwkt_gettoken(&vm_token);
+       if ((*pmap_pde(pmap, addr)) == 0) {
+               ret = 0;
+       } else {
+               pte = get_ptbase(pmap, addr);
+               ret = (*pte) ? 0 : 1;
+       }
+       lwkt_reltoken(&vm_token);
+       return (ret);
 }
 
 /*
- *     Routine:        pmap_change_wiring
- *     Function:       Change the wiring attribute for a map/virtual-address
- *                     pair.
- *     In/out conditions:
- *                     The mapping must already exist in the pmap.
+ * Change the wiring attribute for a map/virtual-address pair.
+ * The mapping must already exist in the pmap.
+ *
+ * No other requirements.
  */
 void
 pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
@@ -2104,6 +2165,7 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
        if (pmap == NULL)
                return;
 
+       lwkt_gettoken(&vm_token);
        pte = get_ptbase(pmap, va);
 
        if (wired && (*pte & VPTE_WIRED) == 0)
@@ -2123,6 +2185,7 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
                atomic_set_long(pte, VPTE_WIRED);
        else
                atomic_clear_long(pte, VPTE_WIRED);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2411,6 +2474,8 @@ pmap_copy_page_frag(vm_paddr_t src, vm_paddr_t dst, size_t bytes)
  * be changed upwards or downwards in the future; it
  * is only necessary that true be returned for a small
  * subset of pmaps for proper page aging.
+ *
+ * No requirements.
  */
 boolean_t
 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
@@ -2422,9 +2487,11 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
                return FALSE;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
 
        TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
                if (pv->pv_pmap == pmap) {
+                       lwkt_reltoken(&vm_token);
                        crit_exit();
                        return TRUE;
                }
@@ -2432,6 +2499,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
                if (loops >= 16)
                        break;
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
        return (FALSE);
 }
@@ -2443,6 +2511,8 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
  * can have the more generic (and slightly slower)
  * mode enabled.  This is much faster than pmap_remove
  * in the case of running down an entire address space.
+ *
+ * No requirements.
  */
 void
 pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
@@ -2453,6 +2523,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
        int32_t save_generation;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
                if (pv->pv_va >= eva || pv->pv_va < sva) {
                        npv = TAILQ_NEXT(pv, pv_plist);
@@ -2509,11 +2580,14 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
                        npv = TAILQ_FIRST(&pmap->pm_pvlist);
                }
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
 /*
  * pmap_testbit tests bits in active mappings of a VM page.
+ *
+ * The caller must hold vm_token
  */
 static boolean_t
 pmap_testbit(vm_page_t m, int bit)
@@ -2561,6 +2635,8 @@ pmap_testbit(vm_page_t m, int bit)
  * handling, in particular (on virtual kernels) the VPTE_M (modify) bit.
  *
  * This routine is only called with certain VPTE_* bit combinations.
+ *
+ * The caller must hold vm_token
  */
 static __inline void
 pmap_clearbit(vm_page_t m, int bit)
@@ -2648,20 +2724,22 @@ pmap_clearbit(vm_page_t m, int bit)
 }
 
 /*
- *      pmap_page_protect:
+ * Lower the permission for all mappings to a given page.
  *
- *      Lower the permission for all mappings to a given page.
+ * No requirements.
  */
 void
 pmap_page_protect(vm_page_t m, vm_prot_t prot)
 {
        if ((prot & VM_PROT_WRITE) == 0) {
+               lwkt_gettoken(&vm_token);
                if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
                        pmap_clearbit(m, VPTE_W);
                        vm_page_flag_clear(m, PG_WRITEABLE);
                } else {
                        pmap_remove_all(m);
                }
+               lwkt_reltoken(&vm_token);
        }
 }
 
@@ -2672,16 +2750,16 @@ pmap_phys_address(vm_pindex_t ppn)
 }
 
 /*
- *     pmap_ts_referenced:
+ * Return a count of reference bits for a page, clearing those bits.
+ * It is not necessary for every reference bit to be cleared, but it
+ * is necessary that 0 only be returned when there are truly no
+ * reference bits set.
  *
- *     Return a count of reference bits for a page, clearing those bits.
- *     It is not necessary for every reference bit to be cleared, but it
- *     is necessary that 0 only be returned when there are truly no
- *     reference bits set.
+ * XXX: The exact number of bits to check and clear is a matter that
+ * should be tested and standardized at some point in the future for
+ * optimal aging of shared pages.
  *
- *     XXX: The exact number of bits to check and clear is a matter that
- *     should be tested and standardized at some point in the future for
- *     optimal aging of shared pages.
+ * No requirements.
  */
 int
 pmap_ts_referenced(vm_page_t m)
@@ -2694,6 +2772,7 @@ pmap_ts_referenced(vm_page_t m)
                return (rtval);
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
 
        if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
 
@@ -2724,41 +2803,53 @@ pmap_ts_referenced(vm_page_t m)
                        }
                } while ((pv = pvn) != NULL && pv != pvf);
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
 
        return (rtval);
 }
 
 /*
- *     pmap_is_modified:
+ * Return whether or not the specified physical page was modified
+ * in any physical maps.
  *
- *     Return whether or not the specified physical page was modified
- *     in any physical maps.
+ * No requirements.
  */
 boolean_t
 pmap_is_modified(vm_page_t m)
 {
-       return pmap_testbit(m, VPTE_M);
+       boolean_t res;
+
+       lwkt_gettoken(&vm_token);
+       res = pmap_testbit(m, VPTE_M);
+       lwkt_reltoken(&vm_token);
+       return (res);
 }
 
 /*
- *     Clear the modify bits on the specified physical page.
+ * Clear the modify bits on the specified physical page.
+ *
+ * No requirements.
  */
 void
 pmap_clear_modify(vm_page_t m)
 {
+       lwkt_gettoken(&vm_token);
        pmap_clearbit(m, VPTE_M);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
- *     pmap_clear_reference:
+ * Clear the reference bit on the specified physical page.
  *
- *     Clear the reference bit on the specified physical page.
+ * No requirements.
  */
 void
 pmap_clear_reference(vm_page_t m)
 {
+       lwkt_gettoken(&vm_token);
        pmap_clearbit(m, VPTE_A);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2835,7 +2926,9 @@ pmap_unmapdev(vm_offset_t va, vm_size_t size)
 #endif
 
 /*
- * perform the pmap work for mincore
+ * Perform the pmap work for mincore
+ *
+ * No requirements.
  */
 int
 pmap_mincore(pmap_t pmap, vm_offset_t addr)
@@ -2843,9 +2936,12 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
        vpte_t *ptep, pte;
        vm_page_t m;
        int val = 0;
+
+       lwkt_gettoken(&vm_token);
        
        ptep = pmap_pte(pmap, addr);
        if (ptep == 0) {
+               lwkt_reltoken(&vm_token);
                return 0;
        }
 
@@ -2854,7 +2950,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
 
                val = MINCORE_INCORE;
                if ((pte & VPTE_MANAGED) == 0)
-                       return val;
+                       goto done;
 
                pa = pte & VPTE_FRAME;
 
@@ -2884,6 +2980,8 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
                        vm_page_flag_set(m, PG_REFERENCED);
                }
        } 
+done:
+       lwkt_reltoken(&vm_token);
        return val;
 }
 
index 89d1d04..b6b3dc6 100644 (file)
@@ -148,8 +148,8 @@ copyin(const void *udaddr, void *kaddr, size_t len)
                len -= n;
                udaddr = (const char *)udaddr + n;
                kaddr = (char *)kaddr + n;
-               vm_page_unhold(m);
                lwbuf_free(lwb);
+               vm_page_unhold(m);
        }
        rel_mplock();
        return (error);
@@ -187,8 +187,8 @@ copyout(const void *kaddr, void *udaddr, size_t len)
                udaddr = (char *)udaddr + n;
                kaddr = (const char *)kaddr + n;
                vm_page_dirty(m);
-               vm_page_unhold(m);
                lwbuf_free(lwb);
+               vm_page_unhold(m);
        }
        rel_mplock();
        return (error);
index c1eb456..d799607 100644 (file)
@@ -1,4 +1,6 @@
 /*
+ * (MPSAFE)
+ *
  * Copyright (c) 1991 Regents of the University of California.
  * Copyright (c) 1994 John S. Dyson
  * Copyright (c) 1994 David Greenman
  */
 
 /*
- *     Manages physical address maps.
- *
- *     In addition to hardware address maps, this
- *     module is called upon to provide software-use-only
- *     maps which may or may not be stored in the same
- *     form as hardware maps.  These pseudo-maps are
- *     used to store intermediate results from copy
- *     operations to and from address spaces.
+ * Manages physical address maps.
  *
- *     Since the information managed by this module is
- *     also stored by the logical address mapping module,
- *     this module may throw away valid virtual-to-physical
- *     mappings at almost any time.  However, invalidations
- *     of virtual-to-physical mappings must be done as
- *     requested.
+ * In most cases the vm_token must be held when manipulating a user pmap
+ * or elements within a vm_page, and the kvm_token must be held when
+ * manipulating the kernel pmap.  Operations on user pmaps may require
+ * additional synchronization.
  *
- *     In order to cope with hardware architectures which
- *     make virtual-to-physical map invalidates expensive,
- *     this module may delay invalidate or reduced protection
- *     operations until such time as they are actually
- *     necessary.  This module is given full information as
- *     to which processors are currently using which maps,
- *     and to when physical maps must be made correct.
+ * In some cases the caller may hold the required tokens to prevent pmap
+ * functions from blocking on those same tokens.  This typically only works
+ * for lookup-style operations.
  */
 
 #if JG
@@ -615,9 +604,9 @@ pmap_track_modified(pmap_t pmap, vm_offset_t va)
 }
 
 /*
- * pmap_extract:
+ * Extract the physical page address associated with the map/VA pair.
  *
- *     Extract the physical page address associated with the map/VA pair.
+ * No requirements.
  */
 vm_paddr_t
 pmap_extract(pmap_t pmap, vm_offset_t va)
@@ -626,6 +615,7 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
        pt_entry_t *pte;
        pd_entry_t pde, *pdep;
 
+       lwkt_gettoken(&vm_token);
        rtval = 0;
        pdep = pmap_pde(pmap, va);
        if (pdep != NULL) {
@@ -640,6 +630,7 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
                        }
                }
        }
+       lwkt_reltoken(&vm_token);
        return rtval;
 }
 
@@ -1108,6 +1099,8 @@ pmap_pinit(struct pmap *pmap)
  * is called by the vmspace dtor function.  A great deal of pmap data is
  * left passively mapped to improve vmspace management so we have a bit
  * of cleanup work to do here.
+ *
+ * No requirements.
  */
 void
 pmap_puninit(pmap_t pmap)
@@ -1115,6 +1108,7 @@ pmap_puninit(pmap_t pmap)
        vm_page_t p;
 
        KKASSERT(pmap->pm_active == 0);
+       lwkt_gettoken(&vm_token);
        if ((p = pmap->pm_pdirm) != NULL) {
                KKASSERT(pmap->pm_pml4 != NULL);
                pmap_kremove((vm_offset_t)pmap->pm_pml4);
@@ -1125,6 +1119,7 @@ pmap_puninit(pmap_t pmap)
                vm_page_free_zero(p);
                pmap->pm_pdirm = NULL;
        }
+       lwkt_reltoken(&vm_token);
        if (pmap->pm_pml4) {
                kmem_free(&kernel_map, (vm_offset_t)pmap->pm_pml4, PAGE_SIZE);
                pmap->pm_pml4 = NULL;
@@ -1142,12 +1137,16 @@ pmap_puninit(pmap_t pmap)
  * then copies the template.
  *
  * In a virtual kernel there are no kernel global address entries.
+ *
+ * No requirements.
  */
 void
 pmap_pinit2(struct pmap *pmap)
 {
        crit_enter();
+       lwkt_gettoken(&vm_token);
        TAILQ_INSERT_TAIL(&pmap_list, pmap, pm_pmnode);
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
@@ -1453,6 +1452,8 @@ pmap_allocpte(pmap_t pmap, vm_offset_t va)
  * Release any resources held by the given physical map.
  * Called when a pmap initialized by pmap_pinit is being released.
  * Should only be called if the map contains no valid mappings.
+ *
+ * No requirements.
  */
 static int pmap_release_callback(struct vm_page *p, void *data);
 
@@ -1472,6 +1473,7 @@ pmap_release(struct pmap *pmap)
        info.pmap = pmap;
        info.object = object;
        crit_enter();
+       lwkt_gettoken(&vm_token);
        TAILQ_REMOVE(&pmap_list, pmap, pm_pmnode);
        crit_exit();
 
@@ -1489,6 +1491,7 @@ pmap_release(struct pmap *pmap)
                }
                crit_exit();
        } while (info.error);
+       lwkt_reltoken(&vm_token);
 }
 
 static int
@@ -1513,8 +1516,9 @@ pmap_release_callback(struct vm_page *p, void *data)
 
 /*
  * Grow the number of kernel page table entries, if needed.
+ *
+ * No requirements.
  */
-
 void
 pmap_growkernel(vm_offset_t addr)
 {
@@ -1525,6 +1529,7 @@ pmap_growkernel(vm_offset_t addr)
        pdp_entry_t newpdp;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        if (kernel_vm_end == 0) {
                kernel_vm_end = KvaStart;
                nkpt = 0;
@@ -1590,37 +1595,42 @@ pmap_growkernel(vm_offset_t addr)
                        break;
                }
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
 /*
- *     Retire the given physical map from service.
- *     Should only be called if the map contains
- *     no valid mappings.
+ * Retire the given physical map from service.  Should only be called
+ * if the map contains no valid mappings.
+ *
+ * No requirements.
  */
 void
 pmap_destroy(pmap_t pmap)
 {
-       int count;
-
        if (pmap == NULL)
                return;
 
-       count = --pmap->pm_count;
-       if (count == 0) {
+       lwkt_gettoken(&vm_token);
+       if (--pmap->pm_count == 0) {
                pmap_release(pmap);
                panic("destroying a pmap is not yet implemented");
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
- *     Add a reference to the specified pmap.
+ * Add a reference to the specified pmap.
+ *
+ * No requirements.
  */
 void
 pmap_reference(pmap_t pmap)
 {
-       if (pmap != NULL) {
-               pmap->pm_count++;
+       if (pmap) {
+               lwkt_gettoken(&vm_token);
+               ++pmap->pm_count;
+               lwkt_reltoken(&vm_token);
        }
 }
 
@@ -1702,6 +1712,8 @@ get_pv_entry(void)
 /*
  * This routine is very drastic, but can save the system
  * in a pinch.
+ *
+ * No requirements.
  */
 void
 pmap_collect(void)
@@ -1712,6 +1724,7 @@ pmap_collect(void)
 
        if (pmap_pagedaemon_waken == 0)
                return;
+       lwkt_gettoken(&vm_token);
        pmap_pagedaemon_waken = 0;
 
        if (warningdone < 5) {
@@ -1726,6 +1739,7 @@ pmap_collect(void)
                        continue;
                pmap_remove_all(m);
        }
+       lwkt_reltoken(&vm_token);
 }
 
 
@@ -1867,15 +1881,15 @@ pmap_remove_page(struct pmap *pmap, vm_offset_t va)
 }
 
 /*
- * pmap_remove:
+ * Remove the given range of addresses from the specified map.
  *
- *     Remove the given range of addresses from the specified map.
+ * It is assumed that the start and end are properly rounded to
+ * the page size.
  *
- *     It is assumed that the start and end are properly
- *     rounded to the page size.
+ * This function may not be called from an interrupt if the pmap is
+ * not kernel_pmap.
  *
- *     This function may not be called from an interrupt if the pmap is
- *     not kernel_pmap.
+ * No requirements.
  */
 void
 pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
@@ -1889,9 +1903,12 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
        if (pmap == NULL)
                return;
 
+       lwkt_gettoken(&vm_token);
        KKASSERT(pmap->pm_stats.resident_count >= 0);
-       if (pmap->pm_stats.resident_count == 0)
+       if (pmap->pm_stats.resident_count == 0) {
+               lwkt_reltoken(&vm_token);
                return;
+       }
 
        /*
         * special handling of removing one page.  a very
@@ -1902,6 +1919,7 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
                pde = pmap_pde(pmap, sva);
                if (pde && (*pde & VPTE_PS) == 0) {
                        pmap_remove_page(pmap, sva);
+                       lwkt_reltoken(&vm_token);
                        return;
                }
        }
@@ -1969,15 +1987,16 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
                                break;
                }
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
- * pmap_remove_all:
+ * Removes this physical page from all physical maps in which it resides.
+ * Reflects back modify bits to the pager.
  *
- *     Removes this physical page from all physical maps in which it resides.
- *     Reflects back modify bits to the pager.
+ * This routine may not be called from an interrupt.
  *
- *     This routine may not be called from an interrupt.
+ * No requirements.
  */
 
 static void
@@ -1997,6 +2016,7 @@ pmap_remove_all(vm_page_t m)
 #endif
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
                KKASSERT(pv->pv_pmap->pm_stats.resident_count > 0);
                --pv->pv_pmap->pm_stats.resident_count;
@@ -2037,17 +2057,18 @@ pmap_remove_all(vm_page_t m)
                free_pv_entry(pv);
        }
        KKASSERT((m->flags & (PG_MAPPED|PG_WRITEABLE)) == 0);
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
 /*
- * pmap_protect:
+ * Set the physical protection on the specified range of this map
+ * as requested.
  *
- *     Set the physical protection on the specified range of this map
- *     as requested.
+ * This function may not be called from an interrupt if the map is
+ * not the kernel_pmap.
  *
- *     This function may not be called from an interrupt if the map is
- *     not the kernel_pmap.
+ * No requirements.
  */
 void
 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
@@ -2071,6 +2092,8 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
        if (prot & VM_PROT_WRITE)
                return;
 
+       lwkt_gettoken(&vm_token);
+
        for (; sva < eva; sva = va_next) {
 
                pml4e = pmap_pml4e(pmap, sva);
@@ -2148,6 +2171,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
                        }
                }
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2162,6 +2186,8 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
  *
  * NOTE: When entering a page at a KVA address, the pmap must be the
  * kernel_pmap.
+ *
+ * No requirements.
  */
 void
 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
@@ -2179,6 +2205,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
 
        va = trunc_page(va);
 
+       lwkt_gettoken(&vm_token);
+
        /*
         * Get the page table page.   The kernel_pmap's page table pages
         * are preallocated and have no associated vm_page_t.
@@ -2193,8 +2221,9 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
                if ((*pde & VPTE_PS) != 0)
                        panic("pmap_enter: attempted pmap_enter on 2MB page");
                pte = pmap_pde_to_pte(pde, va);
-       } else
+       } else {
                panic("pmap_enter: invalid page directory va=%#lx", va);
+       }
 
        KKASSERT(pte != NULL);
        /*
@@ -2305,12 +2334,15 @@ validate:
                        vm_page_flag_set(m, PG_WRITEABLE);
        }
        KKASSERT((newpte & VPTE_MANAGED) == 0 || (m->flags & PG_MAPPED));
+       lwkt_reltoken(&vm_token);
 }
 
 /*
  * This code works like pmap_enter() but assumes VM_PROT_READ and not-wired.
  *
  * Currently this routine may only be used on user pmaps, not kernel_pmap.
+ *
+ * No requirements.
  */
 void
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
@@ -2330,6 +2362,8 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
         */
        ptepindex = pmap_pde_pindex(va);
 
+       lwkt_gettoken(&vm_token);
+
        do {
                /*
                 * Get the page directory entry
@@ -2368,6 +2402,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
                pmap_unwire_pte_hold(pmap, va, mpte);
                pa = VM_PAGE_TO_PHYS(m);
                KKASSERT(((*pte ^ pa) & VPTE_FRAME) == 0);
+               lwkt_reltoken(&vm_token);
                return;
        }
 
@@ -2395,6 +2430,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
                *pte = (vpte_t)pa | VPTE_V | VPTE_U | VPTE_MANAGED;
        /*pmap_inval_add(&info, pmap, va); shouldn't be needed 0->valid */
        /*pmap_inval_flush(&info); don't need for vkernel */
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2414,6 +2450,8 @@ pmap_kenter_temporary(vm_paddr_t pa, int i)
  * This routine preloads the ptes for a given object into the specified pmap.
  * This eliminates the blast of soft faults on process startup and
  * immediately after an mmap.
+ *
+ * No requirements.
  */
 static int pmap_object_init_pt_callback(vm_page_t p, void *data);
 
@@ -2472,8 +2510,10 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_prot_t prot,
        info.pmap = pmap;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
                                pmap_object_init_pt_callback, &info);
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
@@ -2510,30 +2550,33 @@ pmap_object_init_pt_callback(vm_page_t p, void *data)
  *
  * Returns FALSE if it would be non-trivial or if a
  * pte is already loaded into the slot.
+ *
+ * No requirements.
  */
 int
 pmap_prefault_ok(pmap_t pmap, vm_offset_t addr)
 {
        pt_entry_t *pte;
        pd_entry_t *pde;
+       int ret;
 
+       lwkt_gettoken(&vm_token);
        pde = pmap_pde(pmap, addr);
-       if (pde == NULL || *pde == 0)
-               return(0);
-
-       pte = pmap_pde_to_pte(pde, addr);
-       if (*pte)
-               return(0);
-
-       return(1);
+       if (pde == NULL || *pde == 0) {
+               ret = 0;
+       } else {
+               pte = pmap_pde_to_pte(pde, addr);
+               ret = (*pte) ? 0 : 1;
+       }
+       lwkt_reltoken(&vm_token);
+       return (ret);
 }
 
 /*
- *     Routine:        pmap_change_wiring
- *     Function:       Change the wiring attribute for a map/virtual-address
- *                     pair.
- *     In/out conditions:
- *                     The mapping must already exist in the pmap.
+ * Change the wiring attribute for a map/virtual-address pair.
+ *
+ * The mapping must already exist in the pmap.
+ * No other requirements.
  */
 void
 pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
@@ -2543,6 +2586,7 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
        if (pmap == NULL)
                return;
 
+       lwkt_gettoken(&vm_token);
        pte = pmap_pte(pmap, va);
 
        if (wired && !pmap_pte_w(pte))
@@ -2561,6 +2605,7 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
                atomic_set_long(pte, VPTE_WIRED);
        else
                atomic_clear_long(pte, VPTE_WIRED);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -2680,11 +2725,12 @@ pmap_copy_page_frag(vm_paddr_t src, vm_paddr_t dst, size_t bytes)
 }
 
 /*
- * Returns true if the pmap's pv is one of the first
- * 16 pvs linked to from this page.  This count may
- * be changed upwards or downwards in the future; it
- * is only necessary that true be returned for a small
+ * Returns true if the pmap's pv is one of the first 16 pvs linked to
+ * from this page.  This count may be changed upwards or downwards
+ * in the future; it is only necessary that true be returned for a small
  * subset of pmaps for proper page aging.
+ *
+ * No other requirements.
  */
 boolean_t
 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
@@ -2696,9 +2742,11 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
                return FALSE;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
 
        TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
                if (pv->pv_pmap == pmap) {
+                       lwkt_reltoken(&vm_token);
                        crit_exit();
                        return TRUE;
                }
@@ -2706,17 +2754,19 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
                if (loops >= 16)
                        break;
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
        return (FALSE);
 }
 
 /*
- * Remove all pages from specified address space
- * this aids process exit speeds.  Also, this code
- * is special cased for current process only, but
- * can have the more generic (and slightly slower)
- * mode enabled.  This is much faster than pmap_remove
- * in the case of running down an entire address space.
+ * Remove all pages from specified address space this aids process
+ * exit speeds.  Also, this code is special cased for current
+ * process only, but can have the more generic (and slightly slower)
+ * mode enabled.  This is much faster than pmap_remove in the case
+ * of running down an entire address space.
+ *
+ * No other requirements.
  */
 void
 pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
@@ -2727,6 +2777,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
        int save_generation;
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
        for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
                if (pv->pv_va >= eva || pv->pv_va < sva) {
                        npv = TAILQ_NEXT(pv, pv_plist);
@@ -2783,6 +2834,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
                        npv = TAILQ_FIRST(&pmap->pm_pvlist);
                }
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
 }
 
@@ -2922,21 +2974,23 @@ pmap_clearbit(vm_page_t m, int bit)
 }
 
 /*
- *      pmap_page_protect:
+ * Lower the permission for all mappings to a given page.
  *
- *      Lower the permission for all mappings to a given page.
+ * No other requirements.
  */
 void
 pmap_page_protect(vm_page_t m, vm_prot_t prot)
 {
        /* JG NX support? */
        if ((prot & VM_PROT_WRITE) == 0) {
+               lwkt_gettoken(&vm_token);
                if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
                        pmap_clearbit(m, VPTE_W);
                        vm_page_flag_clear(m, PG_WRITEABLE);
                } else {
                        pmap_remove_all(m);
                }
+               lwkt_reltoken(&vm_token);
        }
 }
 
@@ -2947,16 +3001,16 @@ pmap_phys_address(vm_pindex_t ppn)
 }
 
 /*
- *     pmap_ts_referenced:
+ * Return a count of reference bits for a page, clearing those bits.
+ * It is not necessary for every reference bit to be cleared, but it
+ * is necessary that 0 only be returned when there are truly no
+ * reference bits set.
  *
- *     Return a count of reference bits for a page, clearing those bits.
- *     It is not necessary for every reference bit to be cleared, but it
- *     is necessary that 0 only be returned when there are truly no
- *     reference bits set.
+ * XXX: The exact number of bits to check and clear is a matter that
+ * should be tested and standardized at some point in the future for
+ * optimal aging of shared pages.
  *
- *     XXX: The exact number of bits to check and clear is a matter that
- *     should be tested and standardized at some point in the future for
- *     optimal aging of shared pages.
+ * No other requirements.
  */
 int
 pmap_ts_referenced(vm_page_t m)
@@ -2969,6 +3023,7 @@ pmap_ts_referenced(vm_page_t m)
                return (rtval);
 
        crit_enter();
+       lwkt_gettoken(&vm_token);
 
        if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
 
@@ -2999,41 +3054,53 @@ pmap_ts_referenced(vm_page_t m)
                        }
                } while ((pv = pvn) != NULL && pv != pvf);
        }
+       lwkt_reltoken(&vm_token);
        crit_exit();
 
        return (rtval);
 }
 
 /*
- *     pmap_is_modified:
+ * Return whether or not the specified physical page was modified
+ * in any physical maps.
  *
- *     Return whether or not the specified physical page was modified
- *     in any physical maps.
+ * No other requirements.
  */
 boolean_t
 pmap_is_modified(vm_page_t m)
 {
-       return pmap_testbit(m, VPTE_M);
+       boolean_t res;
+
+       lwkt_gettoken(&vm_token);
+       res = pmap_testbit(m, VPTE_M);
+       lwkt_reltoken(&vm_token);
+       return (res);
 }
 
 /*
- *     Clear the modify bits on the specified physical page.
+ * Clear the modify bits on the specified physical page.
+ *
+ * No other requirements.
  */
 void
 pmap_clear_modify(vm_page_t m)
 {
+       lwkt_gettoken(&vm_token);
        pmap_clearbit(m, VPTE_M);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
- *     pmap_clear_reference:
+ * Clear the reference bit on the specified physical page.
  *
- *     Clear the reference bit on the specified physical page.
+ * No other requirements.
  */
 void
 pmap_clear_reference(vm_page_t m)
 {
+       lwkt_gettoken(&vm_token);
        pmap_clearbit(m, VPTE_A);
+       lwkt_reltoken(&vm_token);
 }
 
 /*
@@ -3058,7 +3125,9 @@ i386_protection_init(void)
 }
 
 /*
- * perform the pmap work for mincore
+ * Perform the pmap work for mincore
+ *
+ * No other requirements.
  */
 int
 pmap_mincore(pmap_t pmap, vm_offset_t addr)
@@ -3067,17 +3136,15 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
        vm_page_t m;
        int val = 0;
 
+       lwkt_gettoken(&vm_token);
        ptep = pmap_pte(pmap, addr);
-       if (ptep == 0) {
-               return 0;
-       }
 
-       if ((pte = *ptep) != 0) {
+       if (ptep && (pte = *ptep) != 0) {
                vm_paddr_t pa;
 
                val = MINCORE_INCORE;
                if ((pte & VPTE_MANAGED) == 0)
-                       return val;
+                       goto done;
 
                pa = pte & VPTE_FRAME;
 
@@ -3107,6 +3174,8 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
                        vm_page_flag_set(m, PG_REFERENCED);
                }
        }
+done:
+       lwkt_reltoken(&vm_token);
        return val;
 }
 
index cd8abd1..c5e4c43 100644 (file)
@@ -201,8 +201,8 @@ int kvasnrprintf (char **, size_t, int, const char *,
 int     kvsprintf (char *buf, const char *,
                        __va_list) __printflike(2, 0);
 int    ttyprintf (struct tty *, const char *, ...) __printflike(2, 3);
-int    ksscanf (const char *, char const *, ...);
-int    kvsscanf (const char *, char const *, __va_list);
+int    ksscanf (const char *, char const *, ...) __scanflike(2, 3);
+int    kvsscanf (const char *, char const *, __va_list) __scanflike(2, 0);
 void   kvasfree(char **);
 
 long   strtol (const char *, char **, int);
index 3aea6ef..05d904e 100644 (file)
@@ -460,7 +460,6 @@ devfs_unlinkp(struct devfs_node *node)
        if (parent)     {
                TAILQ_REMOVE(DEVFS_DENODE_HEAD(parent), node, link);
                parent->nchildren--;
-               KKASSERT((parent->nchildren >= 0));
                node->flags &= ~DEVFS_NODE_LINKED;
        }
        /* hotplug handler */
index f62a6ea..d043c08 100644 (file)
@@ -150,9 +150,7 @@ procfs_rwmem(struct proc *curp, struct proc *p, struct uio *uio)
                /*
                 * release the page and we are done
                 */
-               crit_enter();
                vm_page_unhold(m);
-               crit_exit();
        } while (error == 0 && uio->uio_resid > 0);
 
        kmem_free(&kernel_map, kva, PAGE_SIZE);
index ba971e2..5587480 100644 (file)
@@ -210,10 +210,12 @@ dev_pager_getpage(vm_object_t object, vm_page_t *mpp, int seqaccess)
                page = dev_pager_getfake(paddr);
                TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist,
                                  page, pageq);
+               lwkt_gettoken(&vm_token);
                crit_enter();
                vm_page_free(*mpp);
                vm_page_insert(page, object, offset);
                crit_exit();
+               lwkt_reltoken(&vm_token);
        }
        mtx_unlock(&dev_pager_mtx);
        return (VM_PAGER_OK);
index 07f3727..4656384 100644 (file)
@@ -81,6 +81,7 @@ phys_pager_getpage(vm_object_t object, vm_page_t *mpp, int seqaccess)
 {
        vm_page_t m = *mpp;
 
+       lwkt_gettoken(&vm_token);
        crit_enter();
        if ((m->flags & PG_ZERO) == 0)
                vm_page_zero_fill(m);
@@ -90,6 +91,7 @@ phys_pager_getpage(vm_object_t object, vm_page_t *mpp, int seqaccess)
        m->valid = VM_PAGE_BITS_ALL;
        m->dirty = 0;
        crit_exit();
+       lwkt_reltoken(&vm_token);
 
        return (VM_PAGER_OK);
 }
index 1b228cb..54d0dd8 100644 (file)
@@ -636,6 +636,7 @@ RetryFault:
         * (so we don't want to lose the fact that the page will be dirtied
         * if a write fault was specified).
         */
+       lwkt_gettoken(&vm_token);
        vm_page_hold(fs.m);
        vm_page_flag_clear(fs.m, PG_ZERO);
        if (fault_type & VM_PROT_WRITE)
@@ -653,7 +654,6 @@ RetryFault:
         * Unbusy the page by activating it.  It remains held and will not
         * be reclaimed.
         */
-       lwkt_gettoken(&vm_token);
        vm_page_activate(fs.m);
 
        if (curthread->td_lwp) {
index 953ef3e..048fde0 100644 (file)
@@ -350,26 +350,51 @@ rb_vm_page_compare(struct vm_page *p1, struct vm_page *p2)
        return(0);
 }
 
+/*
+ * Holding a page keeps it from being reused.  Other parts of the system
+ * can still disassociate the page from its current object and free it, or
+ * perform read or write I/O on it and/or otherwise manipulate the page,
+ * but if the page is held the VM system will leave the page and its data
+ * intact and not reuse the page for other purposes until the last hold
+ * reference is released.  (see vm_page_wire() if you want to prevent the
+ * page from being disassociated from its object too).
+ *
+ * The caller must hold vm_token.
+ *
+ * The caller must still validate the contents of the page and, if necessary,
+ * wait for any pending I/O (e.g. vm_page_sleep_busy() loop) to complete
+ * before manipulating the page.
+ */
+void
+vm_page_hold(vm_page_t m)
+{
+       ASSERT_LWKT_TOKEN_HELD(&vm_token);
+       ++m->hold_count;
+}
+
 /*
  * The opposite of vm_page_hold().  A page can be freed while being held,
  * which places it on the PQ_HOLD queue.  We must call vm_page_free_toq()
  * in this case to actually free it once the hold count drops to 0.
  *
- * This routine must be called at splvm().
+ * The caller must hold vm_token if non-blocking operation is desired,
+ * but otherwise does not need to.
  */
 void
-vm_page_unhold(vm_page_t mem)
+vm_page_unhold(vm_page_t m)
 {
-       --mem->hold_count;
-       KASSERT(mem->hold_count >= 0, ("vm_page_unhold: hold count < 0!!!"));
-       if (mem->hold_count == 0 && mem->queue == PQ_HOLD) {
-               vm_page_busy(mem);
-               vm_page_free_toq(mem);
+       lwkt_gettoken(&vm_token);
+       --m->hold_count;
+       KASSERT(m->hold_count >= 0, ("vm_page_unhold: hold count < 0!!!"));
+       if (m->hold_count == 0 && m->queue == PQ_HOLD) {
+               vm_page_busy(m);
+               vm_page_free_toq(m);
        }
+       lwkt_reltoken(&vm_token);
 }
 
 /*
- * Inserts the given mem entry into the object and object list.
+ * Inserts the given vm_page into the object and object list.
  *
  * The pagetables are not updated but will presumably fault the page
  * in if necessary, or if a kernel page the caller will at some point
@@ -377,12 +402,14 @@ vm_page_unhold(vm_page_t mem)
  * here so we *can't* do this anyway.
  *
  * This routine may not block.
+ * This routine must be called with the vm_token held.
  * This routine must be called with a critical section held.
  */
 void
 vm_page_insert(vm_page_t m, vm_object_t object, vm_pindex_t pindex)
 {
        ASSERT_IN_CRIT_SECTION();
+       ASSERT_LWKT_TOKEN_HELD(&vm_token);
        if (m->object != NULL)
                panic("vm_page_insert: already inserted");
 
@@ -465,16 +492,7 @@ vm_page_remove(vm_page_t m)
  * Locate and return the page at (object, pindex), or NULL if the
  * page could not be found.
  *
- * This routine will operate properly without spl protection, but
- * the returned page could be in flux if it is busy.  Because an
- * interrupt can race a caller's busy check (unbusying and freeing the
- * page we return before the caller is able to check the busy bit),
- * the caller should generally call this routine with a critical
- * section held.
- *
- * Callers may call this routine without spl protection if they know
- * 'for sure' that the page will not be ripped out from under them
- * by an interrupt.
+ * The caller must hold vm_token if non-blocking operation is desired.
  */
 vm_page_t
 vm_page_lookup(vm_object_t object, vm_pindex_t pindex)
@@ -537,7 +555,7 @@ vm_page_rename(vm_page_t m, vm_object_t new_object, vm_pindex_t new_pindex)
  * is being moved between queues or otherwise is to remain BUSYied by the
  * caller.
  *
- * This routine must be called at splhigh().
+ * The caller must hold vm_token
  * This routine may not block.
  */
 void
@@ -546,6 +564,7 @@ vm_page_unqueue_nowakeup(vm_page_t m)
        int queue = m->queue;
        struct vpgqueues *pq;
 
+       ASSERT_LWKT_TOKEN_HELD(&vm_token);
        if (queue != PQ_NONE) {
                pq = &vm_page_queues[queue];
                m->queue = PQ_NONE;
@@ -559,7 +578,7 @@ vm_page_unqueue_nowakeup(vm_page_t m)
  * vm_page_unqueue() - Remove a page from its queue, wakeup the pagedemon
  * if necessary.
  *
- * This routine must be called at splhigh().
+ * The caller must hold vm_token
  * This routine may not block.
  */
 void
@@ -568,6 +587,7 @@ vm_page_unqueue(vm_page_t m)
        int queue = m->queue;
        struct vpgqueues *pq;
 
+       ASSERT_LWKT_TOKEN_HELD(&vm_token);
        if (queue != PQ_NONE) {
                m->queue = PQ_NONE;
                pq = &vm_page_queues[queue];
@@ -589,7 +609,7 @@ vm_page_unqueue(vm_page_t m)
  * caches.  We need this optimization because cpu caches tend to be
  * physical caches, while object spaces tend to be virtual.
  *
- * This routine must be called at splvm().
+ * Must be called with vm_token held.
  * This routine may not block.
  *
  * Note that this routine is carefully inlined.  A non-inlined version
@@ -636,6 +656,10 @@ _vm_page_list_find2(int basequeue, int index)
        return(m);
 }
 
+/*
+ * Must be called with vm_token held if the caller desired non-blocking
+ * operation and a stable result.
+ */
 vm_page_t
 vm_page_list_find(int basequeue, int index, boolean_t prefer_zero)
 {
@@ -647,14 +671,15 @@ vm_page_list_find(int basequeue, int index, boolean_t prefer_zero)
  * might be found, but not applicable, they are deactivated.  This
  * keeps us from using potentially busy cached pages.
  *
- * This routine must be called with a critical section held.
  * This routine may not block.
+ * Must be called with vm_token held.
  */
 vm_page_t
 vm_page_select_cache(vm_object_t object, vm_pindex_t pindex)
 {
        vm_page_t m;
 
+       ASSERT_LWKT_TOKEN_HELD(&vm_token);
        while (TRUE) {
                m = _vm_page_list_find(
                    PQ_CACHE,
@@ -1137,11 +1162,13 @@ vm_page_free_fromq_fast(void)
  * mappings.
  *
  * Must be called with a critical section held.
+ * Must be called with vm_token held.
  */
 void
 vm_page_unmanage(vm_page_t m)
 {
        ASSERT_IN_CRIT_SECTION();
+       ASSERT_LWKT_TOKEN_HELD(&vm_token);
        if ((m->flags & PG_UNMANAGED) == 0) {
                if (m->wire_count == 0)
                        vm_page_unqueue(m);
@@ -1251,6 +1278,7 @@ vm_page_unwire(vm_page_t m, int activate)
  * except without unmapping it from the process address space.
  *
  * This routine may not block.
+ * The caller must hold vm_token.
  */
 static __inline void
 _vm_page_deactivate(vm_page_t m, int athead)
@@ -1280,20 +1308,26 @@ _vm_page_deactivate(vm_page_t m, int athead)
        }
 }
 
+/*
+ * Attempt to deactivate a page.
+ *
+ * No requirements.
+ */
 void
 vm_page_deactivate(vm_page_t m)
 {
-    crit_enter();
-    lwkt_gettoken(&vm_token);
-    _vm_page_deactivate(m, 0);
-    lwkt_reltoken(&vm_token);
-    crit_exit();
+       crit_enter();
+       lwkt_gettoken(&vm_token);
+       _vm_page_deactivate(m, 0);
+       lwkt_reltoken(&vm_token);
+       crit_exit();
 }
 
 /*
- * vm_page_try_to_cache:
- *
+ * Attempt to move a page to PQ_CACHE.
  * Returns 0 on failure, 1 on success
+ *
+ * No requirements.
  */
 int
 vm_page_try_to_cache(vm_page_t m)
@@ -1321,6 +1355,8 @@ vm_page_try_to_cache(vm_page_t m)
 /*
  * Attempt to free the page.  If we cannot free it, we do nothing.
  * 1 is returned on success, 0 on failure.
+ *
+ * No requirements.
  */
 int
 vm_page_try_to_free(vm_page_t m)
@@ -1352,12 +1388,14 @@ vm_page_try_to_free(vm_page_t m)
  *
  * Put the specified page onto the page cache queue (if appropriate).
  *
+ * The caller must hold vm_token.
  * This routine may not block.
  */
 void
 vm_page_cache(vm_page_t m)
 {
        ASSERT_IN_CRIT_SECTION();
+       ASSERT_LWKT_TOKEN_HELD(&vm_token);
 
        if ((m->flags & (PG_BUSY|PG_UNMANAGED)) || m->busy ||
                        m->wire_count || m->hold_count) {
@@ -1427,6 +1465,8 @@ vm_page_cache(vm_page_t m)
  * system to balance the queues, potentially recovering other unrelated
  * space from active.  The idea is to not force this to happen too
  * often.
+ *
+ * No requirements.
  */
 void
 vm_page_dontneed(vm_page_t m)
@@ -1490,6 +1530,8 @@ vm_page_dontneed(vm_page_t m)
  * This routine may be called from mainline code without spl protection and
  * be guarenteed a busied page associated with the object at the specified
  * index.
+ *
+ * No requirements.
  */
 vm_page_t
 vm_page_grab(vm_object_t object, vm_pindex_t pindex, int allocflags)
@@ -1539,8 +1581,11 @@ done:
  * a page.  May not block.
  *
  * Inputs are required to range within a page.
+ *
+ * No requirements.
+ * Non blocking.
  */
-__inline int
+int
 vm_page_bits(int base, int size)
 {
        int first_bit;
@@ -1629,6 +1674,9 @@ _vm_page_zero_valid(vm_page_t m, int base, int size)
  * We set valid bits inclusive of any overlap, but we can only
  * clear dirty bits for DEV_BSIZE chunks that are fully within
  * the range.
+ *
+ * Page must be busied?
+ * No other requirements.
  */
 void
 vm_page_set_valid(vm_page_t m, int base, int size)
@@ -1644,6 +1692,9 @@ vm_page_set_valid(vm_page_t m, int base, int size)
  * NOTE: This function does not clear the pmap modified bit.
  *      Also note that e.g. NFS may use a byte-granular base
  *      and size.
+ *
+ * Page must be busied?
+ * No other requirements.
  */
 void
 vm_page_set_validclean(vm_page_t m, int base, int size)
@@ -1662,6 +1713,9 @@ vm_page_set_validclean(vm_page_t m, int base, int size)
 
 /*
  * Set valid & dirty.  Used by buwrite()
+ *
+ * Page must be busied?
+ * No other requirements.
  */
 void
 vm_page_set_validdirty(vm_page_t m, int base, int size)
@@ -1681,6 +1735,9 @@ vm_page_set_validdirty(vm_page_t m, int base, int size)
  * NOTE: This function does not clear the pmap modified bit.
  *      Also note that e.g. NFS may use a byte-granular base
  *      and size.
+ *
+ * Page must be busied?
+ * No other requirements.
  */
 void
 vm_page_clear_dirty(vm_page_t m, int base, int size)
@@ -1697,6 +1754,9 @@ vm_page_clear_dirty(vm_page_t m, int base, int size)
  *
  * Also make sure the related object and vnode reflect the fact that the
  * object may now contain a dirty page.
+ *
+ * Page must be busied?
+ * No other requirements.
  */
 void
 vm_page_dirty(vm_page_t m)
@@ -1717,7 +1777,9 @@ vm_page_dirty(vm_page_t m)
  * Invalidates DEV_BSIZE'd chunks within a page.  Both the
  * valid and dirty bits for the effected areas are cleared.
  *
- * May not block.
+ * Page must be busied?
+ * Does not block.
+ * No other requirements.
  */
 void
 vm_page_set_invalid(vm_page_t m, int base, int size)
@@ -1738,6 +1800,9 @@ vm_page_set_invalid(vm_page_t m, int base, int size)
  *
  * Pages are most often semi-valid when the end of a file is mapped 
  * into memory and the file's size is not page aligned.
+ *
+ * Page must be busied?
+ * No other requirements.
  */
 void
 vm_page_zero_invalid(vm_page_t m, boolean_t setvalid)
@@ -1780,7 +1845,8 @@ vm_page_zero_invalid(vm_page_t m, boolean_t setvalid)
  * will return FALSE in the degenerate case where the page is entirely
  * invalid, and TRUE otherwise.
  *
- * May not block.
+ * Does not block.
+ * No other requirements.
  */
 int
 vm_page_is_valid(vm_page_t m, int base, int size)
@@ -1795,6 +1861,9 @@ vm_page_is_valid(vm_page_t m, int base, int size)
 
 /*
  * update dirty bits from pmap/mmu.  May not block.
+ *
+ * Caller must hold vm_token if non-blocking operation desired.
+ * No other requirements.
  */
 void
 vm_page_test_dirty(vm_page_t m)
index 50d25e1..ee7a3a5 100644 (file)
@@ -405,6 +405,7 @@ vm_page_flag_clear(vm_page_t m, unsigned int bits)
 static __inline void
 vm_page_busy(vm_page_t m)
 {
+       ASSERT_LWKT_TOKEN_HELD(&vm_token);
        KASSERT((m->flags & PG_BUSY) == 0, 
                ("vm_page_busy: page already busy!!!"));
        vm_page_flag_set(m, PG_BUSY);
@@ -484,7 +485,8 @@ vm_page_io_finish(vm_page_t m)
 #define        VM_ALLOC_QUICK          0x10    /* like NORMAL but do not use cache */
 #define        VM_ALLOC_RETRY          0x80    /* indefinite block (vm_page_grab()) */
 
-void vm_page_unhold(vm_page_t mem);
+void vm_page_hold(vm_page_t);
+void vm_page_unhold(vm_page_t);
 void vm_page_activate (vm_page_t);
 vm_page_t vm_page_alloc (struct vm_object *, vm_pindex_t, int);
 vm_page_t vm_page_grab (struct vm_object *, vm_pindex_t, int);
@@ -522,27 +524,6 @@ void vm_contig_pg_free(int, u_long);
 void vm_page_event_internal(vm_page_t, vm_page_event_t);
 void vm_page_dirty(vm_page_t m);
 
-/*
- * Holding a page keeps it from being reused.  Other parts of the system
- * can still disassociate the page from its current object and free it, or
- * perform read or write I/O on it and/or otherwise manipulate the page,
- * but if the page is held the VM system will leave the page and its data
- * intact and not reuse the page for other purposes until the last hold
- * reference is released.  (see vm_page_wire() if you want to prevent the
- * page from being disassociated from its object too).
- *
- * This routine must be called while at splvm() or better.
- *
- * The caller must still validate the contents of the page and, if necessary,
- * wait for any pending I/O (e.g. vm_page_sleep_busy() loop) to complete
- * before manipulating the page.
- */
-static __inline void
-vm_page_hold(vm_page_t mem)
-{
-       mem->hold_count++;
-}
-
 /*
  * Reduce the protection of a page.  This routine never raises the 
  * protection and therefore can be safely called if the page is already
index 7c05876..3d46c31 100644 (file)
@@ -159,8 +159,11 @@ vm_pagezero(void __unused *arg)
         * priority.
         *
         * Also put us on the last cpu for now.
+        *
+        * For now leave the MP lock held, the VM routines cannot be called
+        * with it released until tokenization is finished.
         */
-       rel_mplock();
+       /* rel_mplock(); */
        lwkt_setpri_self(TDPRI_IDLE_WORK);
        lwkt_setcpu_self(globaldata_find(ncpus - 1));
        sleep_time = DEFAULT_SLEEP_TIME;